fsprotect-1.0.6/0000750000000000000000000000000011725370533010416 5ustar fsprotect-1.0.6/debian/0000750000000000000000000000000011725403405011633 5ustar fsprotect-1.0.6/debian/postrm0000640000000000000000000000160011277240023013075 0ustar #!/bin/sh # postrm script for block # # see: dh_installdeb(1) set -e # summary of how this script can be called: # * `remove' # * `purge' # * `upgrade' # * `failed-upgrade' # * `abort-install' # * `abort-install' # * `abort-upgrade' # * `disappear' # # for details, see http://www.debian.org/doc/debian-policy/ or # the debian-policy package case "$1" in purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) ;; *) echo "postrm called with unknown argument \`$1'" >&2 exit 1 ;; esac which update-initramfs > /dev/null && update-initramfs -u > /dev/null #DEBHELPER# exit 0 fsprotect-1.0.6/debian/is_aufs.10000640000000000000000000000257411365033163013357 0ustar .\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH IS_AUFS 1 "March 21, 2009" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME is_aufs \- program to check whether a filesystem is an aufs filesystem .SH SYNOPSIS .B is_aufs .RI "\fIMOUNTPOINT\fR" .SH DESCRIPTION This manual page documents briefly the .B is_aufs command. .PP .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. \fBis_aufs\fP is a program that checks whether a filesystem (mountpoint) is aufs. .SH OPTIONS Pass the mountpoint as the parameter .SH SEE ALSO .BR aufs (5), .br .SH AUTHOR is_aufs was written by Stefanos Harhalakis .PP This manual page was written by Stefanos Harhalakis , for the Debian project (but may be used by others). fsprotect-1.0.6/debian/README.Debian0000640000000000000000000000470611365024022013676 0ustar fsprotect for Debian -------------------- fsprotect will only act when the "fsprotect" parameter is passed to the kernel. Also, it will be disabled if a "nofsprotect" parameter is passed to the kernel. This means that when having a "fsprotect" and a "nofsprotect" parameter at the same time, the nofsprotect will be used. when fsprotect is in effect, a /fastboot file is created preventing filesystem checks from init scripts. Without this, the boot process will fail on fsck. Using the "nofsprotect" argument will prevent the creation of /fastboot. fsprotect is very useful for computers with public access like libraries, labs, etc. It is essential to also prevent kernel parameters from being altered. To do this you should add a password to grub as well (if you use grub). aufs ---- In order for fsprotect to work, the system must support aufs. For debian systems: * For older kernels (<=2.6.30) install aufs-source and module-assistant and run: # m-a prepare aufs # m-a build aufs # m-a install aufs # update-initramfs -u * For more recent kernels (>=2.6.31-1) nothing is needed. They already include aufs as a module (see bug #541828). Documentation ------------- The complete documentation is in fsprotect.pdf. Please refer to that for more information. Root filesystem --------------- To enable fsprotect for the root filesystem add: fsprotect=size to kernel. size should be the size of the tmpfs. You should make sure that there is enough memory+swap space available. size parameter is optional but it is strongly suggested to be used. It is passed to mount(8) as the size option of the tmpfs. It can be one of: * A size in bytes with or without multiplicators: 512M, 1G, 1024K * A percentage of system's memory: 30% * "auto" to use 50% of system's memory - the default for tmpfs Other filesystems ----------------- To enable fsprotect for other filesystems edit /etd/default/fsprotect as needed Those filesystems will only be protected when fsprotect parameter is passed to the kernel. Currently there is no way to protect other filesystems without protecting /. Is there a reason to do so? fstab ----- If you want to use fsprotect you should have a look at your mount options, especially for the root filesystem. See bug #530241 (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=530241) Contact ------- For suggestions, bug reports, etc contact: Stefanos Harhalakis or file a bug report in debian's bugtracker. fsprotect-1.0.6/debian/control0000640000000000000000000000142011725370550013240 0ustar Source: fsprotect Section: admin Priority: extra Maintainer: Stefanos Harhalakis Build-Depends: cdbs, debhelper (>= 7) Standards-Version: 3.9.3 Homepage: http://www.v13.gr/ Package: fsprotect Architecture: all Depends: initramfs-tools, ${misc:Depends} Description: Helper scripts to make filesystems immutable This is a set of scripts that make immutable the root and other filesystems. Using aufs they pack a tmpfs filesystem and the filesystem forcing changes to be written to the tmpfs. . The root filesystem is protected by an initramfs script. Other filesystems are protected by an init script. All protected filesystems become read-only ensuring their immutability even on power-offs. . This can be used for public computers to prevent damage or changes. fsprotect-1.0.6/debian/fsprotect.docs0000640000000000000000000000002211365030031014500 0ustar doc/fsprotect.pdf fsprotect-1.0.6/debian/changelog0000640000000000000000000000535411725403347013522 0ustar fsprotect (1.0.6) unstable; urgency=low * Copy /usr/bin/touch as well to initramfs (Closes: #628796) * Standards version 3.9.3: + Machine readable copyright file. * Override lintian informational message about 'status' support in init script. * Change pointing license file to GPL-2 instead of GPL. Fixes lintian warning. -- Stefanos Harhalakis Mon, 27 Feb 2012 20:54:18 +0000 fsprotect (1.0.5) unstable; urgency=low * Add support for "auto" size to use 50% of system memory (Closes: #564141) * Restore [bd]ashism to avoid dependency on sed in initramfs stage. Since it is supported by dash it should not be a problem (Closes: #564141) * Fix permissions of tmpfs mounts: Root FS gets 755 and other FSs get the same ownership/permissions of the original fs. (Closes: #561640) * Drop dependency on aufs-modules and add run-time aufs check. This also drops the lintian override. (Closes: #566161) * Add a copy of the initramfs portion to nfs-bottom to be usable for nfs mounts. This was reported to work. (Closes: #564138) * Standards version 3.8.4. No changes needed. * Switched to CDBS * Changed is_aufs.1 section to 1 (was 8). * Install is_aufs in /bin instead of /sbin (thanks to LI Daobing for noting the incosistency) -- Stefanos Harhalakis Sun, 25 Apr 2010 12:52:36 +0300 fsprotect (1.0.4) unstable; urgency=low * Remove dependency on aufs-tools (Closes: #555636) * Standards version 3.8.3. No changes needed. * Remove full-path from update-initramfs call (Fixes lintian warnings). * Change init script dependency from mountall to $local_fs (Fixes lintian error) * Register fsprotect.pdf with doc-base (Fixes lintian info message). -- Stefanos Harhalakis Fri, 13 Nov 2009 12:39:53 +0200 fsprotect (1.0.3) unstable; urgency=low * Don't show "We don't want fsprotect" unless there is a 'nofsprotect' kernel option. (Closes: #530242) * Improved documentation a bit thanks to Martin T. Krafft. (Closes: #530243) * Fix bashism in initramfs local-bottom script. * Make fsprotect work with dirs-in-dirs -- Stefanos Harhalakis Sat, 23 May 2009 13:19:33 +0300 fsprotect (1.0.2) unstable; urgency=low * Documentation (fsprotect.pdf). * Standards version 3.8.1 * Create /fsprotect on-the-fly inside aufs-dir and remove /fsprotect/* from debian/dirs -- Stefanos Harhalakis Sun, 12 Apr 2009 15:32:11 +0300 fsprotect (1.0.1) unstable; urgency=low * Debian packaging fixes -- Stefanos Harhalakis Sun, 22 Mar 2009 23:29:45 +0200 fsprotect (1.0.0) unstable; urgency=low * Initial Release (Closes: #520765) -- Stefanos Harhalakis Sat, 21 Mar 2009 15:29:43 +0200 fsprotect-1.0.6/debian/source/0000750000000000000000000000000011725373752013146 5ustar fsprotect-1.0.6/debian/source/format0000640000000000000000000000001511365024202014335 0ustar 3.0 (native) fsprotect-1.0.6/debian/copyright0000640000000000000000000000175011725403230013566 0ustar Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: fsprotect Files: * Copyright: Copyright (C) 2009-2012 Stefanos Harhalakis License: GPL-2+ This package 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 package 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 package; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA . On Debian systems, the complete text of the GNU General Public License can be found in `/usr/share/common-licenses/GPL-2'. fsprotect-1.0.6/debian/fsprotect.install0000640000000000000000000000046411373040537015243 0ustar initramfs-tools/hooks/fsprotect /usr/share/initramfs-tools/hooks initramfs-tools/scripts/local-bottom/fsprotect /usr/share/initramfs-tools/scripts/local-bottom initramfs-tools/scripts/local-bottom/fsprotect /usr/share/initramfs-tools/scripts/nfs-bottom bin/is_aufs /bin lib/fsprotect-protect /lib/fsprotect/ fsprotect-1.0.6/debian/default0000640000000000000000000000071311161454566013214 0ustar # fsprotect configuration for protecting filesystems other than root # Protection will only be enabled when the "fsprotect=" parameter is passed to # the kernel # This is a space separated list of mountpoints to protect. # Only non-virtual filesystems are supported. # DON'T add / in here. Instead use the "fsprotect=" kernel parameter # Each entry is in the form "mountpoint" or "mountpoint=tmpfs_size" # Example: # PROTECT="/boot=100M /home=2G" PROTECT="" fsprotect-1.0.6/debian/fsprotect.doc-base0000640000000000000000000000032111277240734015246 0ustar Document: fsprotect Title: fsprotect Manual Author: Stefanos Harhalakis Abstract: This manual how fsprotect works. Section: System/Administration Format: PDF Files: /usr/share/doc/fsprotect/fsprotect.pdf.gz fsprotect-1.0.6/debian/init.d0000640000000000000000000000455611277240243012757 0ustar #! /bin/bash ### BEGIN INIT INFO # Provides: fsprotect # Required-Start: $local_fs # Required-Stop: # Default-Start: S # Default-Stop: # Short-Description: Lock/protect filesystems # Description: Lock/protect filesystems that are defined in /etc/default/fsprotect ### END INIT INFO # Author: Stefanos Harhalakis # Do NOT "set -e" # PATH should only include /usr/* if it runs after the mountnfs.sh script PATH=/sbin:/bin:/lib/fsprotect DESC="Filesystem protection" NAME=fsprotect SCRIPTNAME=/etc/init.d/$NAME # Read configuration variable file if it is present [ -r /etc/default/$NAME ] && . /etc/default/$NAME # Load the VERBOSE setting and other rcS variables . /lib/init/vars.sh # Define LSB log_* functions. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. . /lib/lsb/init-functions # Check whether fsprotect should be enabled is_enabled() { T=$(grep '\' /proc/cmdline) [ -z "$T" ] && return 1 return 0 } # Load module load_module() { T=$(grep "\" /proc/filesystems) if [ -z "$T" ] ; then if ! modprobe aufs ; then log_failure_msg "aufs is not available" return 1 fi fi return 0 } # Lock filesystems do_start() { is_enabled || return 0 [ -z "$PROTECT" ] && return 0 load_module || return 1 # # VERBOSE="yes" STATUS=0 if [ "$VERBOSE" = "no" ] ; then log_daemon_msg "Protecting filesystems" else log_action_begin_msg "Protecting filesystems" fi for f in $PROTECT ; do if [ -z "$(echo "$f" | grep =)" ] ; then f="$f=512M" fi # We can't use "cut" here because it exists in /usr/sbin. # Use sed from /bin instead T1=$(echo "$f" | sed 's/=.*//') T2=$(echo "$f" | sed 's/.*=//') [ "$VERBOSE" != "no" ] && log_progress_msg "$T1" if fsprotect-protect "$T1" "$T2" > /dev/null ; then [ "$VERBOSE" != "no" ] && log_progress_msg "(OK)" else [ "$VERBOSE" != "no" ] && log_progress_msg "(Failed)" STATUS=1 fi done if [ "$VERBOSE" = "no" ] ; then log_end_msg $STATUS else log_action_end_msg $STATUS fi return 0 } # No unlocking for now. Do we ever need this? do_stop() { is_enabled || return 0 # Nothing for now. TODO? return 0 } case "$1" in start) do_start ;; restart|reload|force-reload) echo "Error: argument '$1' not supported" >&2 exit 3 ;; stop) do_stop ;; *) echo "Usage: $SCRIPTNAME {start|stop}" >&2 exit 3 ;; esac : fsprotect-1.0.6/debian/compat0000640000000000000000000000000211161165715013035 0ustar 7 fsprotect-1.0.6/debian/postinst0000640000000000000000000000056611277240043013450 0ustar #!/bin/sh # postinst script for fsprotect # # see: dh_installdeb(1) set -e case "$1" in configure|reconfigure) ;; abort-upgrade|abort-remove|abort-deconfigure) ;; *) echo "postinst called with unknown argument \`$1'" >&2 exit 1 ;; esac which update-initramfs > /dev/null && update-initramfs -u > /dev/null #DEBHELPER# exit 0 fsprotect-1.0.6/debian/fsprotect.lintian-overrides0000640000000000000000000000052211725374140017227 0ustar # It doesn't make sense to have a status option for fsprotect as this is # activated per filesystem. It could make sense to make the status option # report whether fsprotect is enabled or disabled at boot time but it # would provide different semantics for the 'status' command fsprotect: init.d-script-does-not-implement-optional-option fsprotect-1.0.6/debian/rules0000751000000000000000000000064511365034373012725 0ustar #!/usr/bin/make -f include /usr/share/cdbs/1/rules/debhelper.mk #DST=$(CURDIR)/debian/fsprotect DEB_INDEP_PACKAGES=fsprotect DEB_UPDATE_RCD_PARAMS="start 37 S ." DEB_DH_INSTALLINIT_ARGS=--no-restart-on-upgrade --no-start binary/fsprotect:: postinstall/fsprotect install/fsprotect:: dh_installman debian/is_aufs.1 postinstall/fsprotect:: install/fsprotect chmod 755 $(DEB_DESTDIR)/lib/fsprotect/fsprotect-protect fsprotect-1.0.6/debian/dirs0000640000000000000000000000001711173400027012510 0ustar /lib/fsprotect fsprotect-1.0.6/doc/0000750000000000000000000000000011212232120011137 5ustar fsprotect-1.0.6/doc/fsprotect.lyx0000640000000000000000000003245611205752216013740 0ustar #LyX 1.6.2 created this file. For more info see http://www.lyx.org/ \lyxformat 345 \begin_document \begin_header \textclass article \begin_preamble \usepackage{color} \end_preamble \use_default_options false \language english \inputencoding auto \font_roman default \font_sans default \font_typewriter default \font_default_family default \font_sc false \font_osf false \font_sf_scale 100 \font_tt_scale 100 \graphics default \paperfontsize default \spacing single \use_hyperref false \papersize default \use_geometry false \use_amsmath 1 \use_esint 0 \cite_engine basic \use_bibtopic false \paperorientation portrait \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \defskip medskip \quotes_language english \papercolumns 1 \papersides 1 \paperpagestyle default \tracking_changes false \output_changes false \author "" \author "" \end_header \begin_body \begin_layout Title FSProtect - Filesystem Protection \end_layout \begin_layout Author Harhalakis Stefanos \end_layout \begin_layout Standard \begin_inset Newpage clearpage \end_inset \begin_inset CommandInset toc LatexCommand tableofcontents \end_inset \end_layout \begin_layout Standard \begin_inset Newpage clearpage \end_inset \end_layout \begin_layout Section Introduction \end_layout \begin_layout Standard FSProtect is a set of scripts that make immutable the root and other filesystems. This means that whatever is written to the disk will not be actually written and will be \begin_inset Quotes eld \end_inset lost \begin_inset Quotes erd \end_inset after the system is rebooted. \end_layout \begin_layout Standard FSProtect typical usage is for: \end_layout \begin_layout Itemize Public computers like those in libraries and labs \end_layout \begin_layout Itemize Testing purposes (i.e. Test the upgrade of KDE3 -> KDE4 without actually changing anything to the system) \end_layout \begin_layout Itemize Security \end_layout \begin_layout Standard FSProtect is written for Debian but can be also be ported to other distributions. It is 100% dependent on the distribution so it cannot be made as a common program for all distributions. \end_layout \begin_layout Section How it works \end_layout \begin_layout Standard FSProtect uses the \begin_inset Quotes eld \end_inset Another UnionFS \begin_inset Quotes erd \end_inset (aufs) filesystem and the tmpfs filesystem. Aufs is available as additional modules for debian and tmpfs is included in the kernel. FSProtect uses aufs to combine an existing filesystem with a tmpfs, putting tmpfs first in order. This results in changes been written to the tmpfs instead of the actual filesystem. Since tmpfs is a virtual filesystem that stores changes to VM (RAM or swap), everything is lost after a reboot. \end_layout \begin_layout Standard The big benefits of using fsprotect, except from filesystem protection are: \end_layout \begin_layout Itemize Immediate filesystem recovery - Since nothing is written on the disks, nothing needs to be restored. After a reboot everything is already in place. \end_layout \begin_layout Itemize Protection from violent shutdowns - Since existing filesystems are not modified any more, they are mounted as read-only. This means that the computer can be safely powered off without going through the shutdown procedure. For public computers, this saves the administrator from checking and repairing destroyed filesystems. \end_layout \begin_layout Standard FSProtect works in two phases: \end_layout \begin_layout Enumerate Protect the root filesystem \end_layout \begin_layout Enumerate Protect other filesystems \end_layout \begin_layout Standard This is required since the root filesystem cannot be \begin_inset Quotes eld \end_inset protected \begin_inset Quotes erd \end_inset after it becomes /. Other filesystems can be \begin_inset Quotes eld \end_inset protected \begin_inset Quotes erd \end_inset only before they start being used. \end_layout \begin_layout Subsection Root filesystem \end_layout \begin_layout Standard The root filesystem must be \begin_inset Quotes eld \end_inset protected \begin_inset Quotes erd \end_inset at the very first stages of the boot procedure. This is done during the initramfs boot stage where the root filesystem is mounted but hasn't become / yet (no pivot_root done). This is accomplished by adding a local-bottom script to the initramfs. \end_layout \begin_layout Standard The script: \end_layout \begin_layout Enumerate Creates /fsprotect, /fsprotect/system, /fsprotect/tmp, /fsprotect/aufs. Those are directories under the initial ram-based / which is available during the initramfs boot procedure. Those are not the directories of the real root filesystem. \end_layout \begin_layout Enumerate Binds the root filesystem to /fsprotect/system (mount -o bind) \end_layout \begin_layout Enumerate Mounts a tmpfs to /fsprotect/tmp \end_layout \begin_layout Enumerate Creates a aufs of /fsprotect/system and /fsprotect/tmp \end_layout \begin_layout Enumerate Umounts old root filesystem (from ${rootmnt}) \end_layout \begin_layout Enumerate Binds the aufs to ${rootmnt} \end_layout \begin_layout Enumerate Umounts /fsprotect/aufs \end_layout \begin_layout Enumerate Moves /fsprotect/system and /fsprotect/tmp inside ${rootmnt} \end_layout \begin_layout Enumerate Create ${rootmnt}/fastboot to prevent attempts of fsck'ing the root filesystem \end_layout \begin_layout Standard At this point, ${rootmnt} points to a aufs filesystem that combines a read-only physical root file-system and a tmpfs. All changes that are written to ${rootmnt} are stored in the tmpfs and are lost when the system reboots \end_layout \begin_layout Standard The part of the script that accomplishes this is: \end_layout \begin_layout Standard \begin_inset listings lstparams "basicstyle={\footnotesize\ttfamily},language=bash" inline false status open \begin_layout Plain Layout BASE=/fsprotect \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout log_begin_msg "Setting up fsprotect (aufs):" \end_layout \begin_layout Plain Layout [ -d $BASE ] || ( mkdir -m 700 $BASE || mkdir $BASE ) \end_layout \begin_layout Plain Layout [ -d $BASE/system ] || mkdir $BASE/system \end_layout \begin_layout Plain Layout [ -d $BASE/tmp ] || mkdir $BASE/tmp \end_layout \begin_layout Plain Layout [ -d $BASE/aufs ] || mkdir $BASE/aufs \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout mount -n -o bind ${rootmnt} $BASE/system \end_layout \begin_layout Plain Layout mount -n -t tmpfs -o size=$SZ none $BASE/tmp \end_layout \begin_layout Plain Layout mount -n -t aufs -o dirs=$BASE/tmp=rw:$BASE/system=ro none $BASE/aufs \end_layout \begin_layout Plain Layout umount ${rootmnt} \end_layout \begin_layout Plain Layout mount -n -o bind $BASE/aufs ${rootmnt} \end_layout \begin_layout Plain Layout umount $BASE/aufs \end_layout \begin_layout Plain Layout mount -n -o move $BASE/system ${rootmnt}$BASE/system \end_layout \begin_layout Plain Layout mount -n -o move $BASE/tmp ${rootmnt}$BASE/tmp \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout touch ${rootmnt}/fastboot \end_layout \end_inset \end_layout \begin_layout Subsection Other filesystems \end_layout \begin_layout Standard Other filesystems are protected during the boot procedure using an init script. This script needs to run just after the filesystems are mounted but before anything else is done. The init script is installed into single-user init procedure (S) with priority 37. This script reads /etc/default/fsprotect and protects the filesystems that are specified there. It relies on a helper script which it calls for each specified filesystem. \end_layout \begin_layout Subsubsection Helper script \end_layout \begin_layout Standard The helper script is installed as /lib/fsprotect/fsprotect-protect. It is called as: \end_layout \begin_layout Standard \begin_inset listings lstparams "basicstyle={\footnotesize\ttfamily}" inline false status open \begin_layout Plain Layout # /lib/fsprotect/fsprotect-protect \end_layout \end_inset \end_layout \begin_layout Standard This script does the same thing the initramfs script did. This is what it does: \end_layout \begin_layout Standard \begin_inset listings lstparams "basicstyle={\footnotesize\ttfamily},language=bash" inline false status open \begin_layout Plain Layout BASE0="/fsprotect" \end_layout \begin_layout Plain Layout BASE="/fsprotect/fs" \end_layout \begin_layout Plain Layout MP="${1%/}" \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout DST0=$(echo "${MP#/}" | sed 's,/,-,g') \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout DST="$BASE/$DST0" \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout DSTORIG="$DST/orig" \end_layout \begin_layout Plain Layout DSTTMP="$DST/tmp" \end_layout \begin_layout Plain Layout DSTAUFS="$DST/aufs" \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout mount -o bind "${MP}" "$DSTORIG" \end_layout \begin_layout Plain Layout mount -t aufs -o "dirs=$DSTTMP=rw:$DSTORIG=ro" none "$DSTAUFS" \end_layout \begin_layout Plain Layout umount "$MP" \end_layout \begin_layout Plain Layout mount -o bind "$DSTAUFS" "$MP" \end_layout \begin_layout Plain Layout umount "$DSTAUFS" mount -o remount,ro "$DSTORIG" \end_layout \end_inset \end_layout \begin_layout Section Usage \end_layout \begin_layout Standard Installation is as easy as installing a debian package. FSProtect can be enabled or disabled on demand. Configuration is done differently for the root filesystem and for other filesystems \end_layout \begin_layout Subsection Installation \end_layout \begin_layout Standard Ti install fsprotect, just install the debian package with dpkg: \begin_inset listings lstparams "basicstyle={\ttfamily}" inline false status open \begin_layout Plain Layout # dpkg -i fsprotect_1.0.1_all.deb \end_layout \end_inset This will put everything in place. \end_layout \begin_layout Subsection Enabling and root filesystem \end_layout \begin_layout Standard To enable fsprotect you need to add the fsprotect kernel option. The fsprotect parameter takes one optional argument, which it passes to mount(8) as the size option of the tmpfs. It is the size in bytes, and K/M/G suffixes can be used as multiplicators. If no argument is specified, mount(8) will create a tmpfs with size half the system's memory. \end_layout \begin_layout Standard The syntax is fsprotect=size, where size can be any size that can be understood by mount. For example: \begin_inset Newline newline \end_inset \family typewriter \begin_inset Newline newline \end_inset fsprotect=1024M \begin_inset Newline newline \end_inset \begin_inset Newline newline \end_inset or just: \begin_inset Newline newline \end_inset \begin_inset Newline newline \end_inset fsprotect \begin_inset Newline newline \end_inset \begin_inset Newline newline \end_inset \family default This will protect the root filesystem by using a 1024M tmpfs. This limits the changes that can be performed to the root filesystem to 1GB. \end_layout \begin_layout Subsection Other filesystems \end_layout \begin_layout Standard For non-root filesystems to be protected, fsprotect you need to: \end_layout \begin_layout Itemize Enable fsprotect with the kernel parameter \end_layout \begin_layout Itemize Specify the filesystems to be protected and their tmpfs size in /etc/default/fsp rotect \end_layout \begin_layout Standard A sample /etc/default/fsprotect can have the following line: \begin_inset Newline newline \end_inset \begin_inset Newline newline \end_inset \family typewriter PROTECT= \begin_inset Quotes erd \end_inset /var=2048M /home=4096M \begin_inset Quotes erd \end_inset \family default \begin_inset Newline newline \end_inset \begin_inset Newline newline \end_inset This will protect /var and /home filesystems using 2GB and 4GB tmpfs respectivel y. \end_layout \begin_layout Section Copyright, License and Contact Information \end_layout \begin_layout Subsection Copyright \end_layout \begin_layout Standard FSProtect is Copyright © 2009 by Stefanos Harhalakis. \end_layout \begin_layout Subsection License \end_layout \begin_layout Standard FSProtect 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 3 of the License, or (at your option) any later version. \begin_inset Newline newline \end_inset \begin_inset Newline newline \end_inset 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. \begin_inset Newline newline \end_inset \begin_inset Newline newline \end_inset You can find the full license text at: http://www.gnu.org/licenses/ \end_layout \begin_layout Subsection Contact \end_layout \begin_layout Standard For comments, request, bug reports and suggestions, contact Stefanos Harhalakis via e-mail at v13@v13.gr \end_layout \begin_layout Section Changes \end_layout \begin_layout Paragraph 23 May 2009: \end_layout \begin_layout Standard Better documentation for enabling fsprotect (Thanks to Martin T. Krafft) \end_layout \end_body \end_document fsprotect-1.0.6/doc/fsprotect.pdf0000640000000000000000000033256711205752410013677 0ustar %PDF-1.4 % 7 0 obj << /Filter/FlateDecode /Length 212 >> stream x5j0 { h4KJ(1lԷ-mX }n?I :ea`,2@XY(IWhT}E)ĪLET:)͕Z4p.>KrD3T4@MښaOFm2=\H1k|̴ڠI~Ai5l&gY-.1.: ,&b +ZF endstream endobj 8 0 obj << /Font<< /F1 4 0 R /F2 5 0 R /F3 6 0 R >> /ProcSet[/PDF/Text/ImageC/ImageB/ImageI] >> endobj 12 0 obj << /Filter/FlateDecode /Length 591 >> stream xM0 xWV"$*'l&% Bnm8]`v7&G2hǭc5{5e׊IQi6eZrcXzL.:E%525əN"X;e9P$DMQ;>+", 8teo/ 47OXH޷^iv]\㸺 P,<9R {ZؤOժ\Y0qq5 D sO< QBFR(A_'hv#fʹ"?@ [fCIM UajChy:oi7HMc|Eč;qO/Vb sj ">^[m[Ex[m_ŗUU/zj}0=8#pFp}Dv:+/?jLe8Tp"t{(f}ԷM.ClAlt\ 2͡>E"OS\rk?-k#0sDWeyϘ3C=*rhE(30f\"Nc߽ 1 endstream endobj 13 0 obj << /Font<< /F4 10 0 R /F5 11 0 R /F3 6 0 R >> /ProcSet[/PDF/Text/ImageC/ImageB/ImageI] >> endobj 16 0 obj << /Filter/FlateDecode /Length 1795 >> stream xڍXKo6WR@bEz@ݠbѴI{iz%:&Rf;ɒm!9fhz DxIi&(Q8 ["H`]㇫u2Sf4_A %xkp{onm뼇=QW4tIgBnM3SPRO+TJ$Ы]ɤiS.KӇJݽt*!T?8-įt%Ig鯨l_{]Ӣoxt0z6eIa;R9U,_.H:I҉IPSlʦaFa}:#S Dċh5^d&,j]'Қ\9}?te xO#'$&;A,8+MNMpݎ/j47;4fg5]8uoVwb_]oG8*v-Ysj[7{2,ChU # GIO4%ٳ=-0N`΃~$E&vL./5e"7}vAj9l3JR F[rG*dd!<"zk@>%cNWG -v]gG'rP(BꈢxGSU u[@US^sp`tB¤@DAa/ go2N`){{vq }jPA~հ rX,B0W;a_4HL]/R0* 䯫-$)s\͈느J)i&Dȇ:/B3^FrZC9f] gBø{gjL'O D)Wfg9[qtp"C-< n$yZ e-Y'ɢ$]ϧ`mmjj%u^&s{M}X]l_1vؓ0Tiy`{g8xOrC7}R^ZumSnw9Tu[Z#SDo fܟJLȶԉH:oо`T#G NqJ T?ROeSC@6? U뢣)G̪!. 0o\ƿ&G52P:DQQy!FƫIҖ*+~D73Y DYeܦ)u9@/_H^E0= Ypѩv'pp/LG!Nʅ~4=mC琘o)[~<E߬0MK/ZC W-"+\9jF~n1R= F8#9|Z_4/n̳ (|/> /ProcSet[/PDF/Text/ImageC/ImageB/ImageI] >> endobj 21 0 obj << /Filter/FlateDecode /Length 1854 >> stream xڽXݯ6_Ju`ԇv&az$AM aIJTS$p8>_cOz!gg,H3o^z7O cv%20Ļ]*3_Jş̏;L,Hoo( K"zL(#քh@JYE(Uvo21'VᮩbKxTzfʈ'4ѴVwEtbNZc{>ņ@8%bo`4JԨSs&uU0l^U5veWf _\M@Emu6&g+db[+L.$=fلbKɏbQo a=%w+)u#HE6E|v]7GNܿH|Fyp|u]w)w56o2MLYSzyE`D—: 28'&Ab\_"J)qj- 'ﶻcfǠ|DNJ7p$X JAfb_-c@`|4|wuZ-9>X&oz}-X+?FvC &Qhc%8qZ̃RCȤ[pHT$t%싲ZƌJ-s|t"fߍ=k˷s0v7 Ds&e'Ftg[ݪ=5F dAOz378@'˫%6OhCIOGٿWo l]=X5}?|i߲/;N&=eOAvm'p'0S8G |.&:^skK{ poO\ڌ䂌%(}6ݬ@ŭy|Ȕp=w=p^trBGd\܋rj< ћg&}uG8Gu$1`DjVۉa!"[)hUcCʗ񥭮6(]oMq_'5v,4x0x )PF;eC /L?$-.LfLBRa!8d9#)YrJah}8%`*Q{懔{R!5;p%~en*9mΤ+>i3"!CG1 kRlKR,WŘD$`lEjS*ug&{+;t*?t4V4RB(&>qj'ktE ~r~wٱ; ^ݺ mNZ''Xf> /ProcSet[/PDF/Text/ImageC/ImageB/ImageI] >> endobj 25 0 obj << /Filter/FlateDecode /Length 1846 >> stream xڭXm6_a͡8%[veX^7t[D5SbȇR$3{m@Ӕ()Fts~*Yd*)hGmTRy4_EJE"/gI6*T<~jvc?M?awZEGURI*]a36i\wN]n1.]5Z@wiVƭG6^8R[y6+ fCutаQS:{V NZbνi۴Y-nݪ SɃcs<EÜԌ/pU:n\/|wN׈,ïFpZ:33>q15?9YΥDY7U-eaoyG3un%1ٺ;FMAc|{dOedʲ<1%֓iI5d@L+~y߁oES.]Z&ځ]IF!v4Oc?4LUiPJS+XPA;x~CjAR<ˑ%(׈M!B_>Ə p~˧5Gr `@ PՆ yygwyKٳ؀"ق2e&jސNKpR$O:yL(<|d"#N R*R Tp+q#z42.eb@|7 l2^LD}j-_swO^3Rn _ TIVrG gc/ΦPJF"߼>tzUEm;.;T5fMcP7[~31Z$K4ɯeJvRt/$dM4:CL>'ppltsC'azFvQy=N>ƒt˜c)ͪSw?݇uu)g@7h -OhCJ[2]JkGPF*JSPy(yԠ@> /ProcSet[/PDF/Text/ImageC/ImageB/ImageI] >> endobj 28 0 obj << /Filter/FlateDecode /Length 1432 >> stream xڍWKs6 WVj&%zLNm=5=06KI__l͎"H$A $ygeT f&$*4-,1_ p:Ok'^-ΙN!t03Ūp{P&]Ϩ?f{-,ʓ`"xe#OMpC;VFA$<|̫%4<9v;s8;5'%!+. pSmӅ&̉dKazX.' X =X2+aXvu+U3.v}1EKj})2oB')KN2ӗ07Dq_!NohBY{v V/.]-Ip"xOBe>v됗lkUSj_n{MYmr񃓻aM<* /(o 79STϽțĄ XF'o*L?q\7R,nyQ8ԗ?``c0~p;;26|F`{E: *+`6zQTO7`@K'өxkg&:  u%fIvtr[mp.3.ǐP^Av]r퇽CrtH qz0]QsDM!F׽|Pً >2G8"Zo g,HDCGUp6|ɇ endstream endobj 29 0 obj << /Font<< /F7 19 0 R /F3 6 0 R /F9 24 0 R /F6 15 0 R /F4 10 0 R >> /ProcSet[/PDF/Text/ImageC/ImageB/ImageI] >> endobj 31 0 obj << /Filter/FlateDecode /Length 725 >> stream xeT]o0}߯ȣ#-&ٽ"XZ =!aS{1!s}}_s|1'N4Ifh&p1ǎqGNA}ٹrl!9ej;,v{ez|<{d+1,"O.cW"{dcR(:YLñ*MٶvAFe晃/>7mp%vJhM_\0ͮ^<.e<?/Y) endstream endobj 32 0 obj << /Font<< /F3 6 0 R /F7 19 0 R /F4 10 0 R /F5 11 0 R >> /ProcSet[/PDF/Text/ImageC/ImageB/ImageI] >> endobj 3 0 obj << /Resources 8 0 R /Type/Page /Parent 33 0 R /Contents[7 0 R] >> endobj 9 0 obj << /Resources 13 0 R /Type/Page /Parent 34 0 R /Contents[12 0 R] >> endobj 14 0 obj << /Resources 17 0 R /Type/Page /Parent 34 0 R /Contents[16 0 R] >> endobj 34 0 obj << /Type/Pages /Count 2 /Parent 33 0 R /Kids[9 0 R 14 0 R] >> endobj 18 0 obj << /Resources 22 0 R /Type/Page /Parent 35 0 R /Contents[21 0 R] >> endobj 23 0 obj << /Resources 26 0 R /Type/Page /Parent 35 0 R /Contents[25 0 R] >> endobj 35 0 obj << /Type/Pages /Count 2 /Parent 33 0 R /Kids[18 0 R 23 0 R] >> endobj 27 0 obj << /Resources 29 0 R /Type/Page /Parent 36 0 R /Contents[28 0 R] >> endobj 30 0 obj << /Resources 32 0 R /Type/Page /Parent 36 0 R /Contents[31 0 R] >> endobj 36 0 obj << /Type/Pages /Count 2 /Parent 33 0 R /Kids[27 0 R 30 0 R] >> endobj 33 0 obj << /Type/Pages /Count 7 /Kids[3 0 R 34 0 R 35 0 R 36 0 R] /MediaBox[0 0 595.28 841.89] >> endobj 2 0 obj << /Creator( TeX output 2009.05.23:1348) /Producer(dvipdfmx \(20090115\)) /CreationDate(D:20090523135047+03'00') >> endobj 1 0 obj << /Pages 33 0 R /Type/Catalog >> endobj 37 0 obj << /Filter/FlateDecode /Length 86 >> stream x31ѳT0P0T02S06W06VH1*26 (C$s<͸=̹=}JJS <]?\ endstream endobj 38 0 obj << /Filter/FlateDecode /Length 197 >> stream xѽ 0p/ὀCӵ*APGE7oбClm{"D?9>..pJ {Dž5^^t1P|1C1 D8=@6="ǝ\o +ee,:ZtȰJP=V*una95]2-{k߫]+f9NT P -~ endstream endobj 39 0 obj << /Filter/FlateDecode /Length 227 >> stream xڳ43W0PP5T0Q4WH1*27 (XZ@ds<͸=\ %E\N \. `` BY AfqH|`@? P?"!08#c%c5`cӌ6[ٗa3>C> stream xڅұN07pkwqVkٸԫKJ>~N7/nCf辿~u}uKs@LD*9"eE4;5[1)v9Ɔa#ȩc+vH5`!~vՁqN}{T2źP%*REʙFSVR %X@UY8/hK\9 5G*á+ I5>2X8̚3ևZ1Zuh[޳Ÿt;C\Q*'TRJCF: hgLdy> stream xڵj0U2n#^@&CB=)dtk"x N2u- I~%[nJdKaV5%ϲMEϏ=R@0 ͭ57 \ !:YFzQ*&Q*2uubg^#\ RO^a&"U@skRf}JꞒ1CPf08?zl endstream endobj 42 0 obj << /Filter/FlateDecode /Length 259 >> stream xڝN1 sP=஠T H0jd"" Cc;D/?vu-<PҖ3G_s7'׷RC2v3on4o)xH֎5- 9R9c&;J<7EjE ?𱂫SFP#C z"T?+ ;fEr%_i^̢I"T#}/JV uj66R&#M(j/+ Y" endstream endobj 43 0 obj << /Filter/FlateDecode /Length 136 >> stream x363Q0P0U5T06P4QH1*22 \.'O.p#S.}0BIQi*S!1 X1HG@;  C3 C=2r * endstream endobj 44 0 obj << /Filter/FlateDecode /Length 115 >> stream x363Q0P0U5T06TTH1*22 (@s≮=@\ %E\N \. P 00c5=2r B' endstream endobj 45 0 obj << /Filter/FlateDecode /Length 247 >> stream x1JAZ&XF:l 6 N h@x&3^e2!x1렙o`b臰دZj%˅PY\`]J?\ies.O\/%ps"FjD1S 8%Qd3ѵiM(" t-RкnC}P !v /^7֢pnE4? i ɶt2MS_OF endstream endobj 46 0 obj << /Filter/FlateDecode /Length 197 >> stream xѱ @ ЈЀrUutPtn7'tp4Zurt9^ $ )~@OjHϨ$%5 )J%k^nG͜LFs2s @[ 9q[a`ȧlri۲1A녪Fȝp?C3WJ 7rop< p W endstream endobj 47 0 obj << /Filter/FlateDecode /Length 240 >> stream xڭn@ /b@G/!-9F$*ѩP@0_-GȘkG(cNN/g c79wRP endstream endobj 48 0 obj << /Filter/FlateDecode /Length 182 >> stream xϿ `gx#-_c rPη#J:KWX.BșD q]u_zx YټeϭKK,7Ŭ⹬&u*~wXfC9 rrB4%FUfZ[,H xo,#j~4yTQD7y 4]' endstream endobj 49 0 obj << /Filter/FlateDecode /Length 270 >> stream xuпN0+"y#^?nfD$X+#ꋅ7#x`hdK6/5o4{\v3U^ͮ13{o{6u_o=4 P@j:%~l10LHt!z?bq,f'dv蠩k"U"5H*#>HH D:PBIHM'p.Ϝs+tZ :-e_$qha\e:2wy endstream endobj 50 0 obj << /Filter/FlateDecode /Length 184 >> stream x353Q0P0R5R01Q0WH1*21 (XXBds<L=\ %E\N \. bH~|? D>dd πA0DT&SN 0^? zyvP4=8r `D endstream endobj 51 0 obj << /Filter/FlateDecode /Length 326 >> stream x}1N0aW*y $)R H01JAz\ 2Dy$,bD6F3nLm^8sJXR BU@tLnCP: B;@}e|r5#A:@-C(#IZSh=++H endstream endobj 52 0 obj << /x2D 37 0 R /x46 38 0 R /x50 39 0 R /x53 40 0 R /x63 41 0 R /x65 42 0 R /x69 43 0 R /x6C 44 0 R /x6D 45 0 R /x6E 46 0 R /x6F 47 0 R /x72 48 0 R /x73 49 0 R /x74 50 0 R /x79 51 0 R >> endobj 53 0 obj << /Type/Encoding /Differences[45/x2D 70/x46 80/x50 83/x53 99/x63 101/x65 105/x69 108/x6C/x6D/x6E/x6F 114/x72/x73/x74 121/x79] >> endobj 54 0 obj [44.9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 88 0 0 0 0 0 0 0 0 0 91.7 0 0 74.9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59.9 0 59.9 0 0 0 37.4 0 0 37.4 112.4 74.9 67.4 0 0 52.4 53.2 52.4 0 0 0 0 71.1] endobj 55 0 obj << /Filter/FlateDecode /Length 186 >> stream x37ճT0PP5V03W05TH1*2 (@ds<L-=\ %E\N \. !`>'CPivB J?JP~6Z?hF5Na``ͅ`}8G30.ьn|.WO@ endstream endobj 56 0 obj << /Filter/FlateDecode /Length 182 >> stream x37ճT0PP5V03W05TH1*2 (@ds<L-=\ %E\N \. !J!y@;~@lЍ>f?Fۣ}hF@3Fꃙ0w> stream x323T0PP52P0TTH1*2 (YBes< =\ %E\N \. 733<6?ۃ??(n4 endstream endobj 58 0 obj << /Filter/FlateDecode /Length 88 >> stream x323T0PP5T0PTH1*24PACDr.'~8PKLz*r;8+ry(> stream xڵJ@s\f_@ȾNBT0pZZ(ZYiwpH+DR&DXwvvs.d23;̳LDz*,#Dͧ޳BWj"-Hj*Odx^C io&7rѷ\!Opza=J`u֝`$>J^kr4fG'"y؀2`_y/P_7܁ѡ 3eN&`5JyYMPu\2(-A2fjf~wW'kͳ3 PK??6> stream x373T0P0Q5T0P03WH1*23 D2ɹ\N\ f&\@a.}O_T.}gC.O? `BcC1~4ȫ_4,q.WO@| endstream endobj 61 0 obj << /Filter/FlateDecode /Length 259 >> stream x}ҽjA+Gp^ p 䊀V>I"t)S (؜p8kRJU0!> stream xeнN0ŏ`mR>&K$2  @0U_̼I(|תrfԎ^ԶW}TS^O7'ojު6sXUP|qg'=$ P-PD %d^z9@%(LG;t҃{;Ѱ9q( rہ˳_Aq@&lO^B2~j?t9Q.-ppyz^C L~;P=kE endstream endobj 63 0 obj << /Filter/FlateDecode /Length 221 >> stream xu1N@Ѝ\X Iw#pUL: Ź鶰3k#xş/*f˗3l-#;PaҢrvNTOPx)Amtҍ_[8cxwn#?ڹ?F&َR%i,mh;$ף3DTxjS 3.,^xȫ endstream endobj 64 0 obj << /Filter/FlateDecode /Length 208 >> stream xu1j@Pi|IY!p`l)zr\A-~!ey_G}xR,C*brfx&xXU??NGͳR(X@9xk !0i##l{q"G*0 g. 7Lrky6,9X{g.BoY endstream endobj 65 0 obj << /Filter/FlateDecode /Length 150 >> stream x3ԳP0P0R5T06U0TH1*26 (Ces<=\ %E\N \. H{ Q$A* @MdՓ+j9 endstream endobj 66 0 obj << /Filter/FlateDecode /Length 263 >> stream xڝ1N1E'rɍ/d_6 nQ-mQ.dr?v$ Dm=[?ܥ;_,\}ڽ=^.O7nua}~|jx溽u Q5lk&N1f4E;t`q`}SjN,T1^31g}7}66S$HEՉ V:'Ŧpu\cV'?'ٜ]Ֆ. endstream endobj 67 0 obj << /Filter/FlateDecode /Length 160 >> stream x353R0P0V5T05P0PH1*21 \.'O.ps.}0BIQi*S!?@A 1 @~ y;*,H2g  1HK#2k;& endstream endobj 68 0 obj << /Filter/FlateDecode /Length 119 >> stream x323T0P0V5T02Q03SH1*2 (Cds< =\ %E\N \. `J 1g0D0g`` .WO@z endstream endobj 69 0 obj << /Filter/FlateDecode /Length 209 >> stream x= @) hLD+0PKAE^)xmgcy;8HWڡD}e#  ^G +bgM~2eKDj ˒47n /SZH2LImjTr 萣OK4,]4t͛EI/R" S&|3l endstream endobj 70 0 obj << /Filter/FlateDecode /Length 104 >> stream x323T0P0V5T02Q0PH1*2 (YBds< =\ %E\N \. 3jvr  endstream endobj 71 0 obj << /Filter/FlateDecode /Length 152 >> stream x353R0P0V5T05P01VH1*21 &\.'O.ps.}0BIQi*S!?30``3zPHG$%|[~r M endstream endobj 72 0 obj << /Filter/FlateDecode /Length 200 >> stream xڝ= @R h~\%] *PK EDX!ebPۙ7;oWţ0b5ax҉T1`5m;#-%d/t=ELDjbhR%4%t:lI=q f&fV9ub³#J5eg}Il\дyZ endstream endobj 73 0 obj << /Filter/FlateDecode /Length 138 >> stream x36׳T0P0V5T06U01VH1*26 (@ds<=\ %E\N \. 3?`f`?|<6{l X@#?F4L{h/#szr endstream endobj 74 0 obj << /Filter/FlateDecode /Length 208 >> stream xM1n@\4B#\g Jg $))Bm# _׀vK /cAk}ϏSLL>SްO5N$^>\ħ,5sRm.) ]z۫;597G쁦Qh..RTu4D1DyGF=]uq>ғ?:>xz;:`CyCn endstream endobj 75 0 obj << /Filter/FlateDecode /Length 151 >> stream x36׳T0P0R5R06R03PH1*26PA3#Lr.'~PKW4K)YE1G4 F(f P Ln`|` \\Nj· endstream endobj 76 0 obj << /Filter/FlateDecode /Length 197 >> stream x]1@%&pؑF)Zyh#xnh14w1. !> stream xe?NP D*y @Fl 2 `+Wԁ+1d-ʒJv {lO 98䘓#z$ӣ݌9^H^(^pD);oohv*@,~4  V5ZG5Zu%Vy1\]^J؎2j`vr`ѹj|=.jk7 \}5sxMYN7oC? endstream endobj 78 0 obj << /Filter/FlateDecode /Length 197 >> stream xڽA Pl> stream x3гP0PP5T01P03UH1*26 f\.'O.pc#.}0BIQi*S!? ?K @2o```a.WO@pʂ endstream endobj 80 0 obj << /Filter/FlateDecode /Length 261 >> stream x]1J@YL#]@!!]`U0--)ĖЙM1Ÿ`J a ވQ"-;3DA&V .H?;c;ض^ Yx|}Wh֏^Mg 'ZR]&^5( endstream endobj 81 0 obj << /Filter/FlateDecode /Length 251 >> stream xm1N1 E3&G/̬"- 1T()@l\i:J0 .(nPWwq:\s95> stream xuMJ@+dM CvQ,]yuBug^);2hwBU?H÷n}|_sŞ{^_u\ݚMkK)Oڔ??ޘrs~+3@r@Bb*capHMr\l( _;`gd:_/o3F3$+Hv$/'<LA/ 6 v^}g44҆l촞HN(D \|Y$[ endstream endobj 83 0 obj << /x3C 55 0 R /x3E 56 0 R /x2C 57 0 R /x2E 58 0 R /x40 59 0 R /x48 60 0 R /x4D 61 0 R /x53 62 0 R /x61 63 0 R /x65 64 0 R /x66 65 0 R /x67 66 0 R /x68 67 0 R /x69 68 0 R /x6B 69 0 R /x6C 70 0 R /x6E 71 0 R /x6F 72 0 R /x72 73 0 R /x73 74 0 R /x74 75 0 R /x76 76 0 R /x79 77 0 R /x30 78 0 R /x31 79 0 R /x32 80 0 R /x33 81 0 R /x39 82 0 R >> endobj 84 0 obj << /Type/Encoding /Differences[44/x2C 46/x2E 48/x30/x31/x32/x33 57/x39 60/x3C 62/x3E 64/x40 72/x48 77/x4D 83/x53 97/x61 101/x65/x66/x67/x68/x69 107/x6B/x6C 110/x6E/x6F 114/x72/x73/x74 118/x76 121/x79] >> endobj 85 0 obj [27.1 0 27.1 0 48.8 48.8 48.8 48.8 0 0 0 0 0 48.8 0 0 75.9 0 75.9 0 75.9 0 0 0 0 0 0 0 73.1 0 0 0 0 89.4 0 0 0 0 0 54.2 0 0 0 0 0 0 0 0 0 0 0 0 0 48.8 0 0 0 43.3 29.8 48.8 54.2 27.1 0 51.5 27.1 0 54.2 48.8 0 0 37.9 38.5 37.9 0 51.5 0 0 51.5] endobj 86 0 obj << /Filter/FlateDecode /Length 182 >> stream xڝ1 @EKa5BTp A+),> stream xڝ1@Ei<s]5q oHvX͞"CU@5 >;r)\ xUX󲻞p]%]7w>/y琊RnKR-L3C7Ye endstream endobj 88 0 obj << /Filter/FlateDecode /Length 152 >> stream x333S0P0W5V05W01VH1*25PA3Lr.'~PKW4K)YEA?C=P PQͫGePFC-ZIP Փ+&8k endstream endobj 89 0 obj << /Filter/FlateDecode /Length 168 >> stream x313U0P0S52R06U03TH1*2(XCs<,=\ %E\N \. cy@⌆3tJzA@}a P8 Pcr % endstream endobj 90 0 obj << /Filter/FlateDecode /Length 164 >> stream x313U0P0S52R06U03TH1*2(XCs<,=\ %E\N \. g@F >?az`y#!Î@"飇@ Pw Փ+Ƶ endstream endobj 91 0 obj << /Filter/FlateDecode /Length 91 >> stream x333S0P0W52P0Rf )\\ hJrW05P0U()*Mw pV0tQh`z0`\\Q endstream endobj 92 0 obj << /Filter/FlateDecode /Length 123 >> stream x323T0P0W06R04W05WH1*24PA#SLr.'~PKW4K)YE @h C??\=R0N endstream endobj 93 0 obj << /Filter/FlateDecode /Length 122 >> stream x323T0P0W54W" CB.C42$r9yr+p{Ź=}JJS <]oP `?WO?Փ+0z endstream endobj 94 0 obj << /Filter/FlateDecode /Length 87 >> stream x323T0P0W5T04SPH1* (XBs<,=@BIQi*S! a\\uG endstream endobj 95 0 obj << /Filter/FlateDecode /Length 147 >> stream x313U0P0U52R06S03TH1*26(XCs< =\ %E\N \. 3?@|Cq?χby  \@(&`,. hB2\=%B endstream endobj 96 0 obj << /Filter/FlateDecode /Length 96 >> stream x323T0P0W5T04S06UH1*(A$s<,=\ %E\N \. 7g0uqzr6fE endstream endobj 97 0 obj << /Filter/FlateDecode /Length 130 >> stream x323T0P0W54W"cSCB.C45J%r9yr+p{Ź=}JJS <]oP 'uك`cP_?GR] endstream endobj 98 0 obj << /Filter/FlateDecode /Length 95 >> stream x333S0P0U0  )\\&@A#Lr.'~ PKW4K)YE$:PGpzr endstream endobj 99 0 obj << /Filter/FlateDecode /Length 156 >> stream x323W0Bc## SsCB. $hd Ir* s{*r;8+ry(< ? 7?l(?S2??\\T endstream endobj 100 0 obj << /Filter/FlateDecode /Length 85 >> stream x323W0P0T04U02V02PH1*22 (B$s<=L=}JJS <]'W &o endstream endobj 101 0 obj << /Filter/FlateDecode /Length 159 >> stream x323W0P5T06R02W05WH1*2(Bs<,=\ %E\N \. S_??|E큢z a 2Փ+6$U endstream endobj 102 0 obj << /Filter/FlateDecode /Length 254 >> stream xUϱJA]XX} e9s6V(X7 )Ry_q‰$`C~ I ii6 2Bzon$5$2q~Ow6\@)0!k\RH{-5JԄKo" 6T#rOX r2aU;H+c,Ʊa"b* /TڦԞp&^/̚T*|K/Y7fVsyž endstream endobj 103 0 obj << /Filter/FlateDecode /Length 348 >> stream x51J@Rf.U6 jihkŖ^!¶&b>|/)Lo5^K_Lr<=>ߩ|~yb&<5!݈*оX 7Xb4VZomht j$K ņ_ F>ԑF' ^N^򬩗O%;O=Q~zE@Eś՚Ln"d?|u׎z8$g;lR/-uϤgٓ~l*zV:K JЅ3w#}HKLZTW endstream endobj 104 0 obj << /Filter/FlateDecode /Length 294 >> stream xڥQ1N@%0ن ^@MHaZZh&nU(PlxZh-lxȎ ҹ>:OZ=> stream x; @i;$Bjih'$̣[n&vN3jF'>q7b9&=C(`:`ds>N[ F1GM0\,UuV9PS ہqx( < ߜn`}ˡ~ vT?D6)b(D fga endstream endobj 108 0 obj << /Filter/FlateDecode /Length 234 >> stream xm1n0a Hox! GeDD$z#Ύ\+D$ˏg"&Oz_NO#1gca Rp &Do(%D3CqhxW$whAʣSus,-Pv- ,;jה\Q䡉r5W*!DMpڅ9> stream xڕ0KHnBH5N>::ht. p@BKla)T)j7+U rkA> bQ!Za햨zuУhTp\ sBx#4×55y(0,Y !:[-l4> endstream endobj 110 0 obj << /Filter/FlateDecode /Length 251 >> stream xڭѱJ@i| `"NSZ ޕWO|_i;_v"Y`voGܜGSqմr@ˎ[[*/LewO53;g :WJf^`[ kf%Nh?a70M~gN>#K5g #zvm ',wXJ` " R:%e-N*iT袣oG}X endstream endobj 111 0 obj << /Filter/FlateDecode /Length 185 >> stream x333Q0P0V5T05W05SH1*2 D2ɹ\N\ &\@a.}O_T.}gC.O DC(1y0LaSFՀBP`S?;xW9C f'(hAPB\\| endstream endobj 112 0 obj << /Filter/FlateDecode /Length 176 >> stream xu;0 t% 0"ȀF&\G;T1%Ch";?48ơA Mhd`4 G2]z?. 4`>'Jn2f́Jx Фh'a"Z( / gwK 4P oWɮw endstream endobj 113 0 obj << /Filter/FlateDecode /Length 160 >> stream x353R0P0V5T05P05SH1*21 \.'O.ps.}0BIQi*S!#?`?0L6`1LX?H0D20qd] AJ?`G٣\\] endstream endobj 114 0 obj << /Filter/FlateDecode /Length 243 >> stream xڭѿJ@=8| h4ẁSV>gi(XGG#LsOi~a'm.j/97jZ]SOܴT2=Py|暺`z08 yb{J0i lj &k#vʴ~!4Ye$bi;d`D++1 r)lJЬy;f .Cub6 endstream endobj 115 0 obj << /Filter/FlateDecode /Length 118 >> stream x333V0P0V5T0P05SH1*25 (Cds<LM=\ %E\N \. Q 0D'u.2 ]!t  endstream endobj 116 0 obj << /Filter/FlateDecode /Length 96 >> stream x36P0P0R5T0P05SH1*22S Cds≮=\ %E\N \. 07} \=zj endstream endobj 117 0 obj << /Filter/FlateDecode /Length 239 >> stream x];N@(<ǂ8H@@J kN+9JkD΅2qO;Gq[&b΋s˥}Up٣l]z~Uk&" q\ȋԉH͝{f(ћ'6055=:xSӢ=_Hf#YP[[Z-+Cg8M½rjk3}fS70nS?R endstream endobj 118 0 obj << /Filter/FlateDecode /Length 134 >> stream x35ԳT0P0V5T0P05SH1*21 (Cds<LL=\ %E\N \. #L>K1~ A0@Cy@!\=9 Z endstream endobj 119 0 obj << /Filter/FlateDecode /Length 239 >> stream xuAjP/Yf#dvl$B(Kv'ăBۀ?1C>>a'g,!r0N HR&u{6x~>%>P(-D(nP2 |oij6ET Nu. (4@[:3Z{G6p]* NI*-B*D 0^ endstream endobj 120 0 obj << /Filter/FlateDecode /Length 231 >> stream xU1JPyN*sM`> stream xڭ=0 [u#RT0UGL@0ܬG22;$Be&Is<1*NPPMT1's8üt*taH ޮ3H HAE|v1=τtMdJ5\UYu(z s^Tv0r.E>2Ik1裱Z:A`l|=ZP;'=8ϼOBq^sOV+A endstream endobj 122 0 obj << /Filter/FlateDecode /Length 160 >> stream x353U0P0R5T0"3CB.K9D&9ɓK?\ĒK(̥PRTʥ`(f?`ȃ`;bS)FI j;-PuLCL?)PB\IqzrV. endstream endobj 123 0 obj << /Filter/FlateDecode /Length 213 >> stream xڕ @\|JET: VN=@uPy{4GM*p>ew$`O!\!NI ^9^ /?`6| !!!/#2c_[rֶ5Qcy~o?GC^#_ݩ6rVA_.?n*mV- \ endstream endobj 124 0 obj << /Filter/FlateDecode /Length 246 >> stream xUϱN0 `W e /`@"^,I!c?݁)n5/峆ۚ/.6/YipzyښugGnVհ;~{}ߘj}ŵCRO%:H 2Q @$9:0(̠:HeJHeF!VQ~ j吉~V3!&1p@Z]ע6c [: [&͛<u˻ endstream endobj 125 0 obj << /Filter/FlateDecode /Length 145 >> stream x3ԳT0P0V5T05CB.Sc9D&9ɓK?\ԘK(̥PRTʥ`p(? fDS|0u+%ۃX`~0F\=< endstream endobj 126 0 obj << /Filter/FlateDecode /Length 185 >> stream x1 @ iJ YZug\BR&/[ endstream endobj 127 0 obj << /Filter/FlateDecode /Length 238 >> stream xm?@ ).Q]0V{--x' mCof|_8)fc }{/&94_vt|(DLTU- *FQ-ZLJ#y*}J?ލbog͞}yl`MD|Q=B"Z%s:>FD*~͒=xm>r| endstream endobj 128 0 obj << /Filter/FlateDecode /Length 300 >> stream xuAJ0 ]Z h;3T*Q.]yW.ݚd YtۡB?*GO/B/Eũx7^lWDyV݊g.ŜWW08a @>0C?RMpo P+=I=t >.hxS44DoZut20 Z"|& %mDPƫRn6]^9DG>I=m'O]4A9/цPSd3  endstream endobj 129 0 obj << /Filter/FlateDecode /Length 226 >> stream xαJA )v^@/IV>@PH6n& 7;o}r|*)娔z"U-%?s5ա>Z.rqc.ky}y{bv{.%B4<r@=5@ 5:Sk;`pf~\SuxOj3w`\Cv3Jq]~lfѠ]?=QWl){` endstream endobj 130 0 obj << /Filter/FlateDecode /Length 197 >> stream xm= @ir h@T0PK E,Xx&JH’q֟Fxü(p!q˜C'igK<.{fH "!Ң RJPh/: 9$?HFB06g5oS MK"Ե^֍UFpJ` } endstream endobj 131 0 obj << /Filter/FlateDecode /Length 187 >> stream xڭ @`EO@Zy Azءk&>Ӯ13G xC¨ <[ 2L+!]#S&L#4ʌ\d%GHp-r;vGa_1GkM& )J[0%t2fؤpƖܟ endstream endobj 132 0 obj << /Filter/FlateDecode /Length 179 >> stream xڍ1 @P%E`!s]㊒j!*B<@k,xMKcސwIF.tql$6,# H|>]$Ք#Jg ٰ~6^+Zh+8heNOٯ*Ш(JGvsV)PyJ7:a endstream endobj 133 0 obj << /Filter/FlateDecode /Length 187 >> stream xڭ1 0t*֦S*APEg[X#tP|R(Hr60S1&s+zJ3ËLնFa ^붡W 2N%`%3ߝ endstream endobj 134 0 obj << /Filter/FlateDecode /Length 183 >> stream x]1 P `AҩP Aѹ-=W(xݞo! IxG'H:ut6R&/YtٓS2cTxFujǸzFPUrqe.?:mHy+k[ȍ2.;ȭ+D4OhH }f endstream endobj 135 0 obj << /Filter/FlateDecode /Length 137 >> stream x323Q0P0T5T0T0PH1*2 (ZBds<,=\ %E\N \. 7;*!?701'W ₱ endstream endobj 136 0 obj << /Filter/FlateDecode /Length 234 >> stream xڍAJ1#Mw*P@]hiSx^dn`E})BA\ɤrŗ|^/xRqs5˴gJ˖7s*dNe{50hz|6>h?ˉK?8]dJZ|G  )OpЈJ!):y)'7 =ZD\ȭX|,"I`L趥o( endstream endobj 137 0 obj << /Filter/FlateDecode /Length 149 >> stream x313T0P0R5T01V05WH1*2 (Z@ds<L =\ %E\N \. L9 fH??A$#dCFcI`C=2 ?A endstream endobj 138 0 obj << /Filter/FlateDecode /Length 115 >> stream x323T0P0R5T02P05UH1*2 f\.'O.pC .}0BIQi*S!Ÿ?GA@8~? q~g` .WO@ endstream endobj 139 0 obj << /Filter/FlateDecode /Length 142 >> stream x323Q0P5Q5P04W05UH1*22 (s< =\ %E\N \. ; `;K_t{?v  H}`?'W # endstream endobj 140 0 obj << /Filter/FlateDecode /Length 192 >> stream xڵ= @ )"#8`@T0PK E(^)׈7H"SD=,|μ7A>w<|hCxa,֔9p79wd:`!׶ZR?ܕ>6b΄ 30hB#\-F鳀'G?Ʉ",JJ}QJ^Ѕ endstream endobj 141 0 obj << /Filter/FlateDecode /Length 100 >> stream x323T0P0R5T02P05WH1*2 \.'O.pC .}0BIQi*S! 0~g` .WO@J} endstream endobj 142 0 obj << /Filter/FlateDecode /Length 171 >> stream x33R0P0R5T03S06SH1*23 (Cds<L=\ %E\N \. ? v |>5`A A4 4h? ( ji.WO@T endstream endobj 143 0 obj << /Filter/FlateDecode /Length 141 >> stream x313T0P0R5T01V06SH1*2 (Cds<L =\ %E\N \. ?D|`&$@?`PLrzr^J endstream endobj 144 0 obj << /Filter/FlateDecode /Length 178 >> stream xڍ= @c&G\@7?X)kY}ML#MthtX=bQqEB́}1bo|XhhY/Ҡ`і\,DP}= n2Aم7*a . jv endstream endobj 145 0 obj << /Filter/FlateDecode /Length 187 >> stream xڝα@ #  # j"N>::htGqQڴlb0fiIgH#t5Mޣ +ۇ\r;BXlh\ FPd1wêۜ<4L$$=7|/[oS6FiՃɅ$%ܼA'-B ˠ2 endstream endobj 146 0 obj << /Filter/FlateDecode /Length 191 >> stream x31ֳP0P0V54W01V06SH1*21PAScTr.'~PKW4K)YE0???e $h  `{o9H?# @` md \=<Ģ endstream endobj 147 0 obj << /Filter/FlateDecode /Length 131 >> stream x363U0P0R5T06P06SH1*2 \.'O.p# .}0BIQi*S!dd*?H# Ă@,G?`~@3Փ+Uyn endstream endobj 148 0 obj << /Filter/FlateDecode /Length 183 >> stream x== @ 2sـj!*B ^)E Lx`xfR3PR1c&|`3Ҩ9.=k1#9.r:wˉ$\LԠ.#> stream x363V0P0T5R02W05PH1*22 (Ads≮=\ %E\N \. #v$? ?('37?05szrN[ endstream endobj 150 0 obj << /Filter/FlateDecode /Length 144 >> stream x313T0P0R5R01V06SH1*2 ([@ds<L =\ %E\N \. 쀓0HAHg? X @3.WO@` endstream endobj 151 0 obj << /Filter/FlateDecode /Length 178 >> stream xU1 0.iME;<::(: ^[GZq .CbqCϲ@&-'&:Sk`l:/G_T'*54t':Ð" l 4UTKR7hOa Dq endstream endobj 152 0 obj << /Filter/FlateDecode /Length 228 >> stream xUνjPHr NNyo4 l Ph'/@;:(xx+ԱҡkJpωmg*&ͪMI)36=> "wf&?lD[ݰdb'F W-9p&{ k\?@{ޗ%.Y X[tI_g  pCC*1 U@۲)ۈē endstream endobj 153 0 obj << /Filter/FlateDecode /Length 213 >> stream xMαjA=)Gp^ Ln!hD5Uʼu) i49cg\q?-Yv\ym靜b;KLʔ9 e[ lL<t)UD8%~*K> stream xU= @4M V ) endstream endobj 155 0 obj << /Filter/FlateDecode /Length 184 >> stream x%1 pqAxKG]ߟ AM:G*CcWҢ z]~3<폦񘇊f=ტ3i%.kEJfr͚ۑ`3gEfemam?P;%xba zH~vP ]*mB+UZ 4 "n-hm endstream endobj 156 0 obj << /Filter/FlateDecode /Length 178 >> stream xڵ1 @EZ&G\@7a][ n!hB: 7RZ,nE@ڼbf`t9a#jz‡Τaz6e䎕&cvH29%`8xQLj dZ7o+ZAF --m endstream endobj 157 0 obj << /Filter/FlateDecode /Length 114 >> stream x313U0P0W5T06U05QH1*2 (Bds<,=\ %E\N \.  fbC\\0 endstream endobj 158 0 obj << /Filter/FlateDecode /Length 224 >> stream xm1N@RD&G\kmD  * RTXr-]1AVԧ-j}|=ltiug!huck{}> stream xu=0  $/=B}(U`ćD$op5 –}CR︣|P55 #-!WgdK.CVx8B6]0rzDtURO6\ ҃yT))/xCÇ[L!!R[SIRH,> stream xڕ1 P `K kP|PGE7EBEJ'>BҰj\vg-vuhL $ .I!W9 oed, =0rRUppgp'֤o > stream xڕ=PR h /RLVr_:KU x HBn_1o>?K{99e;<㯔~Z)9<_?4*(Y̤LI曒S*&\7x#|Qb)B.c/>΁]nFAP ( R*ŽcF^4!Nz {ب\%FE)38KT4I$ endstream endobj 162 0 obj << /Filter/FlateDecode /Length 236 >> stream xm=N0JisF:K H@%jp*A+?@53׵:=rN}'OpQzi/9vҗigpl`60O !߹F Xb1y(G ( Pig`vT`2~$L ;/H4}*'bس\ r | endstream endobj 163 0 obj << /Filter/FlateDecode /Length 191 >> stream xڕ; @x4`n!hB:v*e3Ha2-3nv== |ROg%o!oeÚl>+W;6 _" gB."9@"H*hOq@)O.@8pqgͣɭ"1rMcK7L endstream endobj 164 0 obj << /Filter/FlateDecode /Length 254 >> stream xM1N0EE"M.dl$R AJ FbHsaKg=o;ig1řv?MԶ3-eSwl6V ħ8% cl=:8ʃ%BIo(xKWHrjAxc)6FY܎F[3%1!MroS4ZLeT7P,sӛoH endstream endobj 165 0 obj << /Filter/FlateDecode /Length 224 >> stream xuϱJ@i3/nT0Z'>ʂ/2EߙK mIvY+rşK^p#nB{-:3 i%bb&%FF+G\__Rcd5Y8W&#g[M<XbЂUF3 r]IW} endstream endobj 166 0 obj << /x28 86 0 R /x29 87 0 R /x3E 88 0 R /x7B 89 0 R /x7D 90 0 R /x5F 91 0 R /x27 92 0 R /x2C 93 0 R /x2E 94 0 R /x2F 95 0 R /x3A 96 0 R /x3B 97 0 R /x3D 98 0 R /x11 99 0 R /x2D 100 0 R /x10 101 0 R /x24 102 0 R /x25 103 0 R /x40 104 0 R /x1C 105 0 R /x1B 106 0 R /x1E 107 0 R /x41 108 0 R /x42 109 0 R /x43 110 0 R /x44 111 0 R /x45 112 0 R /x46 113 0 R /x47 114 0 R /x48 115 0 R /x49 116 0 R /x4B 117 0 R /x4C 118 0 R /x4D 119 0 R /x4E 120 0 R /x4F 121 0 R /x50 122 0 R /x52 123 0 R /x53 124 0 R /x54 125 0 R /x55 126 0 R /x56 127 0 R /x57 128 0 R /x59 129 0 R /x61 130 0 R /x62 131 0 R /x63 132 0 R /x64 133 0 R /x65 134 0 R /x66 135 0 R /x67 136 0 R /x68 137 0 R /x69 138 0 R /x6A 139 0 R /x6B 140 0 R /x6C 141 0 R /x6D 142 0 R /x6E 143 0 R /x6F 144 0 R /x70 145 0 R /x71 146 0 R /x72 147 0 R /x73 148 0 R /x74 149 0 R /x75 150 0 R /x76 151 0 R /x77 152 0 R /x78 153 0 R /x79 154 0 R /x7A 155 0 R /x30 156 0 R /x31 157 0 R /x32 158 0 R /x33 159 0 R /x34 160 0 R /x35 161 0 R /x36 162 0 R /x37 163 0 R /x38 164 0 R /x39 165 0 R >> endobj 167 0 obj << /Type/Encoding /Differences[16/x10/x11 27/x1B/x1C 30/x1E 36/x24/x25 39/x27/x28/x29 44/x2C/x2D/x2E/x2F/x30/x31/x32/x33/x34/x35/x36/x37/x38/x39/x3A/x3B 61/x3D/x3E 64/x40/x41/x42/x43/x44/x45/x46/x47/x48/x49 75/x4B/x4C/x4D/x4E/x4F/x50 82/x52/x53/x54/x55/x56/x57 89/x59 95/x5F 97/x61/x62/x63/x64/x65/x66/x67/x68/x69/x6A/x6B/x6C/x6D/x6E/x6F/x70/x71/x72/x73/x74/x75/x76/x77/x78/x79/x7A/x7B 125/x7D] >> endobj 168 0 obj [27.7 27.7 0 0 0 0 0 0 0 0 0 48.4 46.1 0 69.2 0 0 0 0 0 41.5 69.2 0 23.1 32.3 32.3 0 0 23.1 27.7 23.1 41.5 41.5 41.5 41.5 41.5 41.5 41.5 41.5 41.5 41.5 41.5 23.1 23.1 0 64.6 64.6 0 64.6 62.3 58.8 59.9 63.4 56.5 54.2 65.1 62.3 30 0 64.6 51.9 76.1 62.3 64.6 56.5 0 61.1 46.1 59.9 62.3 62.3 85.3 0 62.3 0 0 0 0 0 64.6 0 41.5 46.1 36.9 46.1 36.9 25.4 41.5 46.1 23.1 25.4 43.8 23.1 69.2 46.1 41.5 46.1 43.8 32.5 32.7 32.3 46.1 43.8 59.9 43.8 43.8 36.9 41.5 0 41.5] endobj 169 0 obj << /Filter/FlateDecode /Length 158 >> stream x363U0P04P52Q02W04UH1*24 ([s< ͹=\ %E\N \. ??1g`zj HC?=A?V|\\^ endstream endobj 170 0 obj << /Filter/FlateDecode /Length 328 >> stream x͓?N@ƇPlL^{GO401PVT#CUr=tuK.I' ,iHDj#AY5ҳ~$ @Sx endstream endobj 171 0 obj << /Filter/FlateDecode /Length 119 >> stream x340ҳP0P0Q5TP0TH1*4 (XAds<,M=\ %E\N \. PD2?`?6 AΦ$orzrxY) endstream endobj 172 0 obj << /Filter/FlateDecode /Length 100 >> stream x33Q0P0V5T01Q0TH1*21 (XAds<L =\ %E\N \. PQrcՓ+3;6 endstream endobj 173 0 obj << /Filter/FlateDecode /Length 148 >> stream x3T0P0Q5T07V0TH1*2 (XAds<,=\ %E\N \. b?@Q df3I`gC0`c1> P`Rd{b\\ endstream endobj 174 0 obj << /Filter/FlateDecode /Length 223 >> stream x퓱 @ O,}^iBUA'@{7#tt(iZb?_ӞFG81cqϢlpY,t<`8:D%[\ QϿ{ ߄*qz*Ja+\v|p.)ɑ(* & 15lU9f|vdnHg endstream endobj 175 0 obj << /Filter/FlateDecode /Length 261 >> stream xڕN0(C@ @RR`c"XS?Zŏ1C㮎0`仳u*%WQ]+Iwbmo)vJSsX)+=愆yxԂA#&}?]2w䭾Wؑ,R?)ʕ#"}^\]kgQO:a'κ"q7%L%uVJi*26t@6XXă>x5?0] endstream endobj 176 0 obj << /Filter/FlateDecode /Length 234 >> stream xڵ1N@E4>s(,pJD&>–[ F4iݯze)^.ۊw7Lv\pQ>wONTBq":FFPb49վU::b֐xff]F*ϙڻ3oPqae3u3-|S'R~!1TYWi:ʆ?: endstream endobj 177 0 obj << /Filter/FlateDecode /Length 242 >> stream xұn0?ʀt (@!R3TH?%1CDz/JLU-Et}> stream xڅ=N1FgisY#VJHPqBIAj/7Q|.V;F'}n7%]^s䖴m]#gr c=~qM vbYF Ja 3.3HGhr2(slJEJ"`#|!ۤhX:bՔ$>Yf2Ov9Lғxq endstream endobj 179 0 obj << /Filter/FlateDecode /Length 171 >> stream xб @ BzWB N>::(:_S;M'k#2diP1}' vvG,-RbnE\(C7'fpD> stream xڥJ0ƧP%A]v`{ԣEͣQ=P:L"AR~$]{7se/;L3/[ڞ^7f: y2m{zW`>?^Usx1[5P Y#NehWbr<WN2,t] iߟX0Yb"B! e^q:̤10> stream x37V0P0Q5T07P0RH1*23 \.'O.p33.}0BIQi*S!a<`2? `700@m ?!H?=$0#31D0Gp0j~ {b\\:ב endstream endobj 182 0 obj << /Filter/FlateDecode /Length 132 >> stream x363U0P0Q5T06R0VH1*2 (X@ds<,=\ %E\N \. ?;V %<`!1'W 9 endstream endobj 183 0 obj << /Filter/FlateDecode /Length 239 >> stream xѱj05ܢGȽ@8."ZLycd͏GĕWiҬ_g'w2JnKqN3y/yˮ SWl>yQsWq_e;|px[J M>Et}rvDo<@s0E}>]-m&=7F>"KtTOd֒c;,dz_6KA P> Pfǵm/> endstream endobj 184 0 obj << /Filter/FlateDecode /Length 226 >> stream xұ@ +Gȼ]h`|P꽫|/GHiw`!X]a0c@IŊMdey6Hп֖/d9"q.5ǣX,oEQ=S% qVdD4UjP82 |W(ӚBEPщzdmxnxDpO`C8<<-u9 endstream endobj 185 0 obj << /Filter/FlateDecode /Length 174 >> stream x37V0P0Q5T07P05VH1*23 &\.'O.p33.}0BIQi*S!0? `v0}3?`i1籇28a0؃ f" 85?=1 .WO@ endstream endobj 186 0 obj << /Filter/FlateDecode /Length 222 >> stream xڵ08#p/Ca4AM`xX{-e0a|\PF%)Ɍ.)Qr1! KD@3ejO늢<)E!?5X@eƆ-TLYPGFRX;ѶnlacRsѳIc/N;;O4}>~i \P>ƃ[/* endstream endobj 187 0 obj << /Filter/FlateDecode /Length 243 >> stream x͒=N@)+M#x.N@TRR%}4%GL2̌7Tfٺ|qje/szTuu_iPUI7֔yN KKE`=pd֤VCəBb`!p 0Ѝ|~{m~5<මQcLmOgڅ)ĂirR}b;+cbmEm endstream endobj 188 0 obj << /Filter/FlateDecode /Length 164 >> stream x353Q0P0V5T0T05VH1*21 (@ds<L̸=\ %E\N \. cH>` @; | @E<`Dr#HAy  8H!D20> stream x]1N@YspLl@$\ A,70(?Ahc.ҳ Zr> stream x353T0P0R5R01V07UH1*2 (Cds<L =\ %E\N \. 7$3vD~0&@0?~)%ÇA>`H2 ` 2~P1ȃ@r ?Z endstream endobj 191 0 obj << /Filter/FlateDecode /Length 175 >> stream x37V0P0Q5R07P05VH1*23 \.'O.p33.}0BIQi*S!c?@@(/n b`'(2>0?1Q `P/?t\=p endstream endobj 192 0 obj << /Filter/FlateDecode /Length 298 >> stream xڕ1J@Rʙ H6,UV{Pu6b)Sy73J?&O6^k}֛BkVOQUtMx!wDH"oϻȷwͽKCgr8> stream xڅбJ@ )۬o}M.V )|P2+b7#L2lE`vW'g&7(MU0+Yó*7Uk1oO*^/ A$ #c>EtN&Ǒ1g-k'ai9o[ $yc%hvqaV̽xN-ftzi.6,ANg6Df(@2eӲΥY'K?ȫzС6juO'ʷ endstream endobj 194 0 obj << /Filter/FlateDecode /Length 130 >> stream x333W0P04P5T05S07WH1*21([@s<L̸=\ %E\N \. IFL~ "0IvfQ.d0q\\7RH endstream endobj 195 0 obj << /Filter/FlateDecode /Length 296 >> stream x};N0ЉRDr#lf"-  *RR>҅a> stream xڍ;N0JaM_䍶D $8lIbqe +<" Q/مo|W7~M߶Å@tܫZW\@׮nӭߺ# f8#&B8 Lh{8g#)(AT$'4nF̚lN[*T}( EDiF:Kzt˦ ꒹i>[-4I9xdW(TfE/ve(y }%(z=mDcV;ѾeӺw^T2wwߺ`2] endstream endobj 197 0 obj << /Filter/FlateDecode /Length 215 >> stream xڽбJ@i\\ B:{Mbs~ARh Φ9nu'zTTjyP\k{f'RiJuYחG7ZKCd_yF :}Le~3TCĻfaf 3f@`:9;̈́ f1Õ?:\r endstream endobj 198 0 obj << /Filter/FlateDecode /Length 276 >> stream xڭJ0,9Gȼvץ[TXAГ=rP2GwQOt2̦a 8j u +w՚Poӫ۵|j[Zve{oW`k"~bcBJPSPJx ȵr7Ӝ ,]9 bv;2Cur`{"0O&%!BocfGx-^iψa6C#$IC?*1B0ꬒ̏G&#ݴ C!c endstream endobj 199 0 obj << /x2C 169 0 R /x43 170 0 R /x48 171 0 R /x49 172 0 R /x4C 173 0 R /x55 174 0 R /x61 175 0 R /x63 176 0 R /x64 177 0 R /x65 178 0 R /x66 179 0 R /x67 180 0 R /x68 181 0 R /x69 182 0 R /x6B 183 0 R /x6D 184 0 R /x6E 185 0 R /x6F 186 0 R /x70 187 0 R /x72 188 0 R /x73 189 0 R /x74 190 0 R /x75 191 0 R /x77 192 0 R /x79 193 0 R /x31 194 0 R /x32 195 0 R /x33 196 0 R /x34 197 0 R /x35 198 0 R >> endobj 200 0 obj << /Type/Encoding /Differences[44/x2C 49/x31/x32/x33/x34/x35 67/x43 72/x48/x49 76/x4C 85/x55 97/x61 99/x63/x64/x65/x66/x67/x68/x69 107/x6B 109/x6D/x6E/x6F/x70 114/x72/x73/x74/x75 119/x77 121/x79] >> endobj 201 0 obj [36.5 0 0 0 0 65.7 65.7 65.7 65.7 65.7 0 0 0 0 0 0 0 0 0 0 0 0 0 95 0 0 0 0 102.8 48.4 0 0 79 0 0 0 0 0 0 0 0 101 0 0 0 0 0 0 0 0 0 0 0 65.7 0 58.4 73 59.8 40.2 65.7 73 36.5 0 69.4 0 109.6 73 65.7 73 0 53.4 51.9 51.1 73 0 95 0 69.4] endobj 202 0 obj << /Filter/FlateDecode /Length 133 >> stream x323U0P0W54W02T04RH1*24(YBs< M=\ %E\N \. 773!36?8O?J=00 endstream endobj 203 0 obj << /Filter/FlateDecode /Length 94 >> stream x323U0P0W5T02P04RH1*24 \.'O.pU()*Mw pV0tQP@A\=m endstream endobj 204 0 obj << /Filter/FlateDecode /Length 103 >> stream x323U0P0W5T02P06SH1*24 \.'O.pCc.}0BIQi*S!‡ 0P+Փ+d3 endstream endobj 205 0 obj << /Filter/FlateDecode /Length 256 >> stream xڽ=N@'ris09qH@J "mnfn#lN `շ{|\%oڽҠw9}'.+Wi=?^\浫o@a` A2/@ hJJ9AF%Z$>#V5xŒ2M ?qg'f\mC74FߘO a\vhY8scͪi47-[S endstream endobj 206 0 obj << /Filter/FlateDecode /Length 115 >> stream x373W0P0V5T07T05SH1*2 (Cds<,=\ %E\N \. ?1   &r\= % endstream endobj 207 0 obj << /Filter/FlateDecode /Length 94 >> stream x363R0P0V5T06V05SH1*26PASsLr.'~PKW4K)YEo`?1\= endstream endobj 208 0 obj << /Filter/FlateDecode /Length 133 >> stream x353Q0P0V5T05R05SH1*2 (Cds<L,=\ %E\N \. @ÐQOcPPA?#j`.Փ+# endstream endobj 209 0 obj << /Filter/FlateDecode /Length 246 >> stream x}ҽj0 |/ڦp'CB=)v2E7ШAzjCRit.(;)\|Ao~b9eNj̶T0{5f3}czYSLYP 9BnOL;b?2XS. KBji7MH#CZ SUNtV1ubf9aWc4br0}w.3 kևa endstream endobj 210 0 obj << /Filter/FlateDecode /Length 190 >> stream xѱ @ !K?^kS*xέcO:v\ܻd8(CS5C> stream xu=0 `W  e GL@0(9BFơB}ËdUMMqNjFeEo %w/+.k̎ ̶cVq^0[Wc&63{6qăЈ z$Ҡor~4} K&.tBicAei; " C¢̲ endstream endobj 212 0 obj << /Filter/FlateDecode /Length 177 >> stream xڕ1 @ [25nvV@--7,G x[#Xۼt҄ 2 23:%xEI(|/XX2Ĩu[RvEA܀b.k+4Pj@Je% G$T_ڸQsw-pdγߧR1-}O endstream endobj 213 0 obj << /Filter/FlateDecode /Length 188 >> stream x35V0P0V5T05P05WH1*21 \.'O.ps.}0BIQi*S! h ?` u@<$a AnxRD@"I H0 WNF;RL bc? \\D endstream endobj 214 0 obj << /Filter/FlateDecode /Length 184 >> stream x]= @ )#^@cH0e *BVG2Esl-33/MLb?7ǘ.M.qr8SQRErcnb01KVT "D'jBԕs'SLՀo$H77t=|҇m9$ԠUIt| endstream endobj 215 0 obj << /Filter/FlateDecode /Length 149 >> stream x33R0P0V5T06W05WH1*26 (Z@ds<M=\ %E\N \. ??<31؃ uP?F$C0LG#K7r 3n endstream endobj 216 0 obj << /Filter/FlateDecode /Length 251 >> stream xڅJ0'a! жkXAГTr~[wb׶fEhC~"3LWwZO4\tv^ ʅ6jhemr"ZQrԱ~eƙCg,ՔN|&&GI@2i@k e9ʀz͝NV*|D18Q!boz endstream endobj 217 0 obj << /Filter/FlateDecode /Length 145 >> stream x35V0P0V5T0"sCB. D&9ɓK?\ĂK(̥PRTʥ`?0 ?$v H> a8C;"3aG"H200``$\= endstream endobj 218 0 obj << /Filter/FlateDecode /Length 118 >> stream x323U0P0V5T02Q0PH1*22 (ZBds< =\ %E\N \. `0 P`߀~0CmG\\ endstream endobj 219 0 obj << /Filter/FlateDecode /Length 191 >> stream xڵ10 PW*y @Rl Hd@#fzcȊcC&4d xBcCN_+jKƢZ[|=3i!a/AUԧ6r.ƬO>cmZHE@VG[r21ekI6#{ ᯒOqp endstream endobj 220 0 obj << /Filter/FlateDecode /Length 98 >> stream x323U0P0V5T02U05WH1*22 (Z@ds<=\ %E\N \. 3  2 G\\&fw endstream endobj 221 0 obj << /Filter/FlateDecode /Length 181 >> stream x= @/LGxMB0K*!*B`L:"{qRxwruq›m֟zGYNuBf 9-bG*_\QZ5P ΥQ8WA(Ɠֱݭי#JTW}/\-|7 endstream endobj 222 0 obj << /Filter/FlateDecode /Length 140 >> stream x35V0P0V5T05T06SH1*2 !2ɹ\N\ &\@a.}O_T.}gC.O30a`? @?@# =YD@&ui endstream endobj 223 0 obj << /Filter/FlateDecode /Length 170 >> stream x313W0P0V5T01Q06SH1*21 !2ɹ\N\ &\@a.}O_T.}gC.OH600IzAȀp VT$PHYO*i|]ȶCBh=$_\\ө& endstream endobj 224 0 obj << /Filter/FlateDecode /Length 184 >> stream x35V0P0R54W0T06SH1*21(Cs<L̹=\ %E\N \. 1g`$00I @(A?? 73:ôHvHڃqHg2@:@$0\\\"p8 endstream endobj 225 0 obj << /Filter/FlateDecode /Length 136 >> stream x33V0P0R5T06CB.c9D&9ɓK?\؄K(̥PRTʥ`@hng`dg`ADÉz q? "4'1.WO@  endstream endobj 226 0 obj << /Filter/FlateDecode /Length 182 >> stream x%1 PD'XS)> stream x363T0P0R5T06T05RH1*2 (Cds<,=\ %E\N \. ?P y$(F%NcPF{car endstream endobj 228 0 obj << /Filter/FlateDecode /Length 138 >> stream x35V0P0V5T05T06SH1*2 !2ɹ\N\ &\@a.}O_T.}gC.O g` ??@5JC"  @e.n``@*\=| endstream endobj 229 0 obj << /Filter/FlateDecode /Length 230 >> stream xu1j@6L=Y$Ղ@T*]dt[n!<]Q<=ќ$chahSsZ<\/_߸$Mj,w[,Vg*z!k?C>AAI҉^ '(/=s-sO\6}޵mZ3ɱWjdL A8`Fu2V"Ø'&ڥkA endstream endobj 230 0 obj << /Filter/FlateDecode /Length 236 >> stream xeϱN@ aWNr@IB "ZȀD':vj%DtkEo1Ct>F|o_^5M9s{2M>mpQaJyɓ1iݯ1Y,)goI,,Ř s[cѨ ŨI'EpaDƎ+G5G]PW'햇1KNpS_Nc-Jc ~ endstream endobj 231 0 obj << /Filter/FlateDecode /Length 180 >> stream xڵ1 @ ) F7![ZyPr!b矬rƣ)gsÇ ɔnr*KzǦ$rcvHyBvV@B@^!3B3b:bIE#B9Ko ;w.&"iJr5hii endstream endobj 232 0 obj << /Filter/FlateDecode /Length 114 >> stream x313W0P0W5T01P05VH1*26 &\.'O.pcc.}0BIQi*S!A?@D``@% @PFpzr`Ҏ endstream endobj 233 0 obj << /Filter/FlateDecode /Length 225 >> stream xm=J1+H%$qyLx*8 PK : d )Gx?b/pM2'?[o{Йgk+2ɴwM{Ųik9> stream x}1j@EGl!fs[v$a\ "T9@2E]k*= UH`?9lF6r7GmWO=WRz1W\n\^e`!y Cv2u48`̼L֐T(688[f{DSbi_/SAXP7 ˨e8ع]FI[jsa|£ endstream endobj 235 0 obj << /Filter/FlateDecode /Length 183 >> stream xڕ1@P:i8s K(IP0FkL( m0TN?ό1\|Rt%0H7 kEf7[gݒ}$Y|BGFְ,+v`"6h\氀yb SL +td_i6 endstream endobj 236 0 obj << /Filter/FlateDecode /Length 220 >> stream xڅ1nP `G"yyG/@SHO 5CvZFy n$. QߩD]\֏l8eΛW9Ηo2f%WUTDQ32 G{(՘sE0&ܝh=PHiY ,#'\L'|h4, p endstream endobj 237 0 obj << /Filter/FlateDecode /Length 226 >> stream xuKN00U $QUfQ8d-|;XD g4jqT29qp&u}yzUţK.6snn-snHe@O+5w`AHv Dg'W3 Z%9o%#zkA"UGѮi #1p"͑øv\2K%A#im }5 endstream endobj 238 0 obj << /Filter/FlateDecode /Length 194 >> stream xڝ1P ` Kpzg2&D'8x- ^1¢o*D8#Tc CI8&4qt5T!K<.{%>փ|g*"uYzFTLN'֌H]<"֚> stream xmбN0;eŏ{HKU"Ȁ+Rad??B ],r#+iJFF^6['7l$w:p/_=\7Ly A \!AAH.1 t:C5(FU!Μ 3kĺ2U/8e&+aWhИ>83c7VD=@G8sd endstream endobj 240 0 obj << /x2C 202 0 R /x2E 203 0 R /x3A 204 0 R /x43 205 0 R /x48 206 0 R /x49 207 0 R /x4C 208 0 R /x4D 209 0 R /x55 210 0 R /x61 211 0 R /x63 212 0 R /x64 213 0 R /x65 214 0 R /x66 215 0 R /x67 216 0 R /x68 217 0 R /x69 218 0 R /x6B 219 0 R /x6C 220 0 R /x6D 221 0 R /x6E 222 0 R /x6F 223 0 R /x70 224 0 R /x72 225 0 R /x73 226 0 R /x74 227 0 R /x75 228 0 R /x77 229 0 R /x79 230 0 R /x30 231 0 R /x31 232 0 R /x32 233 0 R /x33 234 0 R /x34 235 0 R /x35 236 0 R /x36 237 0 R /x37 238 0 R /x39 239 0 R >> endobj 241 0 obj << /Type/Encoding /Differences[44/x2C 46/x2E 48/x30/x31/x32/x33/x34/x35/x36/x37 57/x39/x3A 67/x43 72/x48/x49 76/x4C/x4D 85/x55 97/x61 99/x63/x64/x65/x66/x67/x68/x69 107/x6B/x6C/x6D/x6E/x6F/x70 114/x72/x73/x74/x75 119/x77 121/x79] >> endobj 242 0 obj [26.5 0 26.5 0 47.7 47.7 47.7 47.7 47.7 47.7 47.7 47.7 0 47.7 26.5 0 0 0 0 0 0 0 0 68.9 0 0 0 0 74.7 36.2 0 0 57.4 90.6 0 0 0 0 0 0 0 73.4 0 0 0 0 0 0 0 0 0 0 0 46.4 0 42.4 53 43.7 29.2 47.7 53 26.5 0 50.4 26.5 79.5 53 47.7 53 0 39.3 37.7 37.1 53 0 68.9 0 50.4] endobj 243 0 obj << /Filter/FlateDecode /Length 138 >> stream x313U0P0U0Q06U06SH1*26PAc#Dr.'~PKW4K)YEc`  `d=0s@f d'n.WO@6c+Z endstream endobj 244 0 obj << /Filter/FlateDecode /Length 409 >> stream xڵMN0]d!ᯬ" VX:A]J^ĽAYD6N4'vf3*?̜,.ũyw ;M/K=E;Yyo>?^u|6s]OO||zRRbr*S0d06w5a]ta-!zp% }W/g>Ի) OHI:Z:o\ SȓBXw8lɇV\\vH6b.!r} {B?b2u7 bLq%q UcsQ;O`}sl@n!jKf@tQh,Pt^ADhG*JLOhR(UWZh]L 1-bdyS(fsX}[ endstream endobj 245 0 obj << /x88 243 0 R /xA9 244 0 R >> endobj 246 0 obj << /Type/Encoding /Differences[136/x88 169/xA9] >> endobj 247 0 obj [41.5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 92.2] endobj 248 0 obj << /Filter/FlateDecode /Length 98 >> stream x363T0PP5T02V04QH1*24 ()Lr.'~8PKLz*r;8+ry(60`ÞՓ+a endstream endobj 249 0 obj << /Filter/FlateDecode /Length 178 >> stream x333V0P0R5T0P0TH1*25 (Ces<L͸=\ %E\N \. $c`sT;H2`u?:05`S 0CA;LcS @ th=@ _v@_㣸\=X endstream endobj 250 0 obj << /Filter/FlateDecode /Length 297 >> stream xŒN0 ]P)KyhctD$XF-O+Q3D5\;j[ϛ4feNԬ6a:{vOj۩~U_ڼ=z{sn0C#bDT(#y{X=^ZN_I8,ByX*T Z8VGhS/ _ڑ6rc3@<b<=d |Eq,O,$Z$XNsH; 'Ɉɒ^dmR.YTFV/en?, endstream endobj 251 0 obj << /Filter/FlateDecode /Length 201 >> stream xڍ=0w &v0FguZxzFZ b;K_4F}z8 > B|gWfXr;7s@,k-֊#BLH m< v|jx5 eh"Y (WUyTjPF:낮ظ["ƒdTJD`)`ᝤ$ endstream endobj 252 0 obj << /Filter/FlateDecode /Length 98 >> stream x313W0P0V5T0P03WH1*26 (Y@ds<M=\ %E\N \. @ Q3\=]Q endstream endobj 253 0 obj << /Filter/FlateDecode /Length 143 >> stream x333V0P0Q5T0"sCB.SsD&9ɓK?\ԜK(̥PRTʥ`'D?(Qэh4#@PnLr Gk endstream endobj 254 0 obj << /Filter/FlateDecode /Length 277 >> stream xڽN0 u䥏PzB*  &@0_G`V :Hqmo/״ {lW=+v=v7,c73vKq C RdhKP~clObtQ[StCsN<( $p] 4Qӄf2O!T0p K%Rt-0[o^8')%]"G޳ޭID1Helz/@ endstream endobj 255 0 obj << /Filter/FlateDecode /Length 238 >> stream xڭ=0G:#.$ &:yut GÛ  BKIMKRR Q@4PS0/zT=L9qCw-э7tOη c$rԂ6 |sZ\oFըJ^EQ}S{LtQ[普Q nd9k2`Qnu|=AW'kY].K# K莩UW1>px= endstream endobj 256 0 obj << /Filter/FlateDecode /Length 224 >> stream x}ϽN0! r/&+Ȁ TeN-}?B VwvJ '˾]ynx[n=|vۻE7 O{={`9=1h  $8Is&ȌkVℭ%dH 1gFp1Op!Åo mʧLXQ݀nT*e,UL>@*) endstream endobj 257 0 obj << /Filter/FlateDecode /Length 217 >> stream xő; @'Xfnޱ>V@--b&!E:V6cgbK|pQA.(C(D50lNijلtj~_Q? h3 JK6keDހ4M Wkp:E2&I>ӊ`lolӺkZ DJh÷3W5N3\*P5 endstream endobj 258 0 obj << /Filter/FlateDecode /Length 207 >> stream xڭ= @'L+4&BT0PK E,VIe%l{a7;V͇3ABjBjL/Ev =e]'b̖\hf RZtl!M z"s؈{O/ˎꎕq H\q%4n9m ㇫ wo@K endstream endobj 259 0 obj << /Filter/FlateDecode /Length 213 >> stream x1@R^w7&n` g3s\SR@ R8=@> stream xu=n@Ǣ4s0E)-#"RRq Jjh>r k7XŧގvVŬ,e!~%==9^x]q~9Cs^}ߙF ڦ:ժ=QAT*D#C .Ⱥ;)h6ٌt:cv#R~~52Y , 0JkqQP#!]7@ endstream endobj 261 0 obj << /Filter/FlateDecode /Length 269 >> stream xڕ=N0J!J'i--  *H f>JŊx؂y9'7lܸu{ZW;Ni:_~p{xҭ| d2G HDGJHXV$A UT$R+'؊#A 5d* kRQEԲmmVhq,Ve1H /ɺeI.gT4F?m?rœ_ljO% endstream endobj 262 0 obj << /Filter/FlateDecode /Length 161 >> stream x333V0P0Q5T0T0PH1*25 (YBds<LM=\ %E\N \. A7`F0uD10);v eH?Q ?0)E `R(<6~(Q 5 (.WO@x+ endstream endobj 263 0 obj << /Filter/FlateDecode /Length 123 >> stream x363T0P0Q5T0P0TH1*22 (Ces<L=\ %E\N \. c=}`GFA,P P%`0=b@\\Egs endstream endobj 264 0 obj << /Filter/FlateDecode /Length 101 >> stream x363T0P0Q5T0T0PH1*22 (YBds<L=\ %E\N \. 30`?@o`ztݽ endstream endobj 265 0 obj << /Filter/FlateDecode /Length 196 >> stream xѱ p{2P'A rjj-1(hk!Zm_#:E>=cH)d) Kn6A7a6$Ue0k@sIp(<ۥbm4kqipKTxmiɓ-io7 ./Q_ endstream endobj 266 0 obj << /Filter/FlateDecode /Length 155 >> stream x333V0P0Q5T0T01QH1*25 M!2ɹ\N\ \@a.}O_T.}gC.O ?g`?PT;? 0Ð BQ(ylPjQ\\ܰ^ endstream endobj 267 0 obj << /Filter/FlateDecode /Length 203 >> stream xڥ;`Pl 5D+h#PR]d%;-ȣ9 #:x0ѣp9lNWL3tnEF7Wc&dy@"hlAja u̥ÍZlŵ:œP* uPw@Oaet٧3F֑В=y7QȚk n2<&O endstream endobj 268 0 obj << /Filter/FlateDecode /Length 215 >> stream xڵѱn0<GȀ|ѪR ||GHz\8'pᰛK.՚gR8f笚nlxWooSU"Ot@&3=td8dR9s=ؼ"mc$AmbbXils'pMn endstream endobj 269 0 obj << /Filter/FlateDecode /Length 151 >> stream x31ճP0P0V5T01R01QH1*2 (Bds<-=\ %E\N \. 301300300f0cppL|` H#&c#\=׀ endstream endobj 270 0 obj << /Filter/FlateDecode /Length 216 >> stream xE1j@* 8- J`;)lH7({. 43mֲVkivr\B7wot\?Y,׻x8bDߚH''40AG ꏓӝ?T&tlzD$ag"z輻oia^g3zk7vz)Y[NT VW[ǁ_- endstream endobj 271 0 obj << /Filter/FlateDecode /Length 162 >> stream x313S0P0R5R06W03RH1*26 (@ds<M=\ %E\N \. '>ph @Pπ+П 7@7@30Ca.WO@FY endstream endobj 272 0 obj << /Filter/FlateDecode /Length 260 >> stream x}AJ0tQ&GwtlBЕP.fu .z\$ޠ.Jt^HyNk&rKz5mxwΞ,tvΪ{z?|lpMnH)ţJcR+/f@Zac%<p-x=@P{=6rc|zӥ& *AQi1RȅOu2w̍W}Dj9AJZiw^nbuJ?P endstream endobj 273 0 obj << /Filter/FlateDecode /Length 118 >> stream x35S0PT5T01W03QH1*2 (Bds<-=\ %E\N \. D4? @``B00}fl'W 7ʗ endstream endobj 274 0 obj << /Filter/FlateDecode /Length 258 >> stream xm1N0YXɍ`_e#ZZ@"T()XAmK\GR2X@)|={ >~y6c"~g&1 ˦s?3c6%,5fǙ&Sl e#+Yl9E|5K]imĢ lYd:L4R5Rƙߙ7ډ 0<"(bxZԹDVފܢjUU1\N, endstream endobj 275 0 obj << /Filter/FlateDecode /Length 250 >> stream xڅ1N@ E!sUvQ6.H@%h9J0g!'m CׄpjQyyshZ>߸>?^‰ B^Dr!E&Bdr: IvHjX أMߧ3Ҩ"F,uXWL8"aa9ݞ6Yڬlɸh5lfكc'wΥtyDcG F8 “_l/[~ endstream endobj 276 0 obj << /Filter/FlateDecode /Length 199 >> stream xڭп p{0K?CPSP EA/o#8:&'CMp?\O:ҾP=GřTŁz.;|vLZUe^/X\mZV,Bb $o$ $(: f ;H83&6( 7AV3inA] & IDZ@x埄Y}U endstream endobj 277 0 obj << /x2E 248 0 R /x1C 249 0 R /x43 250 0 R /x45 251 0 R /x49 252 0 R /x4C 253 0 R /x4F 254 0 R /x52 255 0 R /x61 256 0 R /x62 257 0 R /x63 258 0 R /x64 259 0 R /x65 260 0 R /x67 261 0 R /x68 262 0 R /x69 263 0 R /x6C 264 0 R /x6D 265 0 R /x6E 266 0 R /x6F 267 0 R /x70 268 0 R /x72 269 0 R /x73 270 0 R /x74 271 0 R /x79 272 0 R /x31 273 0 R /x32 274 0 R /x33 275 0 R /x34 276 0 R >> endobj 278 0 obj << /Type/Encoding /Differences[28/x1C 46/x2E 49/x31/x32/x33/x34 67/x43 69/x45 73/x49 76/x4C 79/x4F 82/x52 97/x61/x62/x63/x64/x65 103/x67/x68/x69 108/x6C/x6D/x6E/x6F/x70 114/x72/x73/x74 121/x79] >> endobj 279 0 obj [62.3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31.1 0 0 56 56 56 56 0 0 0 0 0 0 0 0 0 0 0 0 0 0 80.9 0 73.5 0 0 0 41.7 0 0 67.3 0 0 84.2 0 0 83.6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54.5 62.3 49.8 62.3 51.1 0 56 62.3 31.1 0 0 31.1 93.4 62.3 56 62.3 0 45.8 44.2 43.6 0 0 0 0 59.1] endobj 280 0 obj << /Filter/FlateDecode /Length 169 >> stream xu10A qEH$\ AXbiw67S)O<7|t%]5eB%u`]ȝ8vKdW Жx>gvQW`H2jN)D'RQwd;Z[ endstream endobj 281 0 obj << /Filter/FlateDecode /Length 166 >> stream x363V0P0S5W02Q01UH1*2 (Ads< -=\ %E\N \. 3?Cc50zD Az3b&3 E@뀖:@qzrf endstream endobj 282 0 obj << /Filter/FlateDecode /Length 157 >> stream x=10 Ep|&%+R`s8G bj8-KA7^X[Of'L.(l"]-"L-b1'TNuBw[zۿT:Xs endstream endobj 283 0 obj << /Filter/FlateDecode /Length 85 >> stream x363V0P04Q5W02P01UH1*2 (Aes≮=\ %E\N \. $v.WO@ endstream endobj 284 0 obj << /Filter/FlateDecode /Length 159 >> stream x-10Q ]nH@e Sx%؍\d]NVڨPiz$>ƾ6۩VZ/Q\k-i3B%T@sl ~ k[fOgMFf1K.vSEݼAI*s endstream endobj 285 0 obj << /Filter/FlateDecode /Length 102 >> stream x363V0P04V5W06R01UH1*2(As< -=\ %E\N \. 0d"$Vg endstream endobj 286 0 obj << /Filter/FlateDecode /Length 103 >> stream x363V0P0R5W02T01UH1*2 (Ads< -=\ %E\N \.  @Kr 1k endstream endobj 287 0 obj << /Filter/FlateDecode /Length 149 >> stream x363V0P0V5W06T01UH1*2 (Ads<,=\ %E\N \. ?? ?dF fb $!|ۀn ?rS endstream endobj 288 0 obj << /Filter/FlateDecode /Length 152 >> stream x363V0P0V5W06T01UH1*2 (Ads<,=\ %E\N \. 3133@C?Aj46Anv@~r N endstream endobj 289 0 obj << /Filter/FlateDecode /Length 91 >> stream x363V0P0QеP06P5RH1*22 (A$s≮=BIQi*S!BC==2qzr endstream endobj 290 0 obj << /Filter/FlateDecode /Length 93 >> stream x363V0P0VеT06T04UH1*2 (@ds<,=\ %E\N \. S3000'W >HG endstream endobj 291 0 obj << /Filter/FlateDecode /Length 121 >> stream x363V0P04R04W02Q01PH1* 1T*9ɓK?s{*r;8+ry(<A?@P3gՓ+1'Z endstream endobj 292 0 obj << /Filter/FlateDecode /Length 113 >> stream x363V0P04R54P02VPH1*24-`Rɹ\N\ \@ .}O_T.}gC.O77C?zr g" endstream endobj 293 0 obj << /Filter/FlateDecode /Length 143 >> stream x363V0P0Q5W0Ҧ )\\Ff@AS#Lr.'~PKW4K)YE? ?|q#713!n < 0b.WO@ endstream endobj 294 0 obj << /Filter/FlateDecode /Length 96 >> stream x363V0P04V5T02R0PH1* (YBes<,=\ %E\N \. 7gc\=- 7 endstream endobj 295 0 obj << /Filter/FlateDecode /Length 96 >> stream x363V0P0R04T06R02WH1*26PAC3Lr.'~PKW4K)YEA86\\* endstream endobj 296 0 obj << /Filter/FlateDecode /Length 90 >> stream x363V0P0S04T0P04SH1*22 (B$s<=L=}JJS <]!r 6 endstream endobj 297 0 obj << /Filter/FlateDecode /Length 97 >> stream x363V0P0W02T02W01TH1*22PA#Lr.'~8PKLz*r;8+ry(g\<o 4' endstream endobj 298 0 obj << /Filter/FlateDecode /Length 138 >> stream x363V0P0R5T06R01PH1*26PACLr.'~PKW4K)YE7NJga?1?A<X\\,fH endstream endobj 299 0 obj << /Filter/FlateDecode /Length 197 >> stream xe= @7l!L#8h jih+^,G#.8>c;ogӬr} 9řG;JcΒdhɀ)b E|=*ǬU|Wjc 2F=E\ unAK}Rc֨Gb`Tk ;gx¾'R9 Wp/4)iq9 endstream endobj 300 0 obj << /Filter/FlateDecode /Length 204 >> stream x%1j0P  $1)6 E rd I-/^DGRD8ݎ78x7aQ3 u ;=tϥn~ߟ3t<,On5 ڔ4v).8uoɭHRʉ*(/)R)6VkRzUi_6xŖ}tQ o endstream endobj 301 0 obj << /Filter/FlateDecode /Length 149 >> stream x363V0P0R5T06R01TH1*26PA#Lr.'~PKW4K)YE`@?{3?f` pl=Y3 \\u endstream endobj 302 0 obj << /Filter/FlateDecode /Length 155 >> stream xm=0 F eD$8tdr Q˖ҳnrҐ3hmEjjعܰ d[T{ѨW;n`@fd9r# oiYĒ3bƂc*?k/<.!_ endstream endobj 303 0 obj << /Filter/FlateDecode /Length 154 >> stream x363V0P0T5T06T01PH1*26PACLr.'~PKW4K)YE?331??C?fP3q3Iyd{ A?}\\lu endstream endobj 304 0 obj << /Filter/FlateDecode /Length 126 >> stream x363V0P0R5T06V01PH1*26 (Bds< =\ %E\N \. @̎?dž?ff``c > gD\\p_h endstream endobj 305 0 obj << /Filter/FlateDecode /Length 130 >> stream x363V0P0T5T06R01PH1*26 (Bds< =\ %E\N \. 0 3 ~ #?@`L,V n`A|.WO@ wv endstream endobj 306 0 obj << /Filter/FlateDecode /Length 178 >> stream xu 0 B_!yΫ`|A*{=Ja/G-2*h^*TFJ5n7  .A==+갦̆ح4)r`HءCC;lk-{|sG(wݶsvCv#4;Ͱ5p۴o@ endstream endobj 307 0 obj << /Filter/FlateDecode /Length 92 >> stream x363V0P0S5T0T01PH1*2 (Bds<=\ %E\N \. !4\=] endstream endobj 308 0 obj << /Filter/FlateDecode /Length 141 >> stream x363V0P0T5T06V01PH1*26 (Bds<=\ %E\N \. ?`<xÇ#{ Fv szriw endstream endobj 309 0 obj << /Filter/FlateDecode /Length 138 >> stream x363V0P0Q5R0҆ )\\Ff@A "ɥ`dƥU()*Mw pV0tQ 00qC}C}?1a] {Ar} wrzróo endstream endobj 310 0 obj << /Filter/FlateDecode /Length 151 >> stream xڍ-1!M @d P^#D-@ >7/L'Ax; N+g-B+{OE6;-b6q-Ȧq\Q@EHӣ􄾨4JzrȊ]> _e p endstream endobj 311 0 obj << /Filter/FlateDecode /Length 173 >> stream x}10 Pp|HڔRH0q`D[r42v0q<%C9M %9^PYuzO֢^5fCㄺ.(fI*f%d0{!8"*v~t>7dh^^y 7`rZH0؏?Y1}H9 endstream endobj 312 0 obj << /Filter/FlateDecode /Length 196 >> stream xM=jP* [Dh/)@T*]HH:J(:J“ܸ`]u/rsT+*P跖kUٟtSkeZƚ[;jٽZA$~=j=!1,Vqcjbj)$@/ Fqh )0Ҕ:\-"o% ^A.Z?k3 endstream endobj 313 0 obj << /Filter/FlateDecode /Length 115 >> stream x363V0P0R5T06R01PH1*26PACLr.'~PKW4K)YEoF?a昁?8\=Nu endstream endobj 314 0 obj << /Filter/FlateDecode /Length 133 >> stream x363V0P0T5R06V01PH1*26 (Ads<=\ %E\N \. 4 A,|C\\Ym endstream endobj 315 0 obj << /Filter/FlateDecode /Length 170 >> stream xڅ1 @ a=tItV@--7!K5r)d6v_3L\dpsǙ<᳣ 9]dd;~ܟ~Ŏ;LhZ/!҅"D$Na&Q ?L} !j)m> endstream endobj 316 0 obj << /Filter/FlateDecode /Length 163 >> stream x-= 1 )4ڮ jihh9Jb8 =ͧjr4fԴtxEg%Y;@΢Ho~{t%Y+KqIPZDT,d{"0W;Kx@G%{V jи,K endstream endobj 317 0 obj << /Filter/FlateDecode /Length 165 >> stream x}α @ +#4/w*8Y XGE7AhQ xm]q?Ot!O0wXS 4L'(=z1ذv[nH"SFURYd8i4VyɠCw~t]w4zg씴w- {L_o endstream endobj 318 0 obj << /Filter/FlateDecode /Length 157 >> stream x363V0P0U5T06P0PH1*22 \.'O.p#S.}0BIQi*S!30 7o` X0L@?6#| ]szr^1 endstream endobj 319 0 obj << /Filter/FlateDecode /Length 167 >> stream xu= @FgPv fvQ-%^%~LE_+\:ܾ(i endstream endobj 320 0 obj << /Filter/FlateDecode /Length 165 >> stream x]= @#컀n~hL!hBzQ)Wor1/%RfK|碊e9߸nXXbͺ񺲮kɹ(@ z"맭utT1)GѴA9O&ڑ&@W^ H endstream endobj 321 0 obj << /Filter/FlateDecode /Length 141 >> stream x363V0P0R5T0T01PH1*22 (Bds<̹=\ %E\N \. 70dP` >JFp szrɄe endstream endobj 322 0 obj << /Filter/FlateDecode /Length 207 >> stream xUn@ e8˽pPu `CU}ʘ)0 e?~2<'^ϲvi::Z}l)q9gŻ_Φ8.^8[6Ir"JZHT^RDz>\[őRD2EC947zDy 5Z)V8MngJ`/ endstream endobj 323 0 obj << /Filter/FlateDecode /Length 137 >> stream x363V0P0T5T06V01PH1*26 (Bds<=\ %E\N \. 3أ u``c?#C ۓ000@\=i3 endstream endobj 324 0 obj << /Filter/FlateDecode /Length 111 >> stream x363V0P0S5T06P01TH1*22 F\.'O.p#.}0BIQi*S!3"h`E @5D 0dszr=;l endstream endobj 325 0 obj << /Filter/FlateDecode /Length 169 >> stream x}1 @irtw,$ Q-> stream x363V0P0Q5T06T01PH1*22  !2ɹ\N\ F\@a.}O_T.}gC.O?8`  >'W ֛ endstream endobj 327 0 obj << /Filter/FlateDecode /Length 140 >> stream x363V0P5!cS# CB.c3%T*9ɓK?\،K(ΥPRTʥ` @Av@ž0?? < XՓ+ler endstream endobj 328 0 obj << /Filter/FlateDecode /Length 129 >> stream x363V0P0T5T06V0PH1*26 (YBds<=\ %E\N \. u,3(0300؃?#C ۓ000@\=B endstream endobj 329 0 obj << /Filter/FlateDecode /Length 159 >> stream x363V0P0Q5T06P0PH1*22 \.'O.p#3.}0BIQi*S!c?g7PC=` 9?4#< Ar YW endstream endobj 330 0 obj << /Filter/FlateDecode /Length 165 >> stream xڍ10 PW"y @H Hd@#VPƍ:z@FCG9Y1v謤9eh6,hΧME?#*@P@&4'bP)gmC+ӑ>4 nC $pqs endstream endobj 331 0 obj << /Filter/FlateDecode /Length 133 >> stream x363V0P0R5T06R0PH1*26PA#KLr.'~PKW4K)YE<{;;3 sv oP? @1012N endstream endobj 332 0 obj << /Filter/FlateDecode /Length 154 >> stream x˱ 0\XzMF-NL"A@T ()@P'L&X %UvN,KNynnŗiinTzgv9}`J> stream x363V0P0R5T0T06SH1*22 (Cds<̹=\ %E\N \. ώ7003000O=v?y8f3>Z0\=j endstream endobj 334 0 obj << /Filter/FlateDecode /Length 120 >> stream x363V0P0T5T06V0PH1*26 (YBds<=\ %E\N \.   C?P;.WO@MFH endstream endobj 335 0 obj << /Filter/FlateDecode /Length 148 >> stream x363V0P0R5T06R0PH1*26PA#KLr.'~PKW4K)YE3:PG=c??O!07@@??'W ytZ endstream endobj 336 0 obj << /Filter/FlateDecode /Length 147 >> stream x363V0P0T5T06V0PH1*26 (YBds<=\ %E\N \. 00c?jT!p6?PG)x1d.WO@L endstream endobj 337 0 obj << /Filter/FlateDecode /Length 176 >> stream x]O PE0\, V[ղEQk.Es~FofOLƂxNYxҙú|?OJw,WjO\r;n\LuTJ_AYHzyU>x*թGԩ4UlwCMm*WZJھA endstream endobj 338 0 obj << /Filter/FlateDecode /Length 162 >> stream xM1 @DW,>f j!*PK Ek9Wk)S4)f\fI$[B7 ӃN7[gNRDcle S5FoTO1!@ ZP钌 ׁ?G^ endstream endobj 339 0 obj << /Filter/FlateDecode /Length 170 >> stream x363V0P0V5R06T01TH1*2 (Cds<,=\ %E\N \.  ? 00P;7#ɳO,F;\=Ѳz endstream endobj 340 0 obj << /Filter/FlateDecode /Length 125 >> stream x363V0P0S5T0T01TH1*2 (Ads<=\ %E\N \. f0b?70g0Fbr ch? endstream endobj 341 0 obj << /Filter/FlateDecode /Length 163 >> stream x363V0P0V5R06T01TH1*2 (Cds<,=\ %E\N \. g``b~d<a0Bf$ 0С\\e; endstream endobj 342 0 obj << /x28 280 0 R /x29 281 0 R /x3C 282 0 R /x7C 283 0 R /x3E 284 0 R /x5B 285 0 R /x5D 286 0 R /x7B 287 0 R /x7D 288 0 R /x5F 289 0 R /x20 290 0 R /x27 291 0 R /x2C 292 0 R /x2F 293 0 R /x3A 294 0 R /x3D 295 0 R /x2D 296 0 R /x22 297 0 R /x23 298 0 R /x24 299 0 R /x25 300 0 R /x41 301 0 R /x42 302 0 R /x44 303 0 R /x45 304 0 R /x46 305 0 R /x47 306 0 R /x49 307 0 R /x4D 308 0 R /x4F 309 0 R /x50 310 0 R /x52 311 0 R /x53 312 0 R /x54 313 0 R /x55 314 0 R /x5A 315 0 R /x61 316 0 R /x62 317 0 R /x63 318 0 R /x64 319 0 R /x65 320 0 R /x66 321 0 R /x67 322 0 R /x68 323 0 R /x69 324 0 R /x6B 325 0 R /x6C 326 0 R /x6D 327 0 R /x6E 328 0 R /x6F 329 0 R /x70 330 0 R /x72 331 0 R /x73 332 0 R /x74 333 0 R /x75 334 0 R /x76 335 0 R /x77 336 0 R /x79 337 0 R /x7A 338 0 R /x30 339 0 R /x31 340 0 R /x37 341 0 R >> endobj 343 0 obj << /Type/Encoding /Differences[32/x20 34/x22/x23/x24/x25 39/x27/x28/x29 44/x2C/x2D 47/x2F/x30/x31 55/x37 58/x3A 60/x3C/x3D/x3E 65/x41/x42 68/x44/x45/x46/x47 73/x49 77/x4D 79/x4F/x50 82/x52/x53/x54/x55 90/x5A/x5B 93/x5D 95/x5F 97/x61/x62/x63/x64/x65/x66/x67/x68/x69 107/x6B/x6C/x6D/x6E/x6F/x70 114/x72/x73/x74/x75/x76/x77 121/x79/x7A/x7B/x7C/x7D] >> endobj 344 0 obj [35.3 0 35.3 35.3 35.3 35.3 0 35.3 35.3 35.3 0 0 35.3 35.3 0 35.3 35.3 35.3 0 0 0 0 0 35.3 0 0 35.3 0 35.3 35.3 35.3 0 0 35.3 35.3 0 35.3 35.3 35.3 35.3 0 35.3 0 0 0 35.3 0 35.3 35.3 0 35.3 35.3 35.3 35.3 0 0 0 0 35.3 35.3 0 35.3 0 35.3 0 35.3 35.3 35.3 35.3 35.3 35.3 35.3 35.3 35.3 0 35.3 35.3 35.3 35.3 35.3 35.3 0 35.3 35.3 35.3 35.3 35.3 35.3 0 35.3 35.3 35.3 35.3 35.3] endobj 345 0 obj << /Filter/FlateDecode /Length 93 >> stream x313S0P0UеT0P5VH1*26 (A$s<≠=}JJS <]1C=r e endstream endobj 346 0 obj << /Filter/FlateDecode /Length 94 >> stream x313S0P04S5T02W04PH1*24 Rɹ\N\@.}0PRTʥ`{yl?P?'W ] endstream endobj 347 0 obj << /Filter/FlateDecode /Length 146 >> stream x313S0P0UеP0P05WH1*26 (Bds<=\ %E\N \. ?È`$vD N0v &0!2L؃g&L7B.WO@+/ endstream endobj 348 0 obj << /Filter/FlateDecode /Length 103 >> stream x313S0P04S5T02W06UH1*24(As< =\ %E\N \. ogupzr< endstream endobj 349 0 obj << /Filter/FlateDecode /Length 97 >> stream x313S0P0V04U0 )\\@AC Lr.'~9PKW4K)YEX?\\:D endstream endobj 350 0 obj << /Filter/FlateDecode /Length 171 >> stream xE= 0w~:<::(:RI tP77> stream x313S0P0W04U06S02PH1*2 (B$s<,=L=}JJS <]ar  endstream endobj 352 0 obj << /Filter/FlateDecode /Length 163 >> stream x313S0P0V5T01P05PH1*26 \.'O.pcs.}0BIQi*S! QăF 8  hC@?Q GB`3l?@BC=1?szry endstream endobj 353 0 obj << /Filter/FlateDecode /Length 210 >> stream xڝ1n@E ei|q %!R\ A%(is\G.]X, 4Oڿҟ0zѱ}|rυ~0Оɬ|a"ŒW <|m%-_je 5 j8qutf)z>/8sԎcxk NFhe~}goޖBGY.o 6 endstream endobj 354 0 obj << /Filter/FlateDecode /Length 141 >> stream x313S0P0R5T01T05PH1*2 (Bds<-=\ %E\N \. @ @b#L1@F'a')x(qD4A|ȀJĘ\==1 endstream endobj 355 0 obj << /Filter/FlateDecode /Length 171 >> stream x313S0P0R5T01T05PH1*2 (Bds<-=\ %E\N \. ?03!`l-Dd"('#j`DE 550BF  @hAߘ~C`1.WO@3 endstream endobj 356 0 obj << /Filter/FlateDecode /Length 162 >> stream xŐ1 @Eg LjuTp A+։7ۣ2)/ o:X NDRrª)Lve`U]'v!9&%$!!9ĬMP#/40 78x, {`W endstream endobj 357 0 obj << /Filter/FlateDecode /Length 168 >> stream xڭ10 PK P*J$2 (#h!AH0;'diDG~J})½&͖|f)1GSg0̩2Km*=Iz󯿩*J}Z+.zFԃdY?H.n|R endstream endobj 358 0 obj << /Filter/FlateDecode /Length 188 >> stream xڕ=0 T M Ht@#h%G蘩&?!oxj2K(+ < .,.pG)] z?o .Qc*GDm탤5oċ M+m:h_Q b sA]4!D}Fjaޫ endstream endobj 359 0 obj << /Filter/FlateDecode /Length 118 >> stream x313S0P0R5T01T05PH1*2 (Bds<-=\ %E\N \. @F0o߈h8 %\\ endstream endobj 360 0 obj << /Filter/FlateDecode /Length 185 >> stream xm= @YL#8$l jihf{=e8`o޼M J)qF#7ct){9q^c'WbzC| % 3`@؃ +а'/h:TJѲQ>Ve؏XFBW5ޛx endstream endobj 361 0 obj << /Filter/FlateDecode /Length 183 >> stream xڝ1 @Y2͒( DSZyPNG,-dM@2,IB{'Ls7tOXVhhnZ|=)3Xͩ"A @fMP1<5+yE<<Q[ᨻ2@}x j{!p0# endstream endobj 362 0 obj << /Filter/FlateDecode /Length 176 >> stream xڍ1 @E'X &` A+InMiF-ϛ8XR%3ѩhΜnm1|#..$|)( DsT > stream xڕ10 DH Ht@#fr!ciX`yo41'f1 \!ycfx}$1j -@B"'_8?iGB<{.5Y gjzX) ?:ϛPCqBr5+*Eu7o^ endstream endobj 364 0 obj << /Filter/FlateDecode /Length 190 >> stream xm1 PDW,xQV@--,GR"8N܅"e6MKW.]94*'ָj֖h1#x "z1ˆJA:4e뉦DՀpDpOޠ@48M"4>3 x@蘏K|t endstream endobj 365 0 obj << /Filter/FlateDecode /Length 150 >> stream x313S0P0V5T06S05PH1*26 (Bds<=\ %E\N \. `F ?@ $>*q @3 ~m 00ŽDŸ\=M endstream endobj 366 0 obj << /Filter/FlateDecode /Length 241 >> stream x}J@gba> stream x313S0P0T5T01R05PH1*21 (Bds<L =\ %E\N \. l("ȃf $Y$?P$@ &Hvz @'2010#q.WO@BzX endstream endobj 368 0 obj << /Filter/FlateDecode /Length 127 >> stream x313S0P0W5T0P05TH1*26 (Ads< =\ %E\N \. =G`Hh`b @700030000 endstream endobj 369 0 obj << /Filter/FlateDecode /Length 159 >> stream x313S0P0Q5T06P05TH1*2(äs≮=\ %E\N \. znG`H7P|??A}#_ g @ szr endstream endobj 370 0 obj << /Filter/FlateDecode /Length 192 >> stream xڝ=@!qo s0"AM0D--4ZތpJ :}xJ>Mh$)tx ЧH>/z[ bzK3IZk?(C%V|ekk3Ԃ\H"g =xPq2]fLk^w EGΔl!X nm endstream endobj 371 0 obj << /Filter/FlateDecode /Length 109 >> stream x313S0P0U5T0T05PH1*26  !2ɹ\N\ &\@a.}O_T.}gC.O0"ꁘAŸ\=ZI endstream endobj 372 0 obj << /Filter/FlateDecode /Length 161 >> stream xڽ1 @Egba=B ٤ Djih'8G7nܠ>{TҬ= +o-np>ۓoЭG6tO* KMpG#@j `"F D;J,b.>Kփa˚ XP|* ђ endstream endobj 373 0 obj << /Filter/FlateDecode /Length 177 >> stream x}1 @E'X &l X-DB:f9!e 8Ntr,(5]3<[冥Gs^hW> stream xڥ1 @E'DXfnB!U *PK EěyBfMZ N?t2'e19> stream xڭ1 0'ҭP A+(éQAtw +.xen[KruiVg֓YS&|:wd-)wh$~]B*1h\~\d_<E endstream endobj 376 0 obj << /Filter/FlateDecode /Length 180 >> stream xM10 PG"y m[`abMr*+eO$rddgtL6cB6~g,= Zh܆n M]PnIuV_9c XzGA" NzJLFCT]-F2:D+?R endstream endobj 377 0 obj << /Filter/FlateDecode /Length 149 >> stream x313S0P0R5T06W01UH1*26 (Ads<M=\ %E\N \. $ AH2=! AD szrJ endstream endobj 378 0 obj << /Filter/FlateDecode /Length 145 >> stream x313S0P0T5T01R06UH1*21 (Ads<L =\ %E\N \. 3`G!? (<$7r H?&0??szrє endstream endobj 379 0 obj << /Filter/FlateDecode /Length 178 >> stream x5 @\ u[=V:ձCQ77gHb qSBc:/+du r+T`pڀ2xTyp$z8{S͋9H|ϴ~1"N9=l ~ơ endstream endobj 380 0 obj << /Filter/FlateDecode /Length 194 >> stream xڝ1 @ERx h7QV@--cb&!e w-6oa>7O9G3Nc>t&0Ժdp6p%c 5_/#f1 {Ww/<Ϡ󛡄.@kP9J5U> stream x313S0PT5T06W05TH1*2 (Ads<,=\ %E\N \. C=?@  nbVn``g``aՓ+o endstream endobj 382 0 obj << /Filter/FlateDecode /Length 218 >> stream xe1n@б\ Mv.cj%$\D J 67[na3C8,=Kg׋u)3YK.śr>sQp&ī%gsV}r;rzAh@D)IHкhDJ8%Ƅ'5j>v+1JoDVZ֪m#&z֣kHb3늷e endstream endobj 383 0 obj << /Filter/FlateDecode /Length 177 >> stream xڕ=@5[l2 Gp.cBEV@--4Z7(,:S_5I\a. &Sw3!g9ߠOgwA=>+FvsSD4$F{hKOzB 3'z=mI4S3t}9^jp|KN endstream endobj 384 0 obj << /Filter/FlateDecode /Length 232 >> stream xm=N0_HMwo,-  *PRs e(8DA~ۻ ^O]jSk^sߓ9yTי斱i;}x6J[_+0z` Dh# Z ":ň E6,|7$ (Xas [<0 GK0)> stream x}O; PܐB&Gp/1D SZyPNY#|E1> stream xm1N0E'J4M0soTH()@P;{3Gpb;h'k,f.t[==WwC=0_^y7rW7pw1w~p{֞6HHHb>7ۥ$VY v(p,n)TP$qE($("Lrh.jY,7[ EZ J!G E$ʖLPZ i|;^G endstream endobj 387 0 obj << /x5F 345 0 R /x2E 346 0 R /x2F 347 0 R /x3A 348 0 R /x3D 349 0 R /x11 350 0 R /x2D 351 0 R /x23 352 0 R /x43 353 0 R /x45 354 0 R /x4D 355 0 R /x4F 356 0 R /x50 357 0 R /x52 358 0 R /x54 359 0 R /x61 360 0 R /x62 361 0 R /x63 362 0 R /x64 363 0 R /x65 364 0 R /x66 365 0 R /x67 366 0 R /x68 367 0 R /x69 368 0 R /x6A 369 0 R /x6B 370 0 R /x6C 371 0 R /x6D 372 0 R /x6F 373 0 R /x70 374 0 R /x72 375 0 R /x73 376 0 R /x74 377 0 R /x75 378 0 R /x76 379 0 R /x30 380 0 R /x31 381 0 R /x32 382 0 R /x34 383 0 R /x36 384 0 R /x38 385 0 R /x39 386 0 R >> endobj 388 0 obj << /Type/Encoding /Differences[17/x11 35/x23 45/x2D/x2E/x2F/x30/x31/x32 52/x34 54/x36 56/x38/x39/x3A 61/x3D 67/x43 69/x45 77/x4D 79/x4F/x50 82/x52 84/x54 95/x5F 97/x61/x62/x63/x64/x65/x66/x67/x68/x69/x6A/x6B/x6C/x6D 111/x6F/x70 114/x72/x73/x74/x75/x76] >> endobj 389 0 obj [43.6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 43.6 0 0 0 0 0 0 0 0 0 43.6 43.6 43.6 43.6 43.6 43.6 0 43.6 0 43.6 0 43.6 43.6 43.6 0 0 43.6 0 0 0 0 0 43.6 0 43.6 0 0 0 0 0 0 0 43.6 0 43.6 43.6 0 43.6 0 43.6 0 0 0 0 0 0 0 0 0 0 43.6 0 43.6 43.6 43.6 43.6 43.6 43.6 43.6 43.6 43.6 43.6 43.6 43.6 43.6 0 43.6 43.6 0 43.6 43.6 43.6 43.6 43.6] endobj 4 0 obj << /Type/Font /Subtype/Type3 /CharProcs 52 0 R /Resources<< /ProcSet[/PDF/ImageB] >> /Encoding 53 0 R /FontBBox[1 -30 108 99] /Widths 54 0 R /FontMatrix[.00697049 0 0 .00697049 0 0] /FirstChar 45 /LastChar 121 >> endobj 5 0 obj << /Type/Font /Subtype/Type3 /CharProcs 83 0 R /Resources<< /ProcSet[/PDF/ImageB] >> /Encoding 84 0 R /FontBBox[2 -22 83 69] /Widths 85 0 R /FontMatrix[.0100375 0 0 .0100375 0 0] /FirstChar 44 /LastChar 121 >> endobj 6 0 obj << /Type/Font /Subtype/Type3 /CharProcs 166 0 R /Resources<< /ProcSet[/PDF/ImageB] >> /Encoding 167 0 R /FontBBox[-4 -22 82 61] /Widths 168 0 R /FontMatrix[.012045 0 0 .012045 0 0] /FirstChar 16 /LastChar 125 >> endobj 10 0 obj << /Type/Font /Subtype/Type3 /CharProcs 199 0 R /Resources<< /ProcSet[/PDF/ImageB] >> /Encoding 200 0 R /FontBBox[2 -26 106 83] /Widths 201 0 R /FontMatrix[.00836459 0 0 .00836459 0 0] /FirstChar 44 /LastChar 121 >> endobj 11 0 obj << /Type/Font /Subtype/Type3 /CharProcs 240 0 R /Resources<< /ProcSet[/PDF/ImageB] >> /Encoding 241 0 R /FontBBox[2 -18 87 58] /Widths 242 0 R /FontMatrix[.012045 0 0 .012045 0 0] /FirstChar 44 /LastChar 121 >> endobj 15 0 obj << /Type/Font /Subtype/Type3 /CharProcs 245 0 R /Resources<< /ProcSet[/PDF/ImageB] >> /Encoding 246 0 R /FontBBox[5 -24 87 63] /Widths 247 0 R /FontMatrix[.012045 0 0 .012045 0 0] /FirstChar 136 /LastChar 169 >> endobj 19 0 obj << /Type/Font /Subtype/Type3 /CharProcs 277 0 R /Resources<< /ProcSet[/PDF/ImageB] >> /Encoding 278 0 R /FontBBox[2 -22 91 69] /Widths 279 0 R /FontMatrix[.0100375 0 0 .0100375 0 0] /FirstChar 28 /LastChar 121 >> endobj 20 0 obj << /Type/Font /Subtype/Type3 /CharProcs 342 0 R /Resources<< /ProcSet[/PDF/ImageB] >> /Encoding 343 0 R /FontBBox[-1 -17 35 45] /Widths 344 0 R /FontMatrix[.01505625 0 0 .01505625 0 0] /FirstChar 32 /LastChar 125 >> endobj 24 0 obj << /Type/Font /Subtype/Type3 /CharProcs 387 0 R /Resources<< /ProcSet[/PDF/ImageB] >> /Encoding 388 0 R /FontBBox[-1 -20 44 57] /Widths 389 0 R /FontMatrix[.012045 0 0 .012045 0 0] /FirstChar 17 /LastChar 118 >> endobj xref 0 390 0000000000 65535 f 0000010839 00000 n 0000010708 00000 n 0000009782 00000 n 0000102053 00000 n 0000102281 00000 n 0000102506 00000 n 0000000015 00000 n 0000000298 00000 n 0000009863 00000 n 0000102733 00000 n 0000102965 00000 n 0000000401 00000 n 0000001064 00000 n 0000009946 00000 n 0000103192 00000 n 0000001170 00000 n 0000003038 00000 n 0000010108 00000 n 0000103420 00000 n 0000103649 00000 n 0000003144 00000 n 0000005071 00000 n 0000010192 00000 n 0000103881 00000 n 0000005177 00000 n 0000007096 00000 n 0000010355 00000 n 0000007235 00000 n 0000008740 00000 n 0000010439 00000 n 0000008868 00000 n 0000009665 00000 n 0000010602 00000 n 0000010030 00000 n 0000010276 00000 n 0000010523 00000 n 0000010888 00000 n 0000011045 00000 n 0000011314 00000 n 0000011613 00000 n 0000012049 00000 n 0000012376 00000 n 0000012707 00000 n 0000012915 00000 n 0000013102 00000 n 0000013421 00000 n 0000013690 00000 n 0000014002 00000 n 0000014256 00000 n 0000014598 00000 n 0000014854 00000 n 0000015252 00000 n 0000015454 00000 n 0000015600 00000 n 0000015816 00000 n 0000016074 00000 n 0000016328 00000 n 0000016527 00000 n 0000016686 00000 n 0000017106 00000 n 0000017301 00000 n 0000017632 00000 n 0000017981 00000 n 0000018274 00000 n 0000018554 00000 n 0000018776 00000 n 0000019111 00000 n 0000019343 00000 n 0000019534 00000 n 0000019815 00000 n 0000019991 00000 n 0000020215 00000 n 0000020487 00000 n 0000020697 00000 n 0000020977 00000 n 0000021200 00000 n 0000021469 00000 n 0000021784 00000 n 0000022053 00000 n 0000022248 00000 n 0000022581 00000 n 0000022904 00000 n 0000023231 00000 n 0000023589 00000 n 0000023809 00000 n 0000024067 00000 n 0000024321 00000 n 0000024575 00000 n 0000024799 00000 n 0000025039 00000 n 0000025275 00000 n 0000025437 00000 n 0000025632 00000 n 0000025826 00000 n 0000025984 00000 n 0000026203 00000 n 0000026370 00000 n 0000026572 00000 n 0000026738 00000 n 0000026966 00000 n 0000027123 00000 n 0000027355 00000 n 0000027682 00000 n 0000028103 00000 n 0000028470 00000 n 0000028710 00000 n 0000028954 00000 n 0000029223 00000 n 0000029530 00000 n 0000029803 00000 n 0000030127 00000 n 0000030385 00000 n 0000030634 00000 n 0000030867 00000 n 0000031183 00000 n 0000031374 00000 n 0000031542 00000 n 0000031854 00000 n 0000032061 00000 n 0000032373 00000 n 0000032677 00000 n 0000032981 00000 n 0000033214 00000 n 0000033500 00000 n 0000033819 00000 n 0000034037 00000 n 0000034295 00000 n 0000034606 00000 n 0000034979 00000 n 0000035278 00000 n 0000035548 00000 n 0000035808 00000 n 0000036060 00000 n 0000036320 00000 n 0000036576 00000 n 0000036786 00000 n 0000037093 00000 n 0000037315 00000 n 0000037503 00000 n 0000037718 00000 n 0000037983 00000 n 0000038156 00000 n 0000038400 00000 n 0000038614 00000 n 0000038865 00000 n 0000039125 00000 n 0000039389 00000 n 0000039593 00000 n 0000039849 00000 n 0000040065 00000 n 0000040282 00000 n 0000040533 00000 n 0000040834 00000 n 0000041120 00000 n 0000041404 00000 n 0000041661 00000 n 0000041912 00000 n 0000042099 00000 n 0000042396 00000 n 0000042696 00000 n 0000042961 00000 n 0000043254 00000 n 0000043563 00000 n 0000043827 00000 n 0000044154 00000 n 0000044451 00000 n 0000045500 00000 n 0000045915 00000 n 0000046392 00000 n 0000046623 00000 n 0000047024 00000 n 0000047216 00000 n 0000047389 00000 n 0000047610 00000 n 0000047906 00000 n 0000048240 00000 n 0000048547 00000 n 0000048862 00000 n 0000049174 00000 n 0000049418 00000 n 0000049806 00000 n 0000050054 00000 n 0000050259 00000 n 0000050571 00000 n 0000050870 00000 n 0000051117 00000 n 0000051412 00000 n 0000051728 00000 n 0000051965 00000 n 0000052288 00000 n 0000052537 00000 n 0000052785 00000 n 0000053156 00000 n 0000053526 00000 n 0000053729 00000 n 0000054098 00000 n 0000054468 00000 n 0000054756 00000 n 0000055105 00000 n 0000055518 00000 n 0000055734 00000 n 0000055984 00000 n 0000056190 00000 n 0000056356 00000 n 0000056532 00000 n 0000056861 00000 n 0000057049 00000 n 0000057215 00000 n 0000057421 00000 n 0000057740 00000 n 0000058003 00000 n 0000058269 00000 n 0000058519 00000 n 0000058780 00000 n 0000059037 00000 n 0000059259 00000 n 0000059583 00000 n 0000059801 00000 n 0000059992 00000 n 0000060256 00000 n 0000060426 00000 n 0000060680 00000 n 0000060893 00000 n 0000061136 00000 n 0000061393 00000 n 0000061602 00000 n 0000061857 00000 n 0000062073 00000 n 0000062284 00000 n 0000062587 00000 n 0000062896 00000 n 0000063149 00000 n 0000063336 00000 n 0000063634 00000 n 0000063935 00000 n 0000064191 00000 n 0000064484 00000 n 0000064783 00000 n 0000065050 00000 n 0000065349 00000 n 0000065866 00000 n 0000066116 00000 n 0000066395 00000 n 0000066606 00000 n 0000067088 00000 n 0000067137 00000 n 0000067205 00000 n 0000067298 00000 n 0000067468 00000 n 0000067719 00000 n 0000068089 00000 n 0000068363 00000 n 0000068533 00000 n 0000068749 00000 n 0000069099 00000 n 0000069410 00000 n 0000069707 00000 n 0000069997 00000 n 0000070277 00000 n 0000070563 00000 n 0000070851 00000 n 0000071193 00000 n 0000071427 00000 n 0000071623 00000 n 0000071797 00000 n 0000072066 00000 n 0000072294 00000 n 0000072570 00000 n 0000072858 00000 n 0000073082 00000 n 0000073371 00000 n 0000073606 00000 n 0000073939 00000 n 0000074130 00000 n 0000074461 00000 n 0000074784 00000 n 0000075056 00000 n 0000075456 00000 n 0000075670 00000 n 0000075952 00000 n 0000076194 00000 n 0000076433 00000 n 0000076663 00000 n 0000076820 00000 n 0000077052 00000 n 0000077227 00000 n 0000077403 00000 n 0000077625 00000 n 0000077850 00000 n 0000078013 00000 n 0000078178 00000 n 0000078372 00000 n 0000078558 00000 n 0000078774 00000 n 0000078942 00000 n 0000079110 00000 n 0000079272 00000 n 0000079441 00000 n 0000079652 00000 n 0000079922 00000 n 0000080199 00000 n 0000080421 00000 n 0000080649 00000 n 0000080876 00000 n 0000081075 00000 n 0000081278 00000 n 0000081529 00000 n 0000081693 00000 n 0000081907 00000 n 0000082118 00000 n 0000082342 00000 n 0000082588 00000 n 0000082857 00000 n 0000083045 00000 n 0000083251 00000 n 0000083494 00000 n 0000083730 00000 n 0000083968 00000 n 0000084198 00000 n 0000084438 00000 n 0000084676 00000 n 0000084890 00000 n 0000085170 00000 n 0000085380 00000 n 0000085564 00000 n 0000085806 00000 n 0000085985 00000 n 0000086198 00000 n 0000086400 00000 n 0000086632 00000 n 0000086870 00000 n 0000087076 00000 n 0000087303 00000 n 0000087516 00000 n 0000087709 00000 n 0000087930 00000 n 0000088150 00000 n 0000088399 00000 n 0000088634 00000 n 0000088877 00000 n 0000089075 00000 n 0000089311 00000 n 0000090140 00000 n 0000090506 00000 n 0000090899 00000 n 0000091064 00000 n 0000091230 00000 n 0000091449 00000 n 0000091625 00000 n 0000091794 00000 n 0000092038 00000 n 0000092202 00000 n 0000092438 00000 n 0000092721 00000 n 0000092935 00000 n 0000093179 00000 n 0000093414 00000 n 0000093655 00000 n 0000093916 00000 n 0000094107 00000 n 0000094365 00000 n 0000094621 00000 n 0000094870 00000 n 0000095131 00000 n 0000095394 00000 n 0000095617 00000 n 0000095931 00000 n 0000096159 00000 n 0000096359 00000 n 0000096591 00000 n 0000096856 00000 n 0000097038 00000 n 0000097272 00000 n 0000097522 00000 n 0000097786 00000 n 0000098011 00000 n 0000098264 00000 n 0000098486 00000 n 0000098704 00000 n 0000098955 00000 n 0000099222 00000 n 0000099430 00000 n 0000099721 00000 n 0000099971 00000 n 0000100276 00000 n 0000100554 00000 n 0000100862 00000 n 0000101431 00000 n 0000101704 00000 n trailer << /Root 1 0 R /Info 2 0 R /Size 390 >> startxref 104109 %%EOF fsprotect-1.0.6/lib/0000750000000000000000000000000011365035173011162 5ustar fsprotect-1.0.6/lib/fsprotect-protect0000750000000000000000000000631011365035172014576 0ustar #!/bin/bash # # $Id$ # # Change a partition to aufs # # Parameters: # $1 The mountpoint # $2 tmpfs size or auto # BASE0="/fsprotect" BASE="/fsprotect/fs" if [ "x$1" = "x" ] || [ "x$2" = "x" ] ; then echo "Usage $0 [mountpoint] [tmpfs size]" exit 1 fi if ! [ -d "$1" ] ; then echo "$1: Not a directory" fi # Remove trailing / MP="${1%/}" # Check whether a path ($1) is a mounted mountpoint is_mounted() { # Forbid relative paths [ "x${1#/}" = "x$1" ] && return 1 # Forbid / [ "x$1" = "x/" ] && return 1 # Look mtab T=$(grep " $1/* " /etc/mtab) [ -z "$T" ] && return 1 # Check for virtual filesystems T2=$(echo "$T" | grep -E " (tmpfs|rootfs|devpts|usbfs|sysfs|proc) ") [ -z "$T2" ] || return 1 return 0 } # Assumning that $1 was moved to $2 and $1 is now an aufs of $2, # restore all mount points by moving them back from $2 to $1. restore_dir_mp() { # Don't use head, awk and sort. They are in /usr/bin #T=$(cat /proc/mounts | grep -E "^[^[:space:]]* $2/" | awk '{print $2}' | sort -u | head -1) CNT=1000 T=$(cat /proc/mounts | grep -E "^[^[:space:]]* $2/" | \ sed "s,^[^[:space:]]* \($2/[^[:space:]]*\) .*,\1,g" | ( \ while read line ; do TCNT=${#line} if [ "$TCNT" -lt "$CNT" ] ; then CNT="$TCNT" T="$line" fi done [ "$CNT" -lt "1000" ] && echo "$T" # Always be successful true ) ) [ -z "$T" ] && return TDST=$(echo $1/${T#$2} | sed 's,//,/,g') if [ -d "$TDST" ] ; then echo "mount --move $T $TDST" mount --move $T $TDST restore_dir_mp "$1" "$2" else echo "$TDST doesn not exist!!!" fi } # Check whether the kernel supports aufs has_aufs() { [ -e /proc/filesystems ] || return 1 grep "\" /proc/filesystems > /dev/null 2>&1 && return 0 return 1 } if ! is_mounted "$MP" ; then echo "$1: Doesn't look like a supported/valid/mounted filesystem" exit 1 fi if is_aufs "$MP" ; then echo "$1: Seems to be already protected" exit 1 fi echo "Proceeding with $MP" if ! [ -d "$BASE0" ] ; then echo "$BASE0 is not a directory!" echo "Something is wrong!" exit 1 fi [ -d "$BASE" ] || mkdir "$BASE" DST0=$(echo "${MP#/}" | sed 's,/,-,g') DST="$BASE/$DST0" DSTORIG="$DST/orig" DSTMOVE="$DST/move" DSTTMP="$DST/tmp" DSTAUFS="$DST/aufs" [ -d "$DST" ] || mkdir "$DST" [ -d "$DSTORIG" ] || mkdir "$DSTORIG" [ -d "$DSTMOVE" ] || mkdir "$DSTMOVE" [ -d "$DSTTMP" ] || mkdir "$DSTTMP" [ -d "$DSTAUFS" ] || mkdir "$DSTAUFS" # All directories are created. Go-on set -e # If size is "auto" then use 50% of memory which is the default # for tmpfs SZ="$2" if [ "x$SZ" = "xauto" ] ; then SZ="50%" fi # Do this first to catch errors if ! mount -t tmpfs -o size=$SZ none "$DSTTMP" ; then echo "Failed to create tmpfs. Is '$2' a correct tmpfs size parameter?" echo "Examples: 10M, 2G, 50%" exit 1 fi # Copy permissions chown --reference="$MP" "$DSTTMP" chmod --reference="$MP" "$DSTTMP" mount -o bind "${MP}" "$DSTORIG" mount -t aufs -o "dirs=$DSTTMP=rw:$DSTORIG=ro" none "$DSTAUFS" # Move this here, in case it has other filesystems mounted beneath it mount --move "$MP" "$DSTMOVE" mount -o bind "$DSTAUFS" "$MP" umount "$DSTAUFS" # Move filesystems outside of it restore_dir_mp "$MP" "$DSTMOVE" # Umount it umount "$DSTMOVE" mount -o remount,ro "$DSTORIG" echo "Done." exit 0 fsprotect-1.0.6/bin/0000750000000000000000000000000011373040527011162 5ustar fsprotect-1.0.6/bin/is_aufs0000750000000000000000000000036411373040527012544 0ustar #!/bin/sh # Check if a file system is a unionfs # $1 = path [ -z "$1" ] && exit 1 [ -e "/proc/mounts" ] || exit 1 if [ "x$1" = "x/" ] ; then T="$1" else T="${1%/}" fi T=`grep "^[^ ]* $T aufs" /proc/mounts` [ -z "$T" ] && exit 1 exit 0 fsprotect-1.0.6/initramfs-tools/0000750000000000000000000000000011161434775013553 5ustar fsprotect-1.0.6/initramfs-tools/hooks/0000750000000000000000000000000011722766544014703 5ustar fsprotect-1.0.6/initramfs-tools/hooks/fsprotect0000750000000000000000000000043011722766540016633 0ustar #!/bin/sh PREREQ="" prereqs() { echo "$PREREQ" } case $1 in prereqs) prereqs exit 0 ;; esac . /usr/share/initramfs-tools/hook-functions manual_add_modules aufs # force_load aufs copy_exec /bin/grep "/bin" copy_exec /bin/is_aufs "/bin" copy_exec /usr/bin/touch "/bin" fsprotect-1.0.6/initramfs-tools/scripts/0000750000000000000000000000000011161434775015242 5ustar fsprotect-1.0.6/initramfs-tools/scripts/local-bottom/0000750000000000000000000000000011365023530017623 5ustar fsprotect-1.0.6/initramfs-tools/scripts/local-bottom/fsprotect0000750000000000000000000000665311365023527021602 0ustar #!/bin/sh # # fsprotect # # Change to yes for debug messages DEBUG=no PREREQ="" prereqs() { echo "$PREREQ" } case $1 in # get pre-requisites prereqs) prereqs exit 0 ;; esac . scripts/functions #set -x # # Echo a command and then run it # run_echo() { if [ "$DEBUG" = "yes" ] ; then _log_msg "$* \n" fi if ! $* ; then panic "Failed!" exit 1 fi } # Check if we want fsprotect want_fsprotect() { [ -e /proc/cmdline ] || return 1 # grep "\" /proc/cmdline > /dev/null 2>&1 && return 1 grep "\" /proc/cmdline > /dev/null 2>&1 && return 2 grep "\" /proc/cmdline > /dev/null 2>&1 && return 0 return 1 } # Check if aufs is supported has_aufs() { [ -e /proc/filesystems ] || return 1 grep "\" /proc/filesystems > /dev/null 2>&1 && return 0 return 1 } want_fsprotect T=$? if ! [ "$T" = 0 ] ; then if [ "$T" = 2 ] ; then log_warning_msg "fsprotect: We don't want fsprotect" fi exit 0 fi if ! [ -x /bin/is_aufs ] ; then log_failure_msg "is_aufs not found !" exit 1 fi if is_aufs / ; then log_warning_msg "fsprotect: Already started" exit 0 fi # Load the module modprobe aufs > /dev/null 2>&1 || true if ! has_aufs ; then log_failure_msg "fsprotect: No aufs kernel support !" exit 1 fi # Determine tmpfs size or fallback to 512MB SZ=512M for x in `cat /proc/cmdline` ; do case "$x" in fsprotect=*) # According to bug #564141 this is supported # by dash (tested - works) SZ="${x#fsprotect=}" # Avoid bashism for initramfs # SZ=`echo "$x" | sed -e 's/^fsprotect=//'` # If size is "auto" then use half memory size # which is tmpfs' default value if [ "x$SZ" = "xauto" ] ; then SZ='50%' fi ;; esac done BASE=/fsprotect log_begin_msg "Setting up fsprotect (aufs):" [ "$DEBUG" = "yes" ] && _log_msg "#######################################################" [ -d $BASE ] || ( mkdir -m 700 $BASE || mkdir $BASE ) [ -d $BASE/system ] || mkdir $BASE/system [ -d $BASE/tmp ] || mkdir $BASE/tmp [ -d $BASE/aufs ] || mkdir $BASE/aufs [ "$DEBUG" = "yes" ] && _log_msg "#######################################################" # What we do: # ----------- # Bind the root filesystem to /fsprotect/system # Mount a tmpfs to /fsprotect/tmp # Create an aufs of /fsprotect/system and /fsprotect/tmp # Umount old root # Bind our aufs to the ${rootmnt} # Umount our aufs # Move /fsprotect/system and /fsprotect/tmp inside the aufs run_echo "mount -n -o bind ${rootmnt} $BASE/system" # Mount the root filesystem run_echo "mount -n -t tmpfs -o mode=755,size=$SZ none $BASE/tmp" # Mount the tmpfs run_echo "mount -n -t aufs -o dirs=$BASE/tmp=rw:$BASE/system=ro none $BASE/aufs" # Make the aufs run_echo "umount ${rootmnt}" # Umount old root run_echo "mount -n -o move $BASE/aufs ${rootmnt}" # Use the aufs as the new root run_echo "mkdir ${rootmnt}$BASE" # Create the in-new-root directories run_echo "mkdir ${rootmnt}$BASE/system" run_echo "mkdir ${rootmnt}$BASE/tmp" run_echo "mount -n -o move $BASE/system ${rootmnt}$BASE/system" # Move those dirs inside the new root run_echo "mount -n -o move $BASE/tmp ${rootmnt}$BASE/tmp" # This one will prevent FSCKs touch ${rootmnt}/fastboot # [ "$DEBUG" = "yes" ] && _log_msg "#######################################################" # [ "$DEBUG" = "yes" ] && /sbin/aufsctl ${rootmnt} --list # [ "$DEBUG" = "yes" ] && _log_msg "#######################################################" log_end_msg "Done..." [ "$DEBUG" = "yes" ] && sleep 3 exit 0