uphpmvault/0000775000000000000000000000000011604127521010152 5ustar uphpmvault/uphpmvault.80000664000000000000000000000210211033555540012445 0ustar .TH uphpmvault 8 4-July-2008 "Debian GNU/Linux" .SH NAME uphpmvault \- upload recovery images to HP MediaVault2 via Ethernet .SH SYNOPSIS .B uphpmvault [\fIOPTION\fR...] \fIIMAGE_FILE\fR .SH DESCRIPTION .PP Transmit the recovery file IMAGE to an HP MediaVault2 waiting for recovery. .TP \fB\-q\fR, \fB\-\-quiet\fR suppress program output .PP The HP MediaVault--generation 2 a.k.a MV2--implements a custom recovery protocol for rescuing a device when the operating system image is corrupt. The \fBuphpmvault\fR application listens for broadcast Ethernet packets from an MV2 devices that is waiting for recovery. On receipt of one of these \fIbeacon\fR packets, \fBuphpmvault\fR transmits the recovery file \fIIMAGE\fR to the waiting device which will automatically boot the recovery image. .SH AUTHOR Written by Marc Singer .SH COPYRIGHT Copyright \(co 2008 Marc Singer .PP License GPLv2: GNU GPL version 2 .br This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. uphpmvault/.git/0000775000000000000000000000000011604127336011017 5ustar uphpmvault/.git/hooks/0000775000000000000000000000000011025616626012144 5ustar uphpmvault/.git/hooks/post-commit0000664000000000000000000000023011025616626014335 0ustar #!/bin/sh # # An example hook script that is called after a successful # commit is made. # # To enable this hook, make this file executable. : Nothing uphpmvault/.git/hooks/pre-commit0000664000000000000000000000325211025616626014145 0ustar #!/bin/sh # # An example hook script to verify what is about to be committed. # Called by git-commit with no arguments. The hook should # exit with non-zero status after issuing an appropriate message if # it wants to stop the commit. # # To enable this hook, make this file executable. # This is slightly modified from Andrew Morton's Perfect Patch. # Lines you introduce should not have trailing whitespace. # Also check for an indentation that has SP before a TAB. if git-rev-parse --verify HEAD 2>/dev/null then git-diff-index -p -M --cached HEAD -- else # NEEDSWORK: we should produce a diff with an empty tree here # if we want to do the same verification for the initial import. : fi | perl -e ' my $found_bad = 0; my $filename; my $reported_filename = ""; my $lineno; sub bad_line { my ($why, $line) = @_; if (!$found_bad) { print STDERR "*\n"; print STDERR "* You have some suspicious patch lines:\n"; print STDERR "*\n"; $found_bad = 1; } if ($reported_filename ne $filename) { print STDERR "* In $filename\n"; $reported_filename = $filename; } print STDERR "* $why (line $lineno)\n"; print STDERR "$filename:$lineno:$line\n"; } while (<>) { if (m|^diff --git a/(.*) b/\1$|) { $filename = $1; next; } if (/^@@ -\S+ \+(\d+)/) { $lineno = $1 - 1; next; } if (/^ /) { $lineno++; next; } if (s/^\+//) { $lineno++; chomp; if (/\s$/) { bad_line("trailing whitespace", $_); } if (/^\s* \t/) { bad_line("indent SP followed by a TAB", $_); } if (/^([<>])\1{6} |^={7}$/) { bad_line("unresolved merge conflict", $_); } } } exit($found_bad); ' uphpmvault/.git/hooks/post-receive0000664000000000000000000000077611025616626014506 0ustar #!/bin/sh # # An example hook script for the post-receive event # # This script is run after receive-pack has accepted a pack and the # repository has been updated. It is passed arguments in through stdin # in the form # # For example: # aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master # # see contrib/hooks/ for an sample, or uncomment the next line (on debian) # #. /usr/share/doc/git-core/contrib/hooks/post-receive-email uphpmvault/.git/hooks/update0000664000000000000000000000553611025616626013362 0ustar #!/bin/sh # # An example hook script to blocks unannotated tags from entering. # Called by git-receive-pack with arguments: refname sha1-old sha1-new # # To enable this hook, make this file executable by "chmod +x update". # # Config # ------ # hooks.allowunannotated # This boolean sets whether unannotated tags will be allowed into the # repository. By default they won't be. # hooks.allowdeletetag # This boolean sets whether deleting tags will be allowed in the # repository. By default they won't be. # hooks.allowdeletebranch # This boolean sets whether deleting branches will be allowed in the # repository. By default they won't be. # # --- Command line refname="$1" oldrev="$2" newrev="$3" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 )" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "Usage: $0 " >&2 exit 1 fi # --- Config allowunannotated=$(git config --bool hooks.allowunannotated) allowdeletebranch=$(git config --bool hooks.allowdeletebranch) allowdeletetag=$(git config --bool hooks.allowdeletetag) # check for no description projectdesc=$(sed -e '1q' "$GIT_DIR/description") if [ -z "$projectdesc" -o "$projectdesc" = "Unnamed repository; edit this file to name it for gitweb." ]; then echo "*** Project description file hasn't been set" >&2 exit 1 fi # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. if [ "$newrev" = "0000000000000000000000000000000000000000" ]; then newrev_type=delete else newrev_type=$(git-cat-file -t $newrev) fi case "$refname","$newrev_type" in refs/tags/*,commit) # un-annotated tag short_refname=${refname##refs/tags/} if [ "$allowunannotated" != "true" ]; then echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 exit 1 fi ;; refs/tags/*,delete) # delete tag if [ "$allowdeletetag" != "true" ]; then echo "*** Deleting a tag is not allowed in this repository" >&2 exit 1 fi ;; refs/tags/*,tag) # annotated tag ;; refs/heads/*,commit) # branch ;; refs/heads/*,delete) # delete branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/remotes/*,commit) # tracking branch ;; refs/remotes/*,delete) # delete tracking branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a tracking branch is not allowed in this repository" >&2 exit 1 fi ;; *) # Anything else (is there anything else?) echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 exit 1 ;; esac # --- Finished exit 0 uphpmvault/.git/hooks/applypatch-msg0000664000000000000000000000067111025616626015024 0ustar #!/bin/sh # # An example hook script to check the commit log message taken by # applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. The hook is # allowed to edit the commit message file. # # To enable this hook, make this file executable. . git-sh-setup test -x "$GIT_DIR/hooks/commit-msg" && exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} : uphpmvault/.git/hooks/post-update0000664000000000000000000000031711025616626014335 0ustar #!/bin/sh # # An example hook script to prepare a packed repository for use over # dumb transports. # # To enable this hook, make this file executable by "chmod +x post-update". exec git-update-server-info uphpmvault/.git/hooks/commit-msg0000664000000000000000000000156711025616626014154 0ustar #!/bin/sh # # An example hook script to check the commit log message. # Called by git-commit with one argument, the name of the file # that has the commit message. The hook should exit with non-zero # status after issuing an appropriate message if it wants to stop the # commit. The hook is allowed to edit the commit message file. # # To enable this hook, make this file executable. # Uncomment the below to add a Signed-off-by line to the message. # Doing this in a hook is a bad idea in general, but the prepare-commit-msg # hook is more suited to it. # # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" # This example catches duplicate Signed-off-by lines. test "" = "$(grep '^Signed-off-by: ' "$1" | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { echo >&2 Duplicate Signed-off-by lines. exit 1 } uphpmvault/.git/hooks/pre-rebase0000664000000000000000000001024611025616626014117 0ustar #!/bin/sh # # Copyright (c) 2006 Junio C Hamano # publish=next basebranch="$1" if test "$#" = 2 then topic="refs/heads/$2" else topic=`git symbolic-ref HEAD` fi case "$basebranch,$topic" in master,refs/heads/??/*) ;; *) exit 0 ;# we do not interrupt others. ;; esac # Now we are dealing with a topic branch being rebased # on top of master. Is it OK to rebase it? # Is topic fully merged to master? not_in_master=`git-rev-list --pretty=oneline ^master "$topic"` if test -z "$not_in_master" then echo >&2 "$topic is fully merged to master; better remove it." exit 1 ;# we could allow it, but there is no point. fi # Is topic ever merged to next? If so you should not be rebasing it. only_next_1=`git-rev-list ^master "^$topic" ${publish} | sort` only_next_2=`git-rev-list ^master ${publish} | sort` if test "$only_next_1" = "$only_next_2" then not_in_topic=`git-rev-list "^$topic" master` if test -z "$not_in_topic" then echo >&2 "$topic is already up-to-date with master" exit 1 ;# we could allow it, but there is no point. else exit 0 fi else not_in_next=`git-rev-list --pretty=oneline ^${publish} "$topic"` perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { /^([0-9a-f]+) /; ($1 => 1); } split(/\n/, $ARGV[1]); for my $elem (map { /^([0-9a-f]+) (.*)$/; [$1 => $2]; } split(/\n/, $ARGV[2])) { if (!exists $not_in_next{$elem->[0]}) { if ($msg) { print STDERR $msg; undef $msg; } print STDERR " $elem->[1]\n"; } } ' "$topic" "$not_in_next" "$not_in_master" exit 1 fi exit 0 ################################################################ This sample hook safeguards topic branches that have been published from being rewound. The workflow assumed here is: * Once a topic branch forks from "master", "master" is never merged into it again (either directly or indirectly). * Once a topic branch is fully cooked and merged into "master", it is deleted. If you need to build on top of it to correct earlier mistakes, a new topic branch is created by forking at the tip of the "master". This is not strictly necessary, but it makes it easier to keep your history simple. * Whenever you need to test or publish your changes to topic branches, merge them into "next" branch. The script, being an example, hardcodes the publish branch name to be "next", but it is trivial to make it configurable via $GIT_DIR/config mechanism. With this workflow, you would want to know: (1) ... if a topic branch has ever been merged to "next". Young topic branches can have stupid mistakes you would rather clean up before publishing, and things that have not been merged into other branches can be easily rebased without affecting other people. But once it is published, you would not want to rewind it. (2) ... if a topic branch has been fully merged to "master". Then you can delete it. More importantly, you should not build on top of it -- other people may already want to change things related to the topic as patches against your "master", so if you need further changes, it is better to fork the topic (perhaps with the same name) afresh from the tip of "master". Let's look at this example: o---o---o---o---o---o---o---o---o---o "next" / / / / / a---a---b A / / / / / / / / c---c---c---c B / / / / \ / / / / b---b C \ / / / / / \ / ---o---o---o---o---o---o---o---o---o---o---o "master" A, B and C are topic branches. * A has one fix since it was merged up to "next". * B has finished. It has been fully merged up to "master" and "next", and is ready to be deleted. * C has not merged to "next" at all. We would want to allow C to be rebased, refuse A, and encourage B to be deleted. To compute (1): git-rev-list ^master ^topic next git-rev-list ^master next if these match, topic has not merged in next at all. To compute (2): git-rev-list master..topic if this is empty, it is fully merged to "master". uphpmvault/.git/hooks/prepare-commit-msg0000664000000000000000000000223411025616626015600 0ustar #!/bin/sh # # An example hook script to prepare the commit log message. # Called by git-commit with the name of the file that has the # commit message, followed by the description of the commit # message's source. The hook's purpose is to edit the commit # message file. If the hook fails with a non-zero status, # the commit is aborted. # # To enable this hook, make this file executable. # This hook includes three examples. The first comments out the # "Conflicts:" part of a merge commit. # # The second includes the output of "git diff --name-status -r" # into the message, just before the "git status" output. It is # commented because it doesn't cope with --amend or with squashed # commits. # # The third example adds a Signed-off-by line to the message, that can # still be edited. This is rarely a good idea. case "$2 $3" in merge) sed -i '/^Conflicts:/,/#/!b;s/^/# &/;s/^# #/#/' "$1" ;; # ""|template) # perl -i -pe ' # print "\n" . `git diff --cached --name-status -r` # if /^#/ && $first++ == 0' "$1" ;; *) ;; esac # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" uphpmvault/.git/hooks/pre-applypatch0000664000000000000000000000060311025616626015017 0ustar #!/bin/sh # # An example hook script to verify what is about to be committed # by applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. # # To enable this hook, make this file executable. . git-sh-setup test -x "$GIT_DIR/hooks/pre-commit" && exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} : uphpmvault/.git/description0000664000000000000000000000007211025616626013266 0ustar Unnamed repository; edit this file to name it for gitweb. uphpmvault/.git/refs/0000775000000000000000000000000011025616626011760 5ustar uphpmvault/.git/refs/heads/0000775000000000000000000000000011557565173013056 5ustar uphpmvault/.git/refs/heads/master0000664000000000000000000000005111557565173014270 0ustar b7d262efbdf02b036ffe9f744819bc10d78e4b75 uphpmvault/.git/refs/tags/0000775000000000000000000000000011033561136012710 5ustar uphpmvault/.git/refs/tags/0.40000664000000000000000000000005111030361225013122 0ustar 10b097320e8d3e26d29d4cc1bd32adca9b78ed6d uphpmvault/.git/refs/tags/0.50000664000000000000000000000005111033561136013131 0ustar e42d1a5252aff0012ec05d7ca17f7ac0fc79f7dc uphpmvault/.git/objects/0000775000000000000000000000000011557565173012464 5ustar uphpmvault/.git/objects/e4/0000775000000000000000000000000011033561136012754 5ustar uphpmvault/.git/objects/e4/2d1a5252aff0012ec05d7ca17f7ac0fc79f7dc0000444000000000000000000000043211033561136020361 0ustar xmQS@{OqĻk .Px3ok;;;;?MB%Ē66NYRXcui2: C)A4H>a}-[x[VnSBJ,JmLccr+݀/ Mxœ!x&Gloݜ1a%+? I;* Wy.6ʼQbFݾ6c ea;+к{$kR1B#=auphpmvault/.git/objects/9e/0000775000000000000000000000000011025616714012765 5ustar uphpmvault/.git/objects/9e/bdc52bb58d5057800c27586f2fb0f6ccef972d0000444000000000000000000000034311025616714020263 0ustar x]OMK0_16/ + *Cۤi 4ߛlaYw.IfոߔWض*n;1y"3onH+6x weXw]@ˏ VŵT!% ?|!rJ-RI7 xƎR HN_RϱVe/| '3r)q44]0i0:td],vR$c-*K$% eNN&OI-|xf3l > [mRK4-jҾv .6aۣ ܽSsM.ɋ\%,D,I^-v.V+8[2zF>I4-d6~U m26=%IY97pݖ0bZ}(j2ڧ_h+xɇb[r>NYUZZP4F*]Dmz ,(3$ 7+tvoZ|:TQiAFAnYbiN ]ה. @m,fV}{Muphpmvault/.git/objects/92/0000775000000000000000000000000011030113224012662 5ustar uphpmvault/.git/objects/92/d7bd7ba468bf6b5ce4dd07e8cb3156baf81dc00000444000000000000000000000024511030113224020450 0ustar xK0 YU⦍-!` āJޟ^uxjUpHV$dIlHFdg1[4T<y>p!rA0 RN8M{5sZ^Zᢟr}JS GalXsP=gkmkmt%E<uphpmvault/.git/objects/f2/0000775000000000000000000000000011030360277012753 5ustar uphpmvault/.git/objects/f2/e85c41bc18941ac9aa936bd140725a729859890000444000000000000000000001352011030360277017704 0ustar x[ksFݯԯpP#+Gޑ%ʣD*$oe@SD`xxP3U%qEH s2p2CRBcQ 㢖T\aN"WVe7gbQ20ca""PwLRcQ!O-Ne:u vcBw0aM1 3dUr:F848k呷`[s𥁏8RyE׮R, :$߅0 Q;؇W@&П߹ F%1\51-l! ETuE[P568PK`qVĖi/* p,,+GII Y£B ͶdXf1xm"řwG\_(XFaedOR-0`d¾jkVpUN$*ZkU'?K)h%(z-`?Vάhgj A"kh*d"I~oF}-&ׁnq-v^Kzg묣 e8(P!}M"9A̲A( |LGB7zSGD.(c@y`NL{2WEdwY ,›k ۻr<1˃0_UV (aNX6wGޤ4Zaaa}K}ؚ':{lԾLwõe4Шרnқ-%;juJDZs`Ȍc7> )$M\ueO/76|MzMP!V*휎g}q(,:W4G S}BY%Kt!"E^ ˍ/5’I,GW{u2wwvfغ=Xr ݻEDh/鲣LXND<]S_ hXNmK3m P}A6㸛L`?ަ]?K!u6Im_f JZE9F\W-G,x2[sޅnv5ʃNGmd M:Lr]S.HVQ/2퇳Pv"b6`1| X:RHM2*cYfmR,JlG Xp.XR`ݚ;4j䠲BHrvQH[/eX&".jiE3%&`!r0Z}V#B_@.`F_8-uloo9dyX6I)ڤd0zvXΫ0L, @ ] /:P;R[MTP~%̄ 1xjS ~1!hn۲L[ fAC+|jD?hKTgM MiIw(TڽhBY$:1)6!~Y*zSOJ۽gK=D^:u߅G]Bc^nhV" 1Цp-M+5B!)D-,Z DD72;gTfS >r$\Ƞcx*[zs->O`*+Oƿ^&ധZ{(ɠh^<}ä_v﷕c!U& '{j= 6NCg E|5σߜC}G';ݗ}a[~x/Ӫl 4*`{md8/ƻfFAA;лxq0l4=ȄkI5{9*g:fIo42o~:C~{~q{s|1Z?NtH|45?F~p ~op5} '3¨F!UKPjj6.WXΎM"4"b/c-69Dҿk0oQ3 EYaIgLN +|rzFV7ָ3MzN) l?̣o̕<֩a$%D~hn`[a5̇fT `Vd6-vkebptX3Ӆn,F|&qgĸ/C+uN5r]/VY_1sen+ߊ捂? pݨ,GfA͈͡8 0I0P[O* Uྣ,~ 3x+ _Jh| _bUjZ[WUxr"|(6񯽈d.վ/a= gI@ِKV@f PWyL"Rl`EtcIv|"i#S tq;U*eWO Іܙ-lhlcpE`A%iɱ>CEVL7wg/zyi!_N _* V pn/ZV'[ƟSڻk kOhȂ!]zY$$lvފ)*y;zBbg{hsdz=p׷2Un;5>n#)ȋ[.ls(:re !,#1Z ,]zXZ!W&巕<3eOd4 ¦U /[yhѪ)86G$>p*+ Q& ռsd8jx`%uEnO5U[B1k\W:HsmޭOzeλu˽'۔oK5՛ET[TbofoBH#w2W(:jX߶} f:J% [h\.G$u$DvݒZԛq'8b#o !k.3e,,e2"eϒ ֧JQP[ =29ATͥFWǵ˗ST(<!xhcP(#8GgeIѥ\3E"aP"cT3P6*6ݹ-B!A !?bv#:a} )k6JhaPZOLi1T%-5K_< u7@p.THk TgcKr X,[OWxxPutп0p/Wfֵ) =$玵wzx[a9`cKp_&߭WnjS~Ec7'lȹ0@`əE(A ,8^1蹩8mpZ#T UݮfgkW5my7 >juphpmvault/.git/objects/f9/0000775000000000000000000000000011030113211012742 5ustar uphpmvault/.git/objects/f9/1e9f74f40487ca9438c2f51711f9325a1258d90000444000000000000000000001217611030113211017621 0ustar xZsI_忢e &V2Ŗ<<Vw@n}/203wqqzdf;jjoOkw{[}.Z%dyy76~n0uwK}5 k3Uqr\5[2^"{0SI_RYY~W" 4r\yQ8gw\ENU>*2SL>^k[tr% xiaPQK [9Rc3X-|2?Z8] qp"gLYMl6qӑ,sEy|c ʇ7IW",-ugɧ"V[4FhμE[WiʮBgv=ZCL9mzA !_Ԧݲn4Pؘɱ{lP[Kyޢ2hvs}jeD26MnB Ƣ(b Yǩh34N;|}9y{7/f'<|t*В5F*P f-K "\ ,(QFLFSRӟ!rϒ%g_HPEAJ#Ùp8IW{!"YcHq!tTLxQ %;!O/Jj!zVX-uȡv1'[Z Rmb r)/ ]b{5pek'alɜsLefy ld7&j} tkX8'zAh>ٳrFg~9R>0x#:( .9qw\R,ĔGҽLJObA۲H֚ڢ ଟm .K[qޞZp!?@CLXCpvJCmM5D9m^z}=۳}o]e5CٷJ%uwhh9v7_vNcAq6?[T,Գygё+Wjk*2eUr+),7)> D5Q@ {yfpC;~ScqPxAUM&^n{dI)ĂCU[Ȅ Ƈ I#VXkB|4S>~|tܟ*ԈgEdSv M@_<͏>fp} hAzAU!ttpcO*'86\N_bFh4 tFqxF{a@6<]#GO~ث1SL;\O։6+ǽ]#,899E~3{v~{=\L v~$3Mz}6OE~pr5 /? =l'ë"mGhz#m+q1h> PhAj⻥\ԉIh!N@}1.zr5hCl4n"]8:\zl;qf\5omd,"f9I $1ϡ]U~xDoTp(R Tݮmzh f2e3@O"\ MuQfB5!RbDu8!ݮI!AԴj{.f.#ƷjqxYGMEH pS2CBҬmu:yQ/%oj@ӗZKxGH[zaE;ҦB׭g=<(x6#蘓ʦ-ʡ50+hA @aI5(E 1EdA2гeE!!W $Dˈ(9eT|P@+\#2K\$=l1) Zmqqs1c0s2Ұb:~M~Gd1S?ɤT G:7WQu1Z4(. PK{X7{±K>;.̺oQG(y6V&OJ/^iqlPÕ3FPa2(UmoU9rB淸,R3צ4zH sVQU+jxiG=t&l=RQqJ DBmFC1Tn%*z-)@eDŽ;rQ#h pZ:#Ԏ m>;*gÖ? #㰤/@يDR[D1`⦘5K;;ϕPB0cH܆/5@K+SFvFáYHrc-F|gdj6k7ZB) z_Eyt c-0*(UM͒sLZE13)k$K4ȾVt5oHܻ-kh@'9)pr֥@<[EU|F7,y C|z1EqW^ Y]-Vr1Fy'+$t-(CQnE˾% \ui.D J\8F,P/q=v}筡ZGt)7͈S:@OU!eנj"z>پհ*pNq~;¶— 5v@oaukPPWذ͸P$s*' +^[#sD30L#ly#KA0׹谅pP=u))m_V؝_T>X%?-'~7Qua־G[%6zTflQ.} b6]) Yp\KY I:{.ruHD9%Tu؅Q%l[13FJ/N3 o 6.Ts[#~)VBx+${x˧+ޠ GxG(l^cjӦ5ӛJ@Z6{PC Y='j8fSP&$ YG^JO@|3b7o4y٤[NoLF]@lŝ&aheOs'^6d ӳEX{_cXgu_bL\^|/H篲ftNO8-.s "hr9q=iD^B&0L,l m~'?-] mD7{QI۰n,t7Q7p;~Qc)UzW a=`){*'jZ]j?ri-j\{XB%}.EQܲ DK=t'͝j(h5^KH+<` ?Hx FCՈIH-V `/i %Jht5wG<m'#) Wn 1YOgۧh@OF87#s HM[BQ79*.>+SDCt[;X-PO?G#ք! iZn(>6\.7mIuphpmvault/.git/objects/83/0000775000000000000000000000000011557563433012713 5ustar uphpmvault/.git/objects/83/517f57bc34986a21885dd586fb434771c8b3740000444000000000000000000001356311557563433017604 0ustar x[ksFݯԯpPñ+Gޑ%ʣD*$oa@SD`xxP3u!ݷoǹnOTV V oj}mL%i|zKg*g>^)ߋT0pʵ sEnlV]A8UTsr.3MZёNZM.B_Gnu1V8lbUj=K#3\fqf4S Y׈/43u,b/N,ݫY.)z.!OBu/m01]\ jǹ"=qYwbt(\ 4DB#b6`NC7\nrTg:WPWObe:+rvߚjϏ-1M rDF+xJemc#\,(]~9R 2ԻfS04EV7pw;>f8Mg~ƿ>h?F1 2*HlR5bX#&p2 V9@%<',^)>  \|YNZH7]h0* s8r*EqNc+P#q8NT6W@ypuKMƄ<:qXґz2Y ۍ<'G7O\0gi#L<༕[ނoͽ[>bK-]K ;$߅p Q;؇W@&9kB?aoKTmE[P56b;0(K`qVԖi|C_@Up,,+GI ["¨ ˶lXf1xk"ǙwG\_(XFe[2&?{Q1*a_A@̵Avu+Ry*'t[OR <4V`l ƭ^ 9؏U?F0+<#Z-D홚>d0:n Heߛv]u`[s! :(hY9<;)=> AdrDE|bH xu0o,r0,9H$Q|^b!2 f-]g9f8S^̟{#T1ٕnVxMDƟ~ WW">xbm̏ENhmOׇe.>א$a> HkĽ4R xM7ju+׉d;qBL3$m&\nҪ#,H}|Tnқ؇ O:To gC[닋vG4f"x*K"/ pyY"/7K&l]wUjZNuQ{r1EEi/0鲢LXND⾙]S_ ]NDlK3xs P}TA䤛LhSzΕv}/ٔrD,Jo,m<;5;M妕Դ .Tv5IoO@2\ %t!|ITEn18`2W:Lr`[ Jkv:E2퇳PNGRCmm+,a1B:3 -)6`(:" {OlģH&eRBҁȿ' ^\R7aihĚpLkLv.h V}U #"ԉC,tlJW2@I4ۭOme;0D[6oPh8yYׁڑj 0>V'᛫O_',$Eλ@lJD2lQ,q"9hN8) ,)6P ` zӒSl,W0hb e9|lR,fFJ O>9?l!gsh#uAD#Fz[)<$XǤC[a 6opvMANʷhh5Y2C :FCwLȚ-,0˽Ip$SMa9lC$FZbП T(WX7M/ᯓiO>Q  Ǔ׽Ahŋ&~[<қXn7H-1K.21KA^y1|ZҶ`4k~ :?n^ ~Ą˺./v?:K sN٭&~xT $-4aؚrz|3y1(oz[[wl>HnW,)ݲoweBEC+_$|1pj "XkKx*I0кͳHՍK+YU°r9X Lo D$j**H@G69۫/`R6LdrhFՇE_d嶥:Zb<8Fc>|b>δq|r̺k磟Po|=9\o|At}K3hq1fӕjOO.-wȤ}HPz5Burfx|A&)G8V(N\HlgPHV qS"KKoMwMo|vQ_>dd8Pt;1&Gn5\b(\˚+PmRe§΁.EÞ!(ăb[OX̨J17DUO L?z ^ QEN/2*4AIٌ E* `#dj\%2O $ItHx6 A'Ʒ tNi89l5B cf?3 sޅ-aS-["' :p:rÿ<2!騩L M)4HGXfRJZ!Jw3Id0sgIE}LY6zPƺI]e` f5Zhk]Ӏ0yEZEd\>wYGf\Xk ٜ(h;o)J fl⼉-(Q(9 㾭5xe]QUv$K;b[eZ,gzMEԎ?GڥYMTt[}O3avվIվq)7kf|z3ZA$]Z3zxj BE"ee+]'K[6rGƿP[ڑ HX/1앳\մ-{1S븧Yn/7˝<*.2L`಺u2XWچJX0D+-aXv LSG؉|h-1aܲMl5Ri+H6`8jrmI,#Cdr4Zִ2 of֓ZL$ɆjlVKkͩZȍ /П9agZz;vut57uțZzP!h90 E0(0c|iYtM ar zvvob:5Ȧ}yHk9!Vhbw¹Ut@J>ƹbDt\uJ"H{wP9Bܤ+E/]b`e9 <sQXn50lRQ,y+<ǑYw)sH)e^C GY#uY'ڻ _kMC1^21.# h}76Q8yҒÿoRFfdx^#8k;.`4`F\;tQybk\,D<=uaح)'Lj$9z\~ؾ66;|IKg9cy(SeVfu}SCatE!sj\-ׅgHU^.w\shef9b&`'8PǑÝ5%6> Oq'?z<5W #;{$(kS WE>. ?m; Zջy_e̋JZs%~پ^Aҧ@cqWBMU{4}j5N:(~l揫ޙ{Uc6yquphpmvault/.git/objects/d6/0000775000000000000000000000000011027372706012763 5ustar uphpmvault/.git/objects/d6/2250d08e25c39016aec05f3d899a0317bdeaa80000444000000000000000000001127011027372706020077 0ustar xZSH__UMdˑ!,;`3T.咥6VE !@OK0AZqk/h{ O;,|Jd0Pt(f6g8!w/zQxLzLxea*4}W/[#8tfϯcyOڴ "VeQZ_z?J: ԝ9Y T[]&1VE1 ZqtaɁtC|LÕ`,IϑhTS8»Ed0ɱ 6I+u0c 3"bK"0@~Z%} s lOb Cg,O]abX&aWj)PfiC_d veaP r%2 xRrPu,ZcDȼ;ۋ/NȤa܂RE(G( pG*@DX*-%V4[1H2&%hLp8<{ݛnfA$n4Z{UoK V|S.m7aw_PClGRK[6Q2V>}xK[s+{=GN%9//J\Pq8C}%^NhcZ}u6 wzƅqvv*S]C.O޺钵4R{,˕j6Qm7Qar[mӹ:TxEnQ*v&rQKnNvi)@[[HGG(;BIϪCVw#Qkjn?t_fR'An[cEț>wT|a'p= hA{z2V,0h-eW c/Utx5~m4~|h>X>MzލOphxb(^n#ۧhϘWg}g&fG? _ή/.60o/.zëMf/&K5x2n|5wë Rפ?< (L|hq2:vAN)6v1 P:sp` tr~^OWC0 VdpSY%$+ă)#qBش$xj9]%iNX)CDQ!I߂H~N 6SD=d﯌`K];LVt VL)fK"A;8{DZMkdQgOPh&^]F">ebcutDz0#iZ|m5F6=}7]Ձ݌^qXA8B1;4S}W"b`#nP4D-n좎rslq0t}8[/WN+ޓ=jA%x=:hxsGli sz(>8 ?ԓ@lI6͌s0Qs( &nx r5W^hQÊ APRQj`# W_I"r)~O<;LGZ\mAvvLY̚4VMҧ9 7x !A6J؋`&"P$'fė$N+eQ?O =MuAuެ66-hLl sNJ$P.o@hȶ.:e%`iw -IxCڼ̸/r׀{Zƨ`\\Uzq$ag b"(]JL5f'1o`R,׷>΄)v7^TBž[GJ>ՠ°u(mn@@n@n혉E]ߍI6q)c @<)b+bd_݃h $ طQe$@ ŇrA I?L,8(lQ1F1H9&;nJZ &Ÿ@=}=:cR ?{8ÜUL)evGŗ3X#7[J!fbvu{,5$[`H@Z}3Î xm0GmdRjӡn|R\v%oǨt"Gjœ%ub|>{kn`EAوP5BsFr?0w8l>n@=~=/\-  z۰,֜)YA(IAg#9$2rlGW3KDFK&Yz;ZwpHӴƸ,GNʛF$kN^ԕĸ%5#+2 L sD=30L#yG43`kA0찃Z=s%)c_׻KV*Z#kR > GeXm:LJߛPƟbL%+7C.NCx11 }cy JƤ!mUۖ*BbuK +|t ![k6/D!iZ] q pچQc{,x mC\l8 a/g91|څLCDlQf `>a.u(Ȥ\Kv imÜ^]##HOS!uvAX)_aeτ_`Y7×|6.T-Eo+_wȞ3$h߮ ㇏"~4,i:if7hlJcnӖ5Mo% 1U-=!LA*Ü^5%ɞ\uAMapkKBNsSmysTV_.l[FQBC:]uwAMqhYXGw7`og7<>2ouwAmKآ&ӡqK:!/QrE5+o?q8b`M.l"/%VĜE@Y=p!Z_ͯTM̄͒Z&l63rR"K^Il>ݺ9U!/.Md/kw{[uFZ[Ey76~0uK}5  U^'> ojdvEairz ?g*Kf>Y)ߋU0pʵ snb. sq:U\\L%3yxۿVouS/RWi"uiVYngs?B:#=#K:KqU= #3bNH.ЋwB$UU tQ1b4 L]/ ,L߮%x?ռovI+>x ^ HBQ$'`^AnHgm[JZ&w!9F3 Vy-jXԫLBwEw^5TSI,08`=bf P2J|(5]~Q 2J @6VΨXu 9WP@ƽ Wo!Y,DO%^x#h0Zg ZbF2H) !Kd!¡,VY"nƈ~yw 7wNȤa܂RE(G( pG*a_DX*v_?gRgבpn׽taQE`Xu曕%K)-j23`aփI +p@}؜뎢5P9­:R{FJD(JiX&3fF*TY%V_$c1\4(3Ep˽H.g JL](  z׫d;7ur98@ʃxw|27?xQ|/-%3Vf_Z1H2K*јҟaDjʻ7U ƂhEUks?^T^Lr+ Me],N4D v̇?:W¡]b2%s*on/O~K[6+XV3T/T29r%|D׮3&Z7[EJM4QJm>Z/7^A!16o0pFWi\ёgk2c5),XJ(e']Xfe}vK)&Z}?mHٞMM&^n;ɤ CH$-p^NqԈ-Q8kjn>tz{TIq6VNF=X) r#JNح?| lq vO{Z~+&hZVrBc2_Z&pK-λeFc:lp86l 9r|{^:;;\O׉6'ONzF9pz>zwv}q΄==\3cu6h,Pi_/ǧ0z-NLfVIɒ_5?`J}a\62%=ZLIyQF0R# C{bໃ$] l!MiK3߭UD53 螩%GT<58Xf@$Dft qlCZm cZ=W(.iE p ܟ+-#KO2Ď ?\0*22K t(^i-bx)c!,TNUѲ'0B0cH [灀 aXj2o$֟mhL>y} InHku@6`ƘٰCaVI2_B!7̉#iAyI^ "9 vm76[&n4knJ:;E̎<33p}8dq̾"m2wUZx圑H\N@h^Őm]F 4UI`is&(o2@Z]E+CQN@9Ty'O gC7 eH2U=09TN;0bt[ hLF? #vRC~߲Fe@KyWAfdEc ev{FI?al|-9$_kq8e-)SdyD_g? R={c%3#qr`\LvX؀Dy6XpIՙmZv?ńTD&*P1ԙ>Y}CLU S c0 4O6j BӚ)|AuM{@%P )ȶ#ekFA䓗2$%#:k>fclEKY,,rBli2U ~Џ( eԳgBn}ܮmÜqƽFFN6K(6첁.9P`1L2o j9|!{ʏwA|%${r x?k c]$H};^y#Ao8Z}zd'O1a0ܛJ@JpPea.Z voJQmlHv.%laCTu~yPgEL`~=ҶO?k^(`Gw0/%;*^c-I7>7%lQAboͲ `@fs8 +R9za<&R^_@̘;S|K2j/OT$FLH6MzS9&J9oRa!!sFcNG j4l WQiM~D3|fb rC5 H}WF`x !,Pn7zuphpmvault/.git/objects/25/0000775000000000000000000000000011030113211012652 5ustar uphpmvault/.git/objects/25/c0bb8baebd119299a4d66a8b07cb162947e39b0000444000000000000000000000042611030113211020142 0ustar x+)JMU04b040031Qpsg*8!F}cx# WQ5< U⛘ʰu/'mw,Iﶉ(&e&1ܙ̼w 8Vv['8jHJinA^r2ëZ,\>ݖ0bZ}(j2ڧ_h+xɇb[r>NYUZZP4F*]Dmz ,(3$ 7+tvoZ|:TQiAFAnYbiN ]?|ai?5WqFQB7{iuphpmvault/.git/objects/19/0000775000000000000000000000000011033557552012704 5ustar uphpmvault/.git/objects/19/d4266bc22133e5d3ad1c29c5606a234095328c0000444000000000000000000000073111033557552017572 0ustar xRj@+E*n*nDmh fZۢ$tIK=rH*23g.0g86%j֨Hap˅s4@8$$xnqz/yVl8׽_ ] h)7U%x"%|+A.853:`'d;puW{p0B0̻J"Jt cN(BǤb߲->F͝oiJPɮ,&?\2'h( IORTYN-! j\]ME j3j-hB ㌲}ЖXo2=˹j-jFڠ.d_n)n 5zڈ#uؐrTZ\DEΑeab˞b0;uJ<3ʕZt =`tS|= 0ho$=(q jMy4Ouphpmvault/.git/objects/c2/0000775000000000000000000000000011025655655012763 5ustar uphpmvault/.git/objects/c2/81445284ee502ce7233c2954bd32a103b5a11a0000444000000000000000000000042611025655655017641 0ustar x+)JMU04b040031Qpsg*8!F}cx# WQ5< U⛘ʰu/'mw,Iﶉ(&e&14=H;g{Sol۵jHJinA^r2ëZ,\>ݖ0bZ}(j2ڧ_h+xɇb[r>NYUZZP4F*]Dmz ,(3$ 7+tvoZ|:TQiAFAnYbiN ]n[Hy&rc }|+uphpmvault/.git/objects/7a/0000775000000000000000000000000011557563433012770 5ustar uphpmvault/.git/objects/7a/61c153b4c9893ff81057a94190dafa7f9dbf2f0000444000000000000000000000046011557563433020216 0ustar x+)JMU066b040031Qpsg*8!F}cx# WQ5< U⛘ʰ%hQgk>zڂ&@ÕBxnQ:5$4\/9U .nK1-]M5 /^xC-mɃ*IHN-(``]p@lm#iw6=hxU_PWTnO7s->QvD ,4Dς<ͧC<ךHTts`}YW~;\uphpmvault/.git/objects/7f/0000775000000000000000000000000011030351301012744 5ustar uphpmvault/.git/objects/7f/8f011eb73d6043d2e6db9d2c101195ae2801f20000444000000000000000000000002111030351301017760 0ustar xKOR0b03uphpmvault/.git/objects/35/0000775000000000000000000000000011025616714012677 5ustar uphpmvault/.git/objects/35/e36b74b55106f3799fdd8c665e8bfe7d0c51130000444000000000000000000000111611025616714020050 0ustar xS]o@k+FTP—R!T)J~<g|99{@BHٽݙ%LΠ^m,SX,W-=[iiP7hRͅv>> v{PNFybO1;[em%+T&R8 H: u=O",PXıQRr2l%ǘN!e1n6Ka!!Q93|܀'F]&+} ˹L ĺ dd&Al9e wZѣcNJOOxcjRy>#I#/`c: LSU>|N}flH0V>qi ]ALN_bW\hR4< qPf<:|vwm+?)irJz ZX,}R'GH̠ 2y猽_%c^nV{< \xgc Dޫxݪ vկ*yNCҸ8w߉l֪1ya?эInl&Ymk[Ȣ~Zu@ G(L&F'3RLKi;N0 H#-ɨiH}d.2񝵶 ^jWdovc0{NCS5 -U, %nѦ~{wQqJ%J!JJlťտ[^嗮 gfY3$k'$]'LYp0i9-'Ԥ*d 7=[n"Prw-wMWM ,H[D~e:GHUIųuphpmvault/.git/objects/bc/0000775000000000000000000000000011025616714013034 5ustar uphpmvault/.git/objects/bc/da31bf0499c7ccca7fe42518f5f732fef36e920000444000000000000000000000056211025616714020425 0ustar x]RN@_1PR -BbPތivnRvݭ^ڧ9srNwIu&ߒiM9Ndc* r;<`XVDv,N4tgvn1 e3[{\G^߲:,ːF\vmuT >Ze(x!UP"(g49&CVs݈?p ~1n %C|.h\׵KS%$32VHTdΉbנ#U"2o\`\&GlIfxhTxRI vj#TfoIu.9@\U ^G"i%ɄZ蓔h,.V3.1uphpmvault/.git/objects/ea/0000775000000000000000000000000011030114060013014 5ustar uphpmvault/.git/objects/ea/73982ac03844f2db183202a36dacfddf4ef8290000444000000000000000000000133211025655646020253 0ustar xSO0WW<1A*V!!6m M\k]9;;-P`%{1vL$ 77ZR"LK&dQ*N__=ѳ"<||-\S23D(uf ]! RYZ#Pi[U:+ ̴gȈU\eB$L)5`&)u9Srk[EAba(sOEX N$ȴAV4H YZHMWV*1#קV)sw> 5&Wef;JUJ8,mZȸǤ~Rv=Ō\(2}GhUZ$0hI xJrXB GS2yfy]9t} aO0ۼ_F71SzHُx&*LQ<,)Ϭ )j6w1^\}z>GCbVF>;G,0` %F !q;;r] 6ʹIGs` JB/6ٻutFy%˟L3ؐe%Jϣ4V{0hFl`V8uKS J쌰 {w*m<ˑͥ+wS>kȳ6Xުqòڸq!\K0@ՈVxoMIrڬi$^T8."WVe=XGt[58! !UKN6-ϽEX+,O=A5|+||:{d,}-tfׯ"!xOUA(lR+Dl']m.8Q<^-uGVFS=/qc(,t8c-<(V9Ld& MvM48ĶasRCVK-`lQ+Pam[ ^q[`T RFo  K'h6vmK9ܿŐہnC?$G*VK4/~[ f2^YG m'%a>7d "86QaU9cF쿾hNc8[d>aPY OU6P'X6̿{u,|Vvfؾn}A&Nn"QA7j_}tP8^'f&>vɷ*YLs!ki&[:-鵅MgMS2(պ䔇EWKɑ #ۗMcy m+"=q:eD&d!zMaB24TP0# hrsPh1e;[1X^4 A@\꽝Y $))d@M& T-mG &bpɒ;׽dmlB *0US럖4gb\dY!ʔ9,/>cAd!p7N^_o ~}X pѹ*^:G:%<(IΑkbp _ԛJz!XV-uȃf!'yZ Ob ">MƔM0˽Hu0 Ud޾e2;x2~{՛ {'z÷iO5?QL Ǔɠh4iF~}u)aGt Q \r(FX)*ؠt;SғXж0j_}sl+8ߦ0H?v|SoCa<@0(|{Rz-ַ5Qkjxfbe~VF~Q~dl`33-D2!8Ƈ$+1nG0&`II~<|tOKRjD"xQ?NQؗ]>.v 7ݓ란DG%xZrq;JwIg7o&pkqPwÈh<7h|oq0l4{1Oȑk4k+&ah ^O׉63'']#L8=:C {1Zߌymkxx5 ׯ\ƽyGdz6~!ie;)^6+/&b=rn)uj .x,P_&xr5MڡE67N.=ĝ8aCx޽r~OH62d$q=eIsdg"e@r E*u3US۵X@oMVl5>Xlf8$ 0uФ̼eXu&x'sh`/T?=N.%vH}XTJMF*MN_-dX9BB!ƷjqxY8M?DH pS26Ҭmu6y]Qէw5K~B#-0K JhTی8cNr((2;SS K1 0*؃@tA’jFQA$byD.d,]mVr5LBOBS6AX@aODٗ@XZ\ iԏسe:40kN4JQϡ$KLKÊI#g5!KL$2OTS kY0ϜxbFAA ,k `/@u2S[fi .82*[plXFCOX*=hqlP<1YJm(!mb,njΉ 2Łg=xi}m M?4oUzHCaCu`#*>085T]Ahb(8*-UE Pr1s+iue99w ܟ#-+C2Oè8,˪&!/[Hj(&L33cpwr򯲖nJf|L5rxVȑ3}KI?%Kmd{(z8<} Inֈ,l@w1!:CK6AH2qN@7dE!F)Y2qQkfL K;$IR?3sbq`SQ_[+ar{MN&32[Q s@<BsPmW!P5V/=-9ґ6 >t񽀔kqd_\Blɓm%*)kZOx5[Zq*4k`I L|߯<\2Bx@7Epe(ݑ! U /ZJbefMɊ8Q:zFf~-{D1m|.<j.q8 SEUcr'zUm{UH[k3(}w,MeƦҗ? 6`* ~&DMf…Si<^|g/' 7ѾA Hg*f;dTܖ#,S~abA!FFsWZ g-M5]k!Z!q ms; ښRpv3SʹEI 96wftY ͪAٺA!¶J+d0h)ouWUB|()u|1GMbvqOl9TgH_i=</L |iېYx.fLdRc~a("lI~1qz _eL/ ,pK\.-A4Db{j8p{Vݫ܄]0L,l oY~KaHП .[)'[ 1`:NVAcdBP.32mA:uvsYlcr2p%YY"\nqE0oJf)K1`&>nK`zDWP;)B 6(5 rrBVvEaos*qLNk/{Q8}UV59Y5>Z MX&sOIV ӇݎZJ:)*%ęV0;Z$oeh¨0z1J-=_Y}^[U\nO9{\ogbO0oon? Z{]kX' T]^9MUu?=PNWYEA>\v0/z=9N}8iFp0r b;x;ONDqgҹN$8_&euphpmvault/.git/objects/81/0000775000000000000000000000000011033557552012703 5ustar uphpmvault/.git/objects/81/9ad5427c28a0e990753834e9044da739bf85670000444000000000000000000001115511027074204017556 0ustar xZkSXޯWa bc00YRCd؀Mc3ٮ,咥c,y$B2<9GC[T7A$J&RVl1Q54sɃR_ VJ2V{d񐆷\5[^"wF0S4MŸTk%Kk,*Ai8YZ`'1XIN|Uy<_:֩$ }u:δPp,L@@ !G&8Q2Ҟ)1'rE$I;~!i2T:(1mzQjsNh`{Ԃjzʖۓ$  tW/݇Qt ( 7RD$ SFB6@F%-{ v#ՙI<N4Y{/g*$snd1 p%>>I?(`DX^zL9 |+pTGK(FPYLD^+Sw4M"yÊZxgUb<4 -3Dd>#ugvqЈRp :g^D Eg9Boikscb[@{B1ğyɤ)lu, %l~/Uwڇn}Cg,ҙ>M$kv`h #X!BEbP#(I*%(Ppdu`,SluX04^@k]y']wZ2 W:$GQ}3M#tʋ"'0$u$m*q>ψ- D_jI/Q?% MX$8!¶Ű)؁M®Sx:C_dveaP r̐%2 xRrPu,ZcDȼ{ɻF xd0nNR)^"> @|#Ya ,Ϣ 7*:키 m`h?@>)¥ѿ"xz'Dd8_ 7^' S5Al"~-n@9`و-F3w@GDAluGQ7( Vvy>V"%ڴk&3fF*կC')#JB~CGpѠ8w ^zlT/j 'Ka,*[(1uElkH6SK`ƣ.{j~ t<8FūW. rR"A1jjFm~-ѨX)&Ov/SuMi,h]fQ/mQ;;6%L8Ӥ_uiT[~^p CPm!\Y|zq] vi&Dqު\{_ܾ8:׳}o?u|`EBZNQ,S@ -T\ΘhEl)5D5st+md,6jVyxڼKC]qa/n\ǟͪАzpnh$fr#c/xlYdBAL7oTseCV7#Q8kjolw;Lm}9/:z*('+'v K߽Am)ǽ~Q|e'p= hA{2V4ŲKK{h\.WW6[Fh4-_#z7/-WGB^[cN{NU͉pho ?^2av{̘cd%Mzu6 O\_\F>ҏ(z6GWg!R-qh,SiˣG'0Ԑ-NT<8f2db8]ףBk41%lf3XI4Fl;ɂ=e5`}q4NH^ONj$ ֎֜(9OY![ˢ,?@|n!'fp\1UjziT=l.l=W]Kduxkp*VSI(*M5U[N-(@yǤ;zQ6\ r94vA?)VZj[72Ď ?\0*22K t(ni-b-x-&,noVNUrB@aa&TXg)*9`0~KI?!+S(C֘ }62Xf,l14ZJ-Ca)t\%m H2G(9͍f"EromL$&PWܘuZIw(~gf׵4qs}E2&( 2DrTOBl2jk.c_fZ̃0^-yX NPf΄)v^TB?Qm LÈjPaړ@6NU ejv"©$V¶8{#c @)b+b^ _& +l)zYCى5pGqg̛(/BY T5BsGrFe17 l>>@YŶ\kݗaXTsdUWG$)hpdRAh߉TVNqfT S }N֎->=2MAnSc\#C hM 5 '/ZK˸5#+ L(sD=׶î30L$՜|#H4`[A0Ϲ$Z=q)__1ߝ DUFͻ1'͗]GUIr37h,ezNQ07-PT"HW.\Cn'ɄP*A>8K1iH[r4*fc,Ƽ}}RzE`-]CȖZ sڿi|hVDnvF:m(ȱTրǵx mC\8 a/g91|څ EDlj `>a.2QsI}ܮÜǽGGzڂ&@޸Ǐc_aeVFPCRJs ^:`鶄5DQ>B5_K~N>ےqʚ<ԊԂ< ֥G6Rv'jӃ7nPeEy%i@E澑<_{=nGԡJ 2 rKsJ,c|:II9sY\Lu@7և1{{%؇|uphpmvault/.git/objects/dc/0000775000000000000000000000000011027372706013040 5ustar uphpmvault/.git/objects/dc/9dffcc9eee2b7fa1c6e8c676d6414b1d0c53630000444000000000000000000000006611027372706020504 0ustar x+)JMU06g040031QH/,L(ax{ J~X|\yQuphpmvault/.git/objects/b7/0000775000000000000000000000000011557565173012774 5ustar uphpmvault/.git/objects/b7/d262efbdf02b036ffe9f744819bc10d78e4b750000444000000000000000000000030411557565173020272 0ustar xm0Dsfۀ D#H)M@2R~B0m [oy`89 ȸdv&ذ- f1:'N&eޫxgmwhtÚ?Y\ndn=Yk51_aE<@R.tԳ h? TvYϣԝjx@[]⸪?Vuphpmvault/.git/objects/07/0000775000000000000000000000000011027074245012675 5ustar uphpmvault/.git/objects/07/ab8fc5572281f1db8de4dc0efdde002b3cec870000444000000000000000000000027011027074245020456 0ustar xM1F]u_'ٺǠt~sZ;h6EDљqn';uphpmvault/.git/objects/24/0000775000000000000000000000000011033557576012706 5ustar uphpmvault/.git/objects/24/94d64c179fa7bfca25f9993a6b389578d967b30000444000000000000000000000027111033557576020030 0ustar xKj0D)cBCvYV3?BjY*> @_Fmc`9F%\ dA] ޕN2G,\:EsvݎM:ʽg𹿁A]@VӝDUSW ݖ0bZ}(j2ڧ_h+xɇb[r>NYUZZP4F*]Dmz ,(3$ 7+tvoZ|:TQiAFAnYbiN ]:h,x9%ru{)uphpmvault/.git/objects/f0/0000775000000000000000000000000011033557552012760 5ustar uphpmvault/.git/objects/f0/d9c6e251bb8660a0c37e6d413a720fff87cd5d0000444000000000000000000000100111033557552020241 0ustar x]M09Wai@R'δc[cZߙ"%2vfq**0yf:4.6bY2dA8b_GgvbF|PSՐ$Lޙ9zLaba~ɭ?nF_l"m𷧾w$dAZ\84m;vSdѹ=T!(E zzm;A ڥ}ا]{[x{}GZJ-7uphpmvault/.git/objects/f3/0000775000000000000000000000000011030114060012737 5ustar uphpmvault/.git/objects/f3/a619ed53e93c3ae3c98c11f20a1ff12bb3f9480000444000000000000000000000042511030114060020224 0ustar x+)JMU04b040031Qpsg*8!F}cx# WQ5< U⛘ʰu/'mw,Iﶉ(&e&1ܙ̼w 8Vv['8jHJinA^r2ëZ,\>ݖ0bZ}(j2ڧ_h+xɇb[r>NYUZZP4F*]Dmz ,(3$ 7+tvoZ|:TQiAFAnYbiN ]G oxlv/6rFq|zuphpmvault/.git/objects/41/0000775000000000000000000000000011033555777012706 5ustar uphpmvault/.git/objects/41/e49e0029e59142222f8e035449ad366c19dc6d0000444000000000000000000000122111033555777017620 0ustar xmSn0Y_ȩv ($VuQP%H;.ѠQ+n)u _H1`Zhs#C:䚗*.osIB63XM6R ,gzDGkvķ*b*d\!*/r[ !b<'쳯'uKH'uB'GF;R{*P &-y/D;E|"Ҟu ߉S]߻'n9m*&>kS\I؄@=+`언Ob6~ro\g-76~iIx춬vf"xÓbcʂ0>4`-&ksllAPr{ dUULo&'멝g1I"K*₱2σ*Hz *R} &;V(;Oh KMFAAʧI2$Ʌx]6Vz}ͲarE@9I2mpg)ȣݰPMkq':]utR1ٟA-<|xi[2S̪#X'ʰ^ 9'Ա:xM WWodVq=8^,92F7N=pS/DU'V ')XHd] uphpmvault/.git/objects/73/0000775000000000000000000000000011033557552012704 5ustar uphpmvault/.git/objects/73/240316000465fd7de16250642715f820c13db10000444000000000000000000000033711033557552017343 0ustar xJ0a׽iMnf!@~m|MJ8xfA7} 'iM'8bs䖨[k03E EDx{-|Ĕ̈G"l?&0X+źn6Yc v Y11*)pQ7j(R^JY>ٰDb Y5 UHԛoli{uphpmvault/.git/objects/b5/0000775000000000000000000000000011025616714012756 5ustar uphpmvault/.git/objects/b5/b7c877844cf4c8a6b11319696bfec6622f8edb0000444000000000000000000000067011025616714020217 0ustar xRn@+#HV<YA2hJjpHI(hY/`ؖ/Eyw`PTK^3^ OW8?:%b8{-֠H//3h ~Kx_qz'yVۦֽ_'φ$ 9Z ]!7 X )s^^( 9T7@Lwojk;|1\t#s̚6K5вƨrI=63tE+]DR&eey$)[j de*#!k-r45j7ynoۛ [T$5ck'&SްL8}xÑzy:,htߧUPʓ}9h8U:[\VM-[ WB_Ǯ$efuphpmvault/.git/objects/66/0000775000000000000000000000000011557565156012720 5ustar uphpmvault/.git/objects/66/bc12e1cfe3953de6e9d21bd48c29e5b51abf490000444000000000000000000000067511557565156020362 0ustar xj@{E IX%}HZc}Z&rg|3Zwͻ8Qvh|##=f5It$i@'t*g5ZɣuvIb @8٫=%\bGdErHRG%U"Ys4#4ː*6MgˋQ$%d/xǜG/ˠl8ZPU-'H<9='t=gzϺ,̥+Ա{_&_M[c48gX']zl ex2}™5( vo},|=,6 [RSSBܔ0`'h!DG06`Ggm JVy-NNq+ |[!+զZ;).:*w53ob y^X uphpmvault/.git/objects/5d/0000775000000000000000000000000011557565156012775 5ustar uphpmvault/.git/objects/5d/f4c91aed1b70ac34ba298e94025d669b0e186f0000444000000000000000000000067611025616714020201 0ustar xSn09_q^˦"X7^JƘ!!rvSvI#^S{fe㻳7'\VV*]F'- ߸q/BhWp%2NOz("3~f*/W0 c Sz[L_ I̗\`cgx]RI+y)q^)cv5gK^'0epcgēogzmTsf;!!=/s*Zqsq?ԥi*ڌX-yLMB븣 yy/TRXR$;NUiۆsԫyǢ#<=7ŮB:o ¹l xqݯ-?%IBV_?juphpmvault/.git/objects/5d/5b59eb7f338c4e08be717969e8ff69433a32480000444000000000000000000000032211557565156020025 0ustar x+)JMU024b040031QHHKOOgH#㩶^^ңt~O܂~F Ηݞ# 8u'7= ݖp]Up%E% vo~?AKX UWZ I ~>@]7jMMJs NTQhxM{HNE_uphpmvault/.git/objects/1c/0000775000000000000000000000000011033561023012742 5ustar uphpmvault/.git/objects/1c/5fcac4c90448d7a0bdf3cbfcf3a8512d0ed5d90000444000000000000000000000003511033561023020522 0ustar xKOR04f(-(-K,)ѳMuphpmvault/.git/objects/99/0000775000000000000000000000000011033557552012714 5ustar uphpmvault/.git/objects/99/690136941080c88d42c5995e4638c9948e3c1f0000444000000000000000000001352011033557552017443 0ustar x[ksFݯԯpP#+Gޑ%ʣD*$oe@SD`xxP3U%qEH s2p2CRBcQ 㢖T\aN"WVe7gbQ20ca""PwLRcQ!O-Ne:u vcBw0aM1 3dUr:F848k呷`[s𥁏8RyE׮R, :$߅0 Q;؇W@&П߹ F%1\51-l! ETuE[P568PK`qVĖi/* p,,+GII Y£B ͶdXf1xm"řwG\_(XFaedOR-0`d¾jkVpUN$*ZkU'?K)h%(z-`?Vάhgj A"kh*d"I~oF}-&ׁnq-v^Kzg묣 e8(P!}M"9A̲A( |LGB7zSGD.(c@y`NL{2WEdwY ,›k ۻr<1˃0_UV (aNX6wGޤ4Zaaa}K}ؚ':{lԾLwõe4Шרnқ-%;juJDZs`Ȍc7> )$M\ueϚ/76|MzMP!V*휎g}q(,:W4G S}BY%Kt!"E^ ˍ/5’I,GW{u2wwvfغ=Xr ݻEDh/鲣LXND<]S_ hXNmK3m P}A6㸛L`?ަ]?K!u6Im_f JZE9F\W-G,x2[sޅnv5ʃNGmd M:Lr]S.HVQ/2퇳Pv"b6`1| X:RHM2*cYfmR,JlG Xp.XR`ݚ;4j䠲BHrvQH[/eX&".jiE3%&`!r0Z}V#B_@.`F_8-uloo9dyX6I)ڤd0zvXΫ0L, @ ] /:P;R[MTP~%̄ 1xjS ~1!hn۲L[ fAC+|jD?hKTgM MiIw(TڽhBY$:1)6!~Y*zSOJ۽gK=D^:u߅G]Bc^nhV" 1Цp-M+5B!)D-,Z DD72;gTfS >r$\Ƞcx*[zs->O`*+Oƿ^&ധZ{(ɠh^<}ä_v﷕c!U& '{j= 6NCg E|5σߜC}G';ݗ}a[~x/Ӫl 4*`{md8/ƻfFAA;лxq0l4=ȄkI5{9*g:fIo42o~:C~{~q{s|1Z?NtH|45?F~p ~op5} '3¨F!UKPjj6.WXΎM"4"b/c-69Dҿk0oQ3 EYaIgLN +|rzFV7ָ3MzN) l?̣o̕<֩a$%D~hn`[a5̇fT `Vd6-vkebptX3Ӆn,F|&qgĸ/C+uN5r]/VY_1sen+ߊ捂? pݨ,GfA͈͡8 0I0P[O* Uྣ,~ 3x+ _Jh| _bUjZ[WUxr"|(6񯽈d.վ/a= gI@ِKV@f PWyL"Rl`EtcIv|"i#S tq;U*eWO Іܙ-lhlcpE`A%iɱ>CEVL7wg/zyi!_N _* V pn/ZV'[ƟSڻk kOhȂ!]zY$$lvފ)*y;zBbg{hsdz=p׷2Un;5>n#)ȋ[.ls(:re !,#1Z ,]zXZ!W&巕<3eOd4 ¦U /[yhѪ)86G$>p*+ Q& ռsd8jx`%uEnO5U[B1k\W:HsmޭOzeλu˽'۔oK5՛ET[TbofoBH#w2W(:jX߶} f:J% [h\.G$u$DvݒZԛq'8b#o !k.3e,,e2"eϒ ֧JQP[ =29ATͥFWǵ˗ST(<!xhcP(#8GgeIѥ\3E"aP"cT3P6*6ݹ-B!A !?bv#:a} )k6JhaPZOLi1T%-5K_< u7@p.THk TgcKr X,[OWxxPutп0p/Wfֵ) =$玵wzx[a9`cKp_&߭WnjS~Ec7'lȹ0@`əE(A ,8^1蹩8mpZ#T UݮfgkW5my7 n?juphpmvault/.git/objects/70/0000775000000000000000000000000011025655314012675 5ustar uphpmvault/.git/objects/70/8cc480b9a5dd81f4971a51f3ed957c77b16d7c0000444000000000000000000000123111025655314020125 0ustar xSn0޵\[7ѬI$ DU&`6IylU+M0>~ss|ja5zoxhshP~XU -/K ᑛB7Տr k3HL4iNGc!1gV8ڹ6Yy' ŗ_wZ;y&d .p=} h琖/D8Ad=  ,yG DڰF Nsh -Q].E Qֿܲ5H3{zf^V@Ah,=vpl@%ArI+$-Ѩi; )=Ū)V &^f }j9戦ȑ+fx>]H=K}l&KEv^dHN9} mJJKTwd%HL,PRZbtk1& *PC=нq@01ճ$S:<a&6i41x<M4GGF8|qqSߴl-(z1Miy{Z*!i<-C(]CΝuo}wǨ&5$>6Z]Q}m4_/oŏuuphpmvault/.git/objects/23/0000775000000000000000000000000011030360277012670 5ustar uphpmvault/.git/objects/23/f612e81034443c5e6259bd3960dffe84265ba70000444000000000000000000000042611030360277017672 0ustar x+)JMU04b040031Qpsg*8!F}cx# WQ5< U⛘ʰu/'mw,Iﶉ(&e&1lRv`{پy<kC I)-(KNfxU[HkڝM޸Ae敤Fp~\OTQ**-(-K,)Ӌ=SN}ѡ(hFd'-wxuphpmvault/.git/objects/87/0000775000000000000000000000000011025655646012715 5ustar uphpmvault/.git/objects/87/97d085d64d10e3a4f993c25d846d86f194ac6e0000444000000000000000000000056611025655646020023 0ustar x]QMk0Y\vM\ )ٶ$e! 9^iIGÒd.Ҽ7ofѷTW~Z &͠c$vz%&~X]g]ʜ0pA|/zBmBCnS$pvK׽7l&gHB$x;;ؒ##v-w I:+)|ȔJUn|ck ![:9e]ݝV`&51lj!.]5ͯǻSil| T]k1qݘ Z'a:|z}<?{6˽ ݠn~ w}F _#8T\ Q]$n,uphpmvault/.git/objects/e2/0000775000000000000000000000000011025616751012757 5ustar uphpmvault/.git/objects/e2/2ca0169000e8b82d5d11ad3adc6eed30a6ae740000444000000000000000000000023611025616751020273 0ustar xA 0E]s%iv(i2)c*x{sicJ. 3أd86XK7HX3jF=Yh˯$БxxedOåߢ3ئA u*ruS%H wI0ŸMX>\*irDDuphpmvault/.git/objects/bf/0000775000000000000000000000000011030360311013020 5ustar uphpmvault/.git/objects/bf/708f4765d3f1c9b4cc8472d12d9a60e23579250000444000000000000000000000026111030360311017744 0ustar xKJE1DgNt' ܏ļ-5*P\'8§9Tl/A TEi&p2?&!ȶ!2Ʒ,@'fN" nCZ'|~&Xf{ӧTZ]߼%hHz>V5$Y SnS>on.`Z)59g:pT<, ʋ"w/:V%No`}A8d]369!O= uphpmvault/.git/objects/a5/0000775000000000000000000000000011025655314012754 5ustar uphpmvault/.git/objects/a5/2625d4f74ab80f8e00681a4663dc05ca3ed2b90000444000000000000000000000121711025655314020075 0ustar xSj0޵\N`4c͚4&v(}ʒ~9J c1e}Lѧ:@OF8* U\UZ )Y& |CYƭ6A; x{S"M@Xy',q Óxa{ԼB3a 84pE_GLpGA$$;q3t%Q1X )0)ڰVW KqhZ p I_HQZ,olCTߞ]n; Pо#Kk\. ٯ &HN#M>~Ujƺ# M#b'!X2R=.x8MMїѽ|՛laEˢ0̊-$tK4{V:DoUy#(N9l(xvv yMduWpBa;6"*77y+DŲDDn>RXqʌ ҳ#f`j( ^|>cJGG{$X#v0TC0ɒjd )J=!lwNwŶ!| (.cF^]ܱ0 Lw%BZr]- 5̞yG"{n#+ 2nD倿5rI;{E „vǢp( Wu +=ؑ'jX" ǽT_FZBT!m㏡Ȍ>E!KBFAhP :FeG,) ";'6jt2,ht*'5 p,oX,qr@T$c0# rs^B:d[}SwA%^V$-=`F"f'Z_^Dҥ3X| vOP˛Zi DߠD \w)ʡ.MR`ZrI*h5e)7n+ PYG>Eg銥J7Scdigx/gFx:_̦/-t~<=2oX\hO~ cP^o\QݮWa:wZ%bC;̬ذ" h>]H1ܹ@nR Ex^+׹v6a.7B7WF]u~ _|m[Dsu#x.1"]!އ!`%Gмli[ŮqDL@,z]GT"뒄QYVp/P9'a~7_ $ؼ /r/D%LI%'cwRn,[P,of_UE2+8f7(^@5?GmeCmQVu[h<ǎAp(:`اh,{# R)-QSX\C[.In̩Z ŖjDf=xNHM7 c̐w=rx!reN#nj-[73`떘p:3͵]%o,vd{הhooH :pa U_,s:)7!%s(󎐳=Ȱv\-\w1mxEO0l*>'[XEhYŧkHmCzc(=9mF5b{()0KJ2ƲYu@ D/_̽= d$xCuf7셰~hqU*RBVTQEz]qC Beݬ ^''H)$Jr}I^Ut'Z1QX#'y<32+R%|AttS%| wv::oʼ-ޚyAVO6u~`01kz VkI'.Iͤ+`EYvmƕ(USBBz7 z=3 )F'nRR9; 7{*&TJ֑!|4Zy&Cծ)s@ZZcGr/Z’:!&YWR[`r4:@2UAĔr06b𘃥F|$% j;7C >@X~x#218Û!niVD<luw"_H#5I[^zrA;o{OI ^3HXpCwţM"IL]k|(AT7dsk2R5vv8&?&r^Gyk YŵwБä^SZ"ų_[)aN8CzbX1G;hoIHy&f6 1Is(fAņOKBV ^4Q&{tƋ׊"|*KT7"Ym53DbŶ9d;\o-o vZ;?Đ)g(%ړ5YGkgf5%6Y*uǔ=ТíSntlvTjScr{b?d UTE#JQp+m[ĨCn_#8 : +|{ EXZµd'A#<XVGe cAJ䟺PVՕQyJn{9 EE6{OmSk"ϱ:d+{*Z/ݘcbfbN] Il,lا=,̐]&K<upM~d,؟EC*܍E ݚohZɻ7&ənʺ^b]6喔̝l+iJ7P=s&>xZvd\Ʃ=:QH >؎].g@xFRjWƝ jټ&7߉+ӗΡ( .$,'ݐ#4nPzLrPƒ+[ v!(=M/{*Hm2:e쮔 ̙߲5G04XڴC\fxFu–f<HGJ[.vBK46[j&xl[4 ۧ $@dWT6ArJ o3t8 ⥈:Tt2KqbOWsrTrE7ZDbW6Ij  ;%_ev#V& Ojs(@o J)JTݨUhfN)MutEZSF%kMTow܍~Utc@ː>։Oo.@YN_ &'wN?^dfm#7l5.OI[/VUw@zkk@yEo9vqȅZOjsEaNuݒL78>v; vFi'p.VV99^M(ZBG= Avn 10i~XfGcjnPYyoIq<+ [@z NLohx\ZLXޯn@Ϡ8mnTzEb5ᥤcoxٶ}5RnP(.]J" /iHbʩ"񳄄j9{WpNjaNظ~LG{QXlYႌZĿ, "Oe pco2ԖY¯xJ]z7ihőXO,F~%gbS"ۓ:0T H J%1xs!w|&Cf\^<iB:'C\Bΐ4k'HK*Y4cuEdQ{;˭ CK$6Gn`T(@vyJ>em*tW@GYy- LQֆk[(t/k7eØFSi:j;-zܩ*ʼ'MOʄᱺ?tܶ8]qKo+ ]@ŞV aH PxePv)B|2=5=QQžjLv33~Q~Ov#^R>%qvs]$@2*B7H2@kNdu;YoytOP~USh (ďgZƝ$8qH؅^]c$tG|WkV=ށV5]piX6YtaB ;>ttV%(E(ʙ(:$7`}!9,La#n &^kLØwhZAe7M ;5\3j|u,Xgk\fZ1s@ڋ_轮WѠ]Lkp ]/^0GG'5LCC#.ucY1T+kO؛f;$YgFBEUwnf(d6Xs 0b\@|OO"z V67jU|7t\뢑fns#&L)@2|$spTR0|͓_x{a -gDB{;uSTyj{QE!YӁuX.$t_?I X0pI rjG $L4[{xw{Fj Fv%2N${}go0,#kvU2.Rʀsf0ضH" 4.~[3#6U; Wg Sd}>RZ~;tߩ07E)bDe ?y.Fu`<LJL!E<]|<(17> „o'3hMqOP_NOzdz0~Ilr1"~ Hf} m(L~.NlKy cIg. =V^W Medvcۇ=:)̩B$xia2e(/&GS \RZ䃸INė O* kg #._g?Ÿpqz|xk+D3a,fN㣣z/1)%|8'{p2^Hp'#BmiXL! ds@phtep [OphMWXfz4o3mnhaJ,V1qu]oʷH4t99gYKTafTE&A ^z[Z }\skGx0xTW44~׽oyh;Fxόȧ)1ZY7bMwOۮbf$f4vt/ WfOy8[~;]X^GjfW¿貁TLJHtj@t]8 uF! {'٢xsҬoJܪŭ/:*,FW! Ox󣟻1F2ߥޡ= CSy?+cD=J6#'/QƾK%nl( #!sC A>J "(Vaws;dʹ0+ɫ7SlJ.}xEVEK8~q&e!/WĬֆK7y?uL ullvzD+F-0GT$j vqNW@ɗ 5uU.͸9?ԫ`\s$@ėJ 1e?lu$O;鲮T*rluuhRqG~1 Bg͎\GM+j8j'"onfRCGUUZA>J7CB{تγkb'}*#v4gmw]|r~jMEOZo+(KQCՉ{90QOZ^Ҽb4WvYT\hr޾~-_JI"DflK_<vjM4J~KM֪g,8EhXb:~#dV-_R0{ة* y :~U!~g]a 킩[r_+&p=fXyOt9:đ= %1Hs$K#dk aYbDIz'r}[}ŻPVGc%$mxõ&5b݈lThthO=ZIՑR {wx⠯]Z6w2Ѥj: jJBvlE8Q8@ %a.sb~?ˏzuphpmvault/.git/objects/e9/0000775000000000000000000000000011025655655012774 5ustar uphpmvault/.git/objects/e9/99884c15287c43ec797711ecfc8421903a931b0000444000000000000000000000025011025655655017645 0ustar xK0 Egq> ,+pmS"Q0`t L9Gs@4z3cLTYB(cbaL=7{v0"aVBtX%i@lCt>'kgi|WYC.1{ݶn):;̶<~$G,uphpmvault/.git/objects/85/0000775000000000000000000000000011030360277012700 5ustar uphpmvault/.git/objects/85/2b12d13997480d354c5d1686139969da8e8a380000444000000000000000000000021311030360277017472 0ustar x M0P=ŷT#d ĕ Wz0oolHM=9o#aœjdl=$wG)`́H-^Ew;8phVK x+\%BuCڢHZ/+Uuphpmvault/.git/objects/04/0000775000000000000000000000000011033557552012676 5ustar uphpmvault/.git/objects/04/87a74c96802f85be9c3959792b6eafa140000b0000444000000000000000000000046011033557552017701 0ustar x+)JMU066b040031Qpsg*8!F}cx# WQ5< U⛘ yE-ke4&d);L511Ԥ<շ;%o8eX5%'3*um #Źk&}k|(%5yP%ɩ%yz KHm5NԦ oܠ 2JҀ}#y8Bif{'*܎Cd%Y08>Ǡt~sZ;h6EDљqn'8uphpmvault/.git/objects/80/0000775000000000000000000000000011025655655012706 5ustar uphpmvault/.git/objects/80/26e0676a8ec7a00cb78edfd795d8b39d8ab00d0000444000000000000000000000006611025655655020270 0ustar x+)JMU06g040031QH/,L(aXz> );.J\uphpmvault/.git/objects/46/0000775000000000000000000000000011557563433012712 5ustar uphpmvault/.git/objects/46/ee88450dd05788a00bc7b6d98e1ddc236d6ac20000444000000000000000000000032211557563433020202 0ustar x+)JMU024b040031QHHKOOgXx`Z7]6>Sc%[܂~F Ηݞ# 8u'7= ݖp]Up%E% vo~?AKX UWZ I ~>@]7jMMJs NTQhxM{HN_Juphpmvault/.git/objects/32/0000775000000000000000000000000011025616714012674 5ustar uphpmvault/.git/objects/32/5b5688468b88166f1af417d2b4f51647d1b8240000444000000000000000000001070311025616714017546 0ustar xZkSH>_ͯ&f͒ZNfٜKX] ajLuL$[88Zb9ׁYzy s54:bndqCCRߋT4q*4WF^%0d#Ywpr\6`,D,"}/ũ[bHް D+F B Q+?c0CZgI^h/g O/'dhֹ^pʹ蕇veaP)v%2 x2rPu<ZcDȽ;;F xd0nN-^PzH"K>"K5L83I4\FaS.H R!\+ǩ7 YZXpU~jo=_gkd߳葝 QhΏ bd'Q量be/7`}.\21&#!Y-5h NJnfҹl](1"5d_BҐe+ꜳe XFܘPPINx"͆]wU/ Q g,CCVr:GoSm;$wkjQO/mÅ-jY#*78fD$Dt qlC鶊AՎs} Ps3tVϵ2ʆKV/A.*aveis+GnÕ? &#d@Mk(HK aqwr<"SGbb:dRt5~K,%hLMlFk [^HrkGZ#?241JҦ̗#_ȍ$srkPً`t!P$'fMbFr͍YIYt(ПّgEnnv&6$Yc>#@MƊi.&c9B"(u2W1d[WQ|2z)?*{ ؽ1,I9JG!i]̸r'{JƐ`TP,UyIcIvg b"(]J?K5f'1o`R,׷>΄)vYTB?Q R} " Aa@"8U?߀5 \ X[ iw/񦈭e":{Ry)54ZZ5 72nvʡ%*$κj=09TN;Q+ŀ?lz Q AAD'[z3!5oW W3=Z mXn KKMWm!dz } kdYJI6aFSHp?GRӡϦlR_ 鋼?&cm`iFڑ5p1霽1/`L f-Pux fU'߀FeJz\kaX+OsdUWkB[$)hpd#Mah_]VNqfT XSn }VNΞ>=6MAn;Nc\#C 5 '/ZKr #gT2Gԃm;=s$AR0DO6K@=s)_oI1ߝ DuFȏ+,'8)vLEߚ(#rL o %Tk0łKo(*wx1! ~ uOx} c|&rr'b\![i Dk nҚa@7 ێDS9O^ʸVH\a/g51 A] DV=C?|3ܔRO ^cHsѳ s-+vF:\D.Ihڰº>6Wgn C-x&63.ju4ǿ· 11xi)r|[:A@KH_s8L ʊv#a} ~F#;yڬ tTR8`'. vMk|SĈocC*#w)܈dSvk_auVדh9a>~W;>^(`Gw0/%{*^c}[>Hn|ȇoRwUmGآ*xe@pVrWyG@ <$|+yc|1g" dՒ!@ [I<'"l<r-Le˕r ߤ CBƜRhk/\jħg6f[d)k s Ps񱛯V |BAXOrg!uphpmvault/.git/objects/10/0000775000000000000000000000000011030361225012656 5ustar uphpmvault/.git/objects/10/b097320e8d3e26d29d4cc1bd32adca9b78ed6d0000444000000000000000000000021511030361225020301 0ustar x9 S@,%+J.U^bcW3h$L`l$}F߹fCCDMƦ!tm`߇e)xON\*<{*XGkԣ]ag F-uphpmvault/.git/objects/pack/0000775000000000000000000000000011025616626013370 5ustar uphpmvault/.git/objects/ba/0000775000000000000000000000000011557563433013043 5ustar uphpmvault/.git/objects/ba/8452be1d342fc548e6ac008af3baebebd6a0f70000444000000000000000000000106711557563433020541 0ustar xS]o0k+h")e]V$Z;iZdC@`Ze}אuOC\߯s|| 4`8p3"62&{wGev!'{\8gAs]!o0v7c(BAmcΣw`Ml[@Ggq X %c"d E[uphpmvault/.git/HEAD0000664000000000000000000000002711025616626011444 0ustar ref: refs/heads/master uphpmvault/.git/info/0000775000000000000000000000000011025616626011754 5ustar uphpmvault/.git/info/exclude0000664000000000000000000000036011025616626013327 0ustar # git-ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ uphpmvault/.git/branches/0000775000000000000000000000000011025616626012606 5ustar uphpmvault/.git/index0000664000000000000000000000213011557565156012062 0ustar DIRCJL)HWZ FC\G Y0z%1COPYINGMM mR4/H֠MakefileMgMg O[f=Ԍ)Idebian/changelogJL)Ha6 P=`C۝,( debian/compatJL)HnD QfQ`~mA:r]debian/controlJL)H\yG R*fՇ`"S8mdebian/copyrightJL)Hn܁ T _HנQ-debian/manpagesJL)HaB U%Xq1aY0L` debian/rulesJL)HW[Z s*8D2mN)dumpw.ccJL)HW[N WЅM]mndumpw.hJL)HW[- P7g+2$ZF exception.hJL)HW[ aox-勳? xF' oprintf.hJL)Hn` BA)B"/TI6lm uphpmvault.8MM 9QW4j!]ՆCGqȳt uphpmvault.ccORsVX3Ї ,uphpmvault/.git/COMMIT_EDITMSG0000664000000000000000000000110611557565173013120 0ustar Lame release to fix source archive inclusion of git control files. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # modified: debian/changelog # # Untracked files: # (use "git add ..." to include in what will be committed) # # debian/files # debian/uphpmvault.debhelper.log # debian/uphpmvault.substvars # debian/uphpmvault/ # dumpw.o # uphpmvault # uphpmvault.o # uphpmvault_unstripped uphpmvault/.git/config0000664000000000000000000000013411025616626012207 0ustar [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true uphpmvault/.git/logs/0000775000000000000000000000000011025616751011764 5ustar uphpmvault/.git/logs/refs/0000775000000000000000000000000011025616751012723 5ustar uphpmvault/.git/logs/refs/heads/0000775000000000000000000000000011025616751014007 5ustar uphpmvault/.git/logs/refs/heads/master0000664000000000000000000000340511557565173015242 0ustar 0000000000000000000000000000000000000000 e22ca0169000e8b82d5d11ad3adc6eed30a6ae74 Marc Singer 1213668841 -0700 commit (initial): Initia repository for HP Media Vault recovery program e22ca0169000e8b82d5d11ad3adc6eed30a6ae74 e999884c15287c43ec797711ecfc8421903a931b Marc Singer 1213684653 -0700 commit: Added copyright messages e999884c15287c43ec797711ecfc8421903a931b 07ab8fc5572281f1db8de4dc0efdde002b3cec87 Marc Singer 1214019749 -0700 commit: Ignoring beacons with empty IP addresses. 07ab8fc5572281f1db8de4dc0efdde002b3cec87 78f42f905849b16f8818337b2dbeb28dc9c2f10a Marc Singer 1214117333 -0700 commit: Changed from reading input file to mmap'ing it. 78f42f905849b16f8818337b2dbeb28dc9c2f10a 92d7bd7ba468bf6b5ce4dd07e8cb3156baf81dc0 Marc Singer 1214289556 -0700 commit: Added argp support. 92d7bd7ba468bf6b5ce4dd07e8cb3156baf81dc0 bf708f4765d3f1c9b4cc8472d12d9a60e2357925 Marc Singer 1214374089 -0700 commit: Preparing initial release for Debian. bf708f4765d3f1c9b4cc8472d12d9a60e2357925 2494d64c179fa7bfca25f9993a6b389578d967b3 Marc Singer 1215225726 -0700 commit: Fixed package build for Debian. 2494d64c179fa7bfca25f9993a6b389578d967b3 21f1015e603ec04fe7dd26157cef44f9d3428614 Marc Singer 1215226419 -0700 commit: Added build target to Makefile to document how to build within git 21f1015e603ec04fe7dd26157cef44f9d3428614 2828f9e8e880eb468c110b078ea52660b1bf3844 Marc Singer 1304356635 -0700 commit: Fixing bug opened on package due to GCC 4.6 2828f9e8e880eb468c110b078ea52660b1bf3844 b7d262efbdf02b036ffe9f744819bc10d78e4b75 Marc Singer 1304357486 -0700 commit: Lame release to fix source archive inclusion of git control files. uphpmvault/.git/logs/HEAD0000664000000000000000000000340511557565173012425 0ustar 0000000000000000000000000000000000000000 e22ca0169000e8b82d5d11ad3adc6eed30a6ae74 Marc Singer 1213668841 -0700 commit (initial): Initia repository for HP Media Vault recovery program e22ca0169000e8b82d5d11ad3adc6eed30a6ae74 e999884c15287c43ec797711ecfc8421903a931b Marc Singer 1213684653 -0700 commit: Added copyright messages e999884c15287c43ec797711ecfc8421903a931b 07ab8fc5572281f1db8de4dc0efdde002b3cec87 Marc Singer 1214019749 -0700 commit: Ignoring beacons with empty IP addresses. 07ab8fc5572281f1db8de4dc0efdde002b3cec87 78f42f905849b16f8818337b2dbeb28dc9c2f10a Marc Singer 1214117333 -0700 commit: Changed from reading input file to mmap'ing it. 78f42f905849b16f8818337b2dbeb28dc9c2f10a 92d7bd7ba468bf6b5ce4dd07e8cb3156baf81dc0 Marc Singer 1214289556 -0700 commit: Added argp support. 92d7bd7ba468bf6b5ce4dd07e8cb3156baf81dc0 bf708f4765d3f1c9b4cc8472d12d9a60e2357925 Marc Singer 1214374089 -0700 commit: Preparing initial release for Debian. bf708f4765d3f1c9b4cc8472d12d9a60e2357925 2494d64c179fa7bfca25f9993a6b389578d967b3 Marc Singer 1215225726 -0700 commit: Fixed package build for Debian. 2494d64c179fa7bfca25f9993a6b389578d967b3 21f1015e603ec04fe7dd26157cef44f9d3428614 Marc Singer 1215226419 -0700 commit: Added build target to Makefile to document how to build within git 21f1015e603ec04fe7dd26157cef44f9d3428614 2828f9e8e880eb468c110b078ea52660b1bf3844 Marc Singer 1304356635 -0700 commit: Fixing bug opened on package due to GCC 4.6 2828f9e8e880eb468c110b078ea52660b1bf3844 b7d262efbdf02b036ffe9f744819bc10d78e4b75 Marc Singer 1304357486 -0700 commit: Lame release to fix source archive inclusion of git control files. uphpmvault/COPYING0000664000000000000000000004310311025655276011220 0ustar GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. uphpmvault/dumpw.h0000644000000000000000000000112711025655516011465 0ustar /** @file dumpw.h written by Marc Singer 4 Jun 2008 Copyright (C) 2008 Marc Singer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Please refer to the file debian/copyright for further details. */ #if !defined (__DUMPW_H__) # define __DUMPW_H__ /* ----- Includes */ /* ----- Types */ /* ----- Globals */ /* ----- Prototypes */ void dumpw (const char *rgb, int cb, unsigned long index, int width); #endif /* __DUMPW_H__ */ uphpmvault/dumpw.cc0000644000000000000000000000264311025655532011625 0ustar /** @file dumpw.cc written by Marc Singer 4 Jun 2008 Copyright (C) 2008 Marc Singer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Please refer to the file debian/copyright for further details. @brief Routine to perform a hexadecimal dump (hd) of a buffer. */ #include #include #include #include void dumpw (const char *rgb, int cb, unsigned long index, int width) { int i; if ((width == 2 && ((unsigned long) rgb & 1)) || (width == 4 && ((unsigned long) rgb & 3))) { printf ("%s: unable to display unaligned data\n", __FUNCTION__); return; } while (cb > 0) { printf ("%08lx: ", index); for (i = 0; i < 16; ++i) { if (i < cb) { switch (width) { default: case 1: printf ("%02x ", (unsigned char) rgb[i]); break; case 2: printf ("%04x ", *((uint16_t *) & rgb[i])); ++i; break; case 4: printf ("%08x ", *((uint32_t *) & rgb[i])); i += 3; break; } } else printf (" "); if (i % 8 == 7) putchar (' '); } for (i = 0; i < 16; ++i) { if (i == 8) putchar (' '); putchar ((i < cb) ? (isprint (rgb[i]) ? rgb[i] : '.') : ' '); } printf ("\n"); cb -= 16; index += 16; rgb += 16; } } uphpmvault/uphpmvault.cc0000664000000000000000000003501007414221726012673 0ustar /** @file uphpmvault.cc written by Marc Singer 8 Jun 2008 Copyright (C) 2008 Marc Singer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Please refer to the file debian/copyright for further details. @brief Upload recovery firmware to an HP Media Vault (MV2). The U-BOOT boot loader on the Media Vault will enter a recovery mode if the firmware fails to load or if the device is powered on while the reset button is pressed. This program watches for 'beacon' broadcast message UDP packets from Media Vault devices on the local Ethernet network. It will upload a firmware image using TFTP [1] to the first found MediaVault. [1] http://www.faqs.org/rfcs/rfc1350.html NOTES ----- o The address received from the beacon packet is not the address we use to send the TFTP commands. Instead, we use the address in the UDP header since that will be most reliable. Still, we require that the IP address in the beacon be non-zero. o The main loop should wait for beacon packets for a little more than 5 seconds before initiating a recovery. If there are several devices waiting for recovery, we'll have seen them all. If there is more than one, a command line switch will distinguish between them. o poll vs. epoll. We're using poll because we aren't a high performance application and the semantics of poll are simpler for our application. With epoll, we'd have to read from the beacon socket until we saw an EWOULDBLOCK before entering epoll. With poll, we can simply call poll and wait. o Need to add a check for an application timeout if we don't receive ACKs or when there are no Beacons. o Note that the number of blocks sent will include an empty block if the file is an even multiple 512 bytes, per the RFC. o There is no real retry logic. We should at least be able to cope with dropped acknowledgements. o alloca is used in favor of stack arrays of characters to guarantee alignment. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "dumpw.h" #include "exception.h" #include "oprintf.h" const char* argp_program_version = "uphpmvault 0.5"; struct arguments { arguments () : szImageFile (NULL), verbose (false), quiet (false) {} const char* szImageFile; bool verbose;; bool quiet; }; struct argp_option options[] = { // { "verbose", 'v', 0, 0, "Verbose output, when available" }, { "quiet", 'q', 0, 0, "Suppress output" }, { 0 } }; error_t arg_parser (int key, char* arg, struct argp_state* state); struct argp argp = { options, arg_parser, "FILE", " Upload recovery firmware to HP MediaVault (MV2) devices awaiting recovery.\n" "\v" "This program listens for broadcast beacon packets on any network\n" "interface from HP MediaVault devices in recovery mode. On receipt of\n" "a valid beacon message, the application will upload the specified\n" "firmware image file to the device and then terminate.\n" "\n" "The format of the recovery image is a pair of U-BOOT image files,\n" "concatenated with padding between them such that the second image\n" "starts exactly 2MiB from the beginning of the combined image file.\n" "The first U-BOOT image is a Linux kernel and the second is an initrd\n" "or initramfs.\n" }; error_t arg_parser (int key, char* arg, struct argp_state* state) { struct arguments& args = *(struct arguments*) state->input; switch (key) { case 'v': args.verbose = true; break; case 'q': args.quiet = true; break; case ARGP_KEY_ARG: if (args.szImageFile) argp_error (state, "only one image file is permitted"); args.szImageFile = arg; break; case ARGP_KEY_END: if (!args.szImageFile) argp_error (state, "you must specify an image file"); break; default: return ARGP_ERR_UNKNOWN; } return 0; }; /** Enumeration of the system state. */ enum { Idle = 0, ///< Waiting for a beacon BeaconReceived, ///< Beacon detected WRQSent, ///< TFTP Write RQ sent Acked, ///< ACK received to last command DataSent, ///< Data packet sent Done, ///< Upload complete }; #define PACKET_TYPE_RECOVERY_MODE (0xde) #define PORT_BEACON (8488) #define VERSION_BEACON (1) ///< Only one version of Beacon recognized #define STATE_RECOVERY (1) ///< Only one state exists /** Payload of a Beacon message. */ struct Beacon { // header uint8_t packet_type; ///< Beacon packet type uint8_t version; // payload uint16_t state; uint8_t ip_addr[4]; ///< IP address of device (redundant) uint8_t mac_addr[6]; ///< MAC address of device (redundant) uint8_t szName[16]; ///< Name of device manufacturer uint8_t szModel[50]; ///< Model name of device Beacon () { bzero (this, sizeof (*this)); } bool is (void) { return version == VERSION_BEACON && packet_type == PACKET_TYPE_RECOVERY_MODE && state == STATE_RECOVERY; } bool is_mediavault2 (void) { return strcasecmp ((const char*) szName, "HP P2 NAS") == 0; } bool is_valid (void) { return ip_addr[0] | ip_addr[1] | ip_addr[2] | ip_addr[3]; } } __attribute__((packed)); std::ostream& operator<< (std::ostream& o, const Beacon& b) { o << oprintf ("%-16.16s %02x:%02x:%02x:%02x:%02x:%02x (%d.%d.%d.%d)", b.szName, b.mac_addr[0], b.mac_addr[1], b.mac_addr[2], b.mac_addr[3], b.mac_addr[4], b.mac_addr[5], b.ip_addr[0], b.ip_addr[1], b.ip_addr[2], b.ip_addr[3]); return o; } #define PORT_TFTP (69) #define TFTP_OP_RRQ 1 #define TFTP_OP_WRQ 2 #define TFTP_OP_DATA 3 #define TFTP_OP_ACK 4 #define TFTP_OP_ERROR 5 #define TFTP_OP_OACK 6 #define TFTP_ERROR_NONE 0 #define TFTP_ERROR_FILENOTFOUND 1 #define TFTP_ERROR_ACCESSERROR 2 #define TFTP_ERROR_DISKFULL 3 #define TFTP_ERROR_ILLEGALOP 4 #define TFTP_ERROR_UNKNOWNID 5 #define TFTP_ERROR_FILEEXISTS 6 #define TFTP_ERROR_NOUSER 7 #define TFTP_ERROR_OPTIONTERMINATE 8 #define US_BETWEEN_RETRIES (100*1000) #define C_RETRIES (5) #define CB_DATA_PAYLOAD (512) // Default DATA payload size #define MS_TIMEOUT_POLL (200) struct message_tftp { uint16_t opcode; uint8_t data[]; } __attribute__((packed)); /** Berkeley UDP socket wrapper class. It can open a listening socket for either a specific port, or an OS selected port. */ struct Socket { int m_port; int m_s; Socket () : m_port (0), m_s (-1) {} Socket (int port) : m_port (port), m_s (-1) {} void open_udp (void) { struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl (INADDR_ANY); addr.sin_port = htons (m_port); m_s = ::socket (AF_INET, SOCK_DGRAM, 0); if (m_s == -1) throw Exception ("unable to create socket"); int options = ::fcntl (m_s, F_GETFL, 0); if (::fcntl (m_s, F_SETFL, options | O_NONBLOCK) != 0) throw Exception ("unable to make socket non-blocking"); if (::bind (m_s, (struct sockaddr*) &addr, sizeof (addr)) != 0) throw Exception ("unable to bind socket"); // printf ("m_port %d m_s %d\n", m_port, m_s); // Recover port if we've asked OS to pick one if (m_port == 0) { socklen_t cbAddr = sizeof (addr); if (::getsockname (m_s, (struct sockaddr*) &addr, &cbAddr) != 0) throw Exception ("unable to get socket address"); m_port = ntohs (addr.sin_port); }} }; /** Simple TFTP serving class. The base class is the UDP socket class to handle opening the listening socket. There are methods to send the important TFTP protocol elements. */ struct TFTP : Socket { struct sockaddr m_addr; TFTP () { } TFTP (int port) : Socket (port) { } void bind (struct sockaddr addr) { m_addr = addr; ((struct sockaddr_in*) &m_addr)->sin_port = htons (PORT_TFTP); } void set_port (int port) { ((struct sockaddr_in*) &m_addr)->sin_port = htons (port); } /** Send write request for named file. The file type will be 'octet'. */ void wrq (const char* szFile) { static const char szMode[] = "octet"; int cbMessage = sizeof (struct message_tftp) + strlen (szFile) + 1 + strlen (szMode) + 1; char* rgb = (char*) alloca (cbMessage); ssize_t cb; struct message_tftp& m = *(struct message_tftp*) rgb; m.opcode = htons (TFTP_OP_WRQ); cb = sizeof (m); cb += snprintf (rgb + cb, cbMessage - cb, "%s", szFile) + 1; cb += snprintf (rgb + cb, cbMessage - cb, "%s", szMode) + 1; // dumpw (rgb, cb, 0, 0); for (int retries = C_RETRIES; retries--; ) { ssize_t cbSent = sendto (m_s, rgb, cb, 0, &m_addr, sizeof (m_addr)); // printf ("sendto: %d -> %d\n", cb, cbSent); if (cb == cbSent) break; if (retries) { usleep (US_BETWEEN_RETRIES); continue; } throw ResultException (errno, "error sending WRQ on %d (%s)", m_s, strerror (errno)); } } /** Send write data. The block index starts with 1. The size of the buffer to send may reference all of the data remaining in the file. This function will only send messages of the negotiated size, probably 512 bytes. The return value is the number of bytes transmited. */ size_t wdata (int block, const char* rgb, size_t cb) { size_t cbSend = cb; if (cbSend > CB_DATA_PAYLOAD) cbSend = CB_DATA_PAYLOAD; size_t cbPacket = sizeof (message_tftp) + 2 + cbSend; char* rgbPacket = (char*) alloca (cbPacket); message_tftp& msg = *(message_tftp*) rgbPacket; msg.opcode = htons (TFTP_OP_DATA); { unsigned short s = htons (block); memcpy (msg.data, &s, sizeof (s)); } memcpy (msg.data + 2, rgb, cbSend); // printf ("sending data block %d %d bytes\n", block, cbSend); // dumpw (rgbPacket, 16, 0, 0); for (int retries = C_RETRIES; retries--; ) { ssize_t cbSent = sendto (m_s, rgbPacket, cbPacket, 0, &m_addr, sizeof (m_addr)); // printf ("sendto: %d %d\n", sizeof (rgbPacket), cbSent); if (cbSent == (ssize_t) cbPacket) break; if (retries) { usleep (US_BETWEEN_RETRIES); continue; } throw ResultException (errno, "error sending %d DATA on %d (%d '%s')", cbSend, m_s, errno, strerror (errno)); } return cbSend; } }; /** UDP/TFTP server loop and state machine. It waits for broadcast beacon messages and uploads the recovery image when it finds receives a valid beacon. The cBlocks calculation rounds up and may add a full extra block if the file to send is an even multiple of the block size, per the RFC. */ void server (struct arguments& args, void* pvFile, size_t cbFile) { Socket sBeacon = Socket (PORT_BEACON); sBeacon.open_udp (); TFTP tftp; Beacon b; tftp.open_udp (); struct pollfd fds[] = { { sBeacon.m_s, POLLIN, 0 }, { tftp.m_s, POLLIN, 0 }, }; int result; int state = Idle; int block = 0; int cBlocks = (cbFile + CB_DATA_PAYLOAD)/CB_DATA_PAYLOAD; size_t ibFile = 0; struct sockaddr addr; socklen_t cbAddr = sizeof (addr); while (state != Done) { char rgb[1500]; int cb; switch (state) { // Read from our sockets case Idle: case WRQSent: case DataSent: if ((result = poll (fds, sizeof (fds)/sizeof (*fds), MS_TIMEOUT_POLL)) > 0) { // Read Beacon if (fds[0].revents & POLLIN) { cb = recvfrom (sBeacon.m_s, rgb, sizeof (rgb), 0, &addr, &cbAddr); if (cb > 0 && !b.is ()) { memcpy (&b, rgb, sizeof (b)); bool recover = state == Idle && b.is_mediavault2 () && b.is_valid (); if (!args.quiet) std::cout << b << (recover ? "" : " [ignoring]") << std::endl; if (state == Idle && b.is_mediavault2 () && b.is_valid ()) { if (!args.quiet) { printf ("Recovering %02x:%02x:%02x:%02x:%02x:%02x\n", b.mac_addr[0], b.mac_addr[1], b.mac_addr[2], b.mac_addr[3], b.mac_addr[4], b.mac_addr[5]); printf ("Sending file of %d bytes in %d blocks of %d bytes\n", int (cbFile), cBlocks, CB_DATA_PAYLOAD); } tftp.bind (addr); state = BeaconReceived; } } } // Read ACKs if (fds[1].revents & POLLIN) { if ((cb = recvfrom (tftp.m_s, rgb, sizeof (rgb), 0, &addr, &cbAddr) > 0)) { uint16_t opcode; memcpy (&opcode, rgb + offsetof (message_tftp, opcode), sizeof (opcode)); opcode = ntohs (opcode); uint16_t blockAck; memcpy (&blockAck, rgb + offsetof (message_tftp, data), sizeof (blockAck)); blockAck = ntohs (blockAck); if (opcode == TFTP_OP_ACK && blockAck == block) { if (state == WRQSent) tftp.set_port (ntohs (((sockaddr_in*)&addr)->sin_port)); state = Acked; ++block; } } } } break; // We've seen a beacon, send the write request case BeaconReceived: tftp.wrq ("uImage"); // The name, itself, is unimportant state = WRQSent; break; // We've been ACKd, send another block or terminate case Acked: if (block - 1 >= cBlocks) { state = Done; break; } ibFile += tftp.wdata (block, (const char*) pvFile + ibFile, cbFile - ibFile); state = DataSent; break; } } } int main (int argc, char** argv) { struct arguments args; argp_parse (&argp, argc, argv, 0, 0, &args); int fh = ::open (args.szImageFile, O_RDONLY); if (fh == -1) { printf ("unable to open file %s\n", args.szImageFile); exit (2); } struct stat stat; ::fstat (fh, &stat); size_t cb = stat.st_size; void* pv = ::mmap (0, cb, PROT_READ, MAP_FILE | MAP_SHARED, fh, 0); if (!args.quiet) { printf ("Recovery image %s is %d bytes\n", args.szImageFile, int (cb)); printf ("Waiting for broadcast beacon packets.\n"); printf ("Press ^C to cancel\n"); } try { server (args, pv, cb); } catch (const Exception& e) { printf ("exception: %s\n", e.sz); } catch (...) { printf ("exception: \n"); } return 0; } uphpmvault/exception.h0000644000000000000000000000221111025655455012324 0ustar /** @file exception.h written by Marc Singer 22 Feb 2008 Copyright (C) 2008 Marc Singer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Please refer to the file debian/copyright for further details. */ #if !defined (__EXCEPTION_H__) # define __EXCEPTION_H__ /* ----- Includes */ #include /* ----- Types */ struct Exception { char* sz; void initialize (const char* szFmt, va_list ap) { size_t cb = 256; sz = new char[cb]; vsnprintf (sz, cb, szFmt, ap); } Exception () : sz (NULL) {} Exception (const char* szFmt, ...) { va_list ap; va_start (ap, szFmt); initialize (szFmt, ap); va_end (ap); } ~Exception () { delete sz; } }; struct ResultException : public Exception { int result; ResultException (int _result, const char* szFmt ...) { result = _result; va_list ap; va_start (ap, szFmt); initialize (szFmt, ap); va_end (ap); } }; /* ----- Globals */ /* ----- Prototypes */ #endif /* __EXCEPTION_H__ */ uphpmvault/debian/0000775000000000000000000000000011604127521011374 5ustar uphpmvault/debian/compat0000664000000000000000000000000211030350466012571 0ustar 7 uphpmvault/debian/control0000664000000000000000000000154611033554104013002 0ustar Source: uphpmvault Section: utils Priority: optional Build-Depends: debhelper (>= 7) Maintainer: Marc Singer Standards-Version: 3.7.3 Vcs-Git: git://scarlet.buici.com/uphpmvault Package: uphpmvault Architecture: any Section: utils Depends: ${shlibs:Depends}, ${misc:Depends} Description: upload recovery images to HP MediaVault2 via Ethernet The HP MediaVault--generation 2 a.k.a MV2--implements a custom recovery protocol for rescuing a device when the operating system image is corrupt. The uphpmvault application listens for broadcast Ethernet packets from an MV2 devices waiting for recovery. On receipt of one of these 'beacon' packets, uphpmvault transmits a recovery image to the waiting device which will automatically boot the recovery image. . The primary purpose of this application is for installing Debian GNU/Linux on an MV2. uphpmvault/debian/rules0000775000000000000000000000003511030347502012446 0ustar #!/usr/bin/make -f %: dh $@ uphpmvault/debian/changelog0000664000000000000000000000204711604127336013255 0ustar uphpmvault (0.8) unstable; urgency=low * Added stddef.h s.t. offsetof macro is available. Required by GCC 4.6. (closes: bug#632569) -- Marc Singer Sun, 03 Jul 2011 11:02:58 -0700 uphpmvault (0.7) unstable; urgency=low * Releasing a second time to remove git control files from source archive. -- Marc Singer Mon, 02 May 2011 10:31:16 -0700 uphpmvault (0.6) unstable; urgency=low * GCC 4.6 changes (exposes) a missing prototype for ::fstat. Including the proscribed headers solves issue. (closes: bug#624912) * Fixed type-pun warnings. * Fixed sizeof in printf warning exposed on 64 bit host. -- Marc Singer Mon, 02 May 2011 10:12:31 -0700 uphpmvault (0.5) unstable; urgency=low * Added 'install' target to Makefile. Package not much good without it. * Added man page. -- Marc Singer Fri, 04 Jul 2008 14:39:30 -0700 uphpmvault (0.4) unstable; urgency=low * First release of package. -- Marc Singer Tue, 24 Jun 2008 22:03:45 -0700 uphpmvault/debian/manpages0000664000000000000000000000001511033556201013103 0ustar uphpmvault.8 uphpmvault/debian/copyright0000664000000000000000000000205211027074507013332 0ustar This program is written, maintained, and packaged for Debian by Marc Singer . The upstream source may be found on this web site http://scarlet.buici.com/git. Copyright (C) 2008 Marc Singer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. The full text of the GPL copyright may be found in the original source tarball in the COPYING file file, or on your Debian system here: file:///usr/share/common-licenses/GPL uphpmvault/oprintf.h0000644000000000000000000000154111025655421012005 0ustar /** @file oprintf.h written by Marc Singer 30 Aug 2007 Copyright (C) 2007 Marc Singer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Please refer to the file debian/copyright for further details. */ #if !defined (__OPRINTF_H__) # define __OPRINTF_H__ /* ----- Includes */ #include #include /* ----- Types */ struct oprintf { char sz[512]; oprintf (const char* szFormat, ...) { va_list ap; va_start (ap, szFormat); vsnprintf (sz, sizeof (sz), szFormat, ap); va_end (ap); } friend std::ostream& operator<< (std::ostream& o, const oprintf& op) { return o << op.sz; } }; /* ----- Globals */ /* ----- Prototypes */ #endif /* __OPRINTF_H__ */ uphpmvault/Makefile0000664000000000000000000000215511557562346011634 0ustar # Makefile TARGETS:=uphpmvault uphpmvault_SRCS:=uphpmvault.cc dumpw.cc OBJ = $(patsubst %.c,$O%.o,$(patsubst %.cc,$O%.o,$1)) uphpmvault_OBJS := $(uphpmvault_SRCS) uphpmvault_OBJS := $(call OBJ,$(uphpmvault_OBJS)) CC:=gcc CXX:=g++ CFLAGS:=-O2 -g LFLAGS:=-g CFLAGS += -Wall -Wformat -Wstrict-aliasing .PHONY: all all: $(TARGETS) # --- Target Rules uphpmvault: $(uphpmvault_OBJS) @echo "LINK " $@ @$(CXX) -o $@ $^ $(LFLAGS) @cp $@ $@_unstripped @strip $@ .PHONY: install install: install -d $(DESTDIR)/usr/bin install -s uphpmvault $(DESTDIR)/usr/bin .PHONY: build build: # Override MAKELEVEL or the debian-helpers get mad MAKELEVEL= dpkg-buildpackage -I.git # --- Inference Rules $O%.o: %.c @printf "COMPILE %-30.30s %s\n" "$@" "$(CFLAGS) $(CFLAGS_C)" @$(CXX) -c $(CFLAGS) $(CFLAGS_C) -o $@ $< $O%.o: %.cc @printf "COMPILE %-30.30s %s\n" "$@" "$(CFLAGS) $(CFLAGS_CXX)" @$(CXX) -c $(CFLAGS) $(CFLAGS_CXX) -o $@ $< # --- Maintenance Rules .PHONY: tidy tidy: -rm *~ .PHONY: clean distclean clean distclean: @echo "CLEAN" @touch _clean @-rm _clean $(wildcard *.o *~ $(TARGETS) *_unstripped)