ipfw3-2012/Makefile000644 000423 000000 00000010364 12012015132 014355 0ustar00luigiwheel000000 000000 # $Id: Makefile 11689 2012-08-12 21:07:34Z luigi $ # # Top level makefile for building ipfw/dummynet (kernel and userspace). # You can run it manually or also under the Planetlab build. # Planetlab wants also the 'install' target. # # To build on system with non standard Kernel sources or userland files, # you should run this with # # make KERNELPATH=/path/to/linux-2.x.y.z USRDIR=/path/to/usr # # We assume that $(USRDIR) contains include/ and lib/ used to build userland. # include Makefile.inc DATE ?= $(shell date +%Y%m%d) SNAPSHOT_NAME=$(DATE)-ipfw3.tgz BINDIST=$(DATE)-dummynet-linux.tgz WINDIST=$(DATE)-dummynet-windows.zip DISTFILES= Makefile Makefile.inc README binary* ipfw kipfw *.h sys .PHONY: ipfw kipfw ########################################### # windows x86 and x64 specific variables # ########################################### # DRIVE must be the hard drive letter where DDK is installed # DDKDIR must be the path to the DDK root directory, without drive letter # TARGETOS (x64 only) must be one of the following: # wnet -> windows server 2003 # wlh -> windows vista and windows server 2008 # win7 -> windows 7 # future version must be added here DRIVE ?= C: DDKDIR ?= /WinDDK/7600.16385.1 DDK = $(DRIVE)$(DDKDIR) TARGETOS=win7 export WIN64 export DDK export DRIVE export DDKDIR _all: all clean distclean: -@(cd ipfw && $(MAKE) $(@) ) -@rm -rf kipfw-mod binary64/[A-hj-z]* all: kipfw ipfw @# -- windows only ifeq ($(OSARCH),Windows) # copy files ifeq ($(WIN64),) -@ cp ipfw/ipfw.exe kipfw-mod/$(OBJDIR)/ipfw.sys binary/ -@ cp kipfw/*.inf binary/ else -@ cp binary/* kipfw/*.inf binary64/ -@ cp ipfw/ipfw.exe kipfw-mod/objchk_win7_amd64/amd64/ipfw.sys binary64/ endif # WIN64 endif # Windows win64: $(MAKE) WIN64=1 # kipfw-src prepares the sources for the kernel part. # The windows files (passthru etc.) are modified version of the # examples found in the $(DDK)/src/network/ndis/passthru/driver/ # They can be re-created using the 'ndis-glue' target # # We need a sed trick to remove newlines from the patchfile. ndis-glue: -@mkdir -p kipfw-mod cp $(DDK)/src/network/ndis/passthru/driver/*.[ch] kipfw-mod cat kipfw/win-passthru.diff | sed "s/$$(printf '\r')//g" | (cd kipfw-mod; patch ) kipfw-src: -@rm -rf kipfw-mod -@mkdir -p kipfw-mod -@cp -Rp kipfw/* kipfw-mod -@cp `find sys -name \*.c` kipfw-mod -@(cd kipfw-mod && $(MAKE) include_e) ifeq ($(OSARCH),Windows) make ndis-glue endif snapshot: $(MAKE) distclean (tar cvzhf /tmp/$(SNAPSHOT_NAME) -s':^:ipfw3-2012/:' $(DISTFILES) ) bindist: $(MAKE) clean $(MAKE) all tar cvzf /tmp/$(BINDIST) ipfw/ipfw ipfw/ipfw.8 kipfw-mod/ipfw_mod.ko windist: $(MAKE) clean -$(MAKE) all -rm /tmp/$(WINDIST) zip -r /tmp/$(WINDIST) binary -x \*.svn\* ipfw: @(cd ipfw && $(MAKE) $(@) ) kipfw: kipfw-src ifeq ($(WIN64),) # linux or windows 32 bit @(cd kipfw-mod && $(MAKE) $(@) ) else #--- windows 64 bit, we use build.exe and nmake rm -f kipfw-mod/Makefile mkdir kipfw-mod/tmpbuild # check mysetenv.sh bash kipfw/mysetenv.sh $(DRIVE) $(DDKDIR) $(TARGETOS) endif openwrt_release: # create a temporary directory $(eval TMPDIR := $(shell mktemp -d -p /tmp/ ipfw3_openwrt_XXXXX)) # create the source destination directory $(eval IPFWDIR := ipfw3-$(DATE)) $(eval DSTDIR := $(TMPDIR)/$(IPFWDIR)) mkdir $(DSTDIR) # copy the package, clean objects and svn info cp -r ./ipfw ./kipfw-mod glue.h Makefile ./configuration README $(DSTDIR) (cd $(DSTDIR); make -s distclean; find . -name .svn | xargs rm -rf) (cd $(TMPDIR); tar czf $(IPFWDIR).tar.gz $(IPFWDIR)) # create the port files in /tmp/ipfw3-port $(eval PORTDIR := $(TMPDIR)/ipfw3) mkdir -p $(PORTDIR)/patches # generate the Makefile, PKG_VERSION and PKG_MD5SUM md5sum $(DSTDIR).tar.gz | cut -d ' ' -f 1 > $(TMPDIR)/md5sum cat ./OPENWRT/Makefile | \ sed s/PKG_VERSION:=/PKG_VERSION:=$(DATE)/ | \ sed s/PKG_MD5SUM:=/PKG_MD5SUM:=`cat $(TMPDIR)/md5sum`/ \ > $(PORTDIR)/Makefile @echo "" @echo "The openwrt port is in $(TMPDIR)/ipfw3-port" @echo "The source file should be copied to the public server:" @echo "scp $(DSTDIR).tar.gz marta@info.iet.unipi.it:~marta/public_html/dummynet" @echo "after this the temporary directory $(TMPDIR) can be removed." install: diff: -@(diff -upr $(BSD_HEAD)/sbin/ipfw ipfw) -@(diff -upr $(BSD_HEAD)/sys sys) ipfw3-2012/Makefile.inc000644 000423 000000 00000000630 12006744007 015135 0ustar00luigiwheel000000 000000 # $Id$ # GNU makefile header for ipfw/kipfw building BSD_HEAD ?= ~/FreeBSD/head OSARCH := $(shell uname) OSARCH := $(findstring $(OSARCH),FreeBSD Linux Darwin) ifeq ($(OSARCH),) OSARCH := Windows endif OBJDIR=mia KSRC ?= /lib/modules/$(shell uname -r)/build ifneq ($V,1) # no echo MSG=@echo HIDE=@ else MSG=@\# HIDE= endif .c.o: $(MSG) " CC $<" $(HIDE) $(CC) $(CFLAGS) -c $< -o $@ ipfw3-2012/README000644 000423 000000 00000024241 12012016003 013572 0ustar00luigiwheel000000 000000 # # $Id: README 11691 2012-08-12 21:32:37Z luigi $ # This directory contains a port of ipfw and dummynet to Linux and Windows. This version of ipfw and dummynet is called "ipfw3" as it is the third major rewrite of the code. The source code here comes straight from FreeBSD (roughly the version in HEAD as of February 2010), plus some glue code and headers written from scratch. Unless specified otherwise, all the code here is under a BSD license. Specific build instructions are below, and in general produce a kernel module, ipfw_mod.ko (ipfw.sys on windows) a userland program, /sbin/ipfw (ipfw.exe on windows) which you need to install on your system. CREDITS: Luigi Rizzo (main design and development) Marta Carbone (Linux and Planetlab ports) Riccardo Panicucci (modular scheduler support) Francesco Magno (Windows port) Fabio Checconi (the QFQ scheduler) Funding from Universita` di Pisa (NETOS project), European Commission (ONELAB2 project) ACM SIGCOMM (Sigcomm Community Projects Award, April 2012) ------ INSTALL/REMOVE INSTRUCTIONS ------ Linux INSTALL: # Do the following as root insmod ./dummynet2/ipfw_mod.ko cp ipfw/ipfw /usr/local/sbin REMOVE: rmmod ipfw_mod.ko OpenWRT INSTALL: # use the correct name for your system opkg install kmod-ipfw3_2.4.35.4-brcm-2.4-1_mipsel.ipk #install ls -l ls -l /lib/modules/2.4.35.4/ipfw* # check insmod /lib/modules/2.4.35.4/ipfw_mod.o # load the module /lib/modules/2.4.35.4/ipfw show # launch the userspace tool REMOVE: rmmod ipfw_mod.o # remove the module Windows: A pre-built version is in binary/ and binary64/ directories. INSTALL THE NDIS DRIVER - open the configuration panel for the network card in use (right click on the icon on the SYSTRAY, or go to Control Panel -> Network and select one card) - click on Properties->Install->Service->Add - click on 'Driver Disk' and select 'netipfw.inf' in this folder - select 'ipfw+dummynet' which is the only service you should see - click accept on the warnings for the installation of an unsigned driver (roughly twice per existing network card) Now you are ready to use the emulator. To configure it, open a 'cmd' window (REMEMBER to run it as Administrator) and you can use the ipfw command from the command line. Otherwise click on the 'TESTME.bat' which is a batch program that runs various tests. REMEMBER: you need to run ipfw as administrator. REMOVE: - select a network card as above. - click on Properties - select 'ipfw+dummynet' - click on 'Remove' ------ BUILD INSTRUCTIONS ------ + Windows 32 bit and 64 bit (XP, Windows7) To build your own version of the package you need: - cygwin, http://www.cygwin.com/ with base packages, make, c compiler, possibly an editor and subversion. This is used to build the userspace control program, ipfw.exe - Microsoft Windows Driver Kit Version 7.1.0, available from http://www.microsoft.com/en-us/download/details.aspx?id=11800 (ISO image, GRMWDK_EN_7600_1.ISO) This is used to build the kernel module. - optionally, DbgView if you want to see diagnostics coming from the kernel module. You can find it at http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx Check the Makefile in the root directory to make sure that the WDK is installed in the place indicated by DRIVE and DDKDIR variables (otherwise pass the correct values to the Makefile). Open a shell from cygwin, move to this directory, and run "make" for the 32-bit version, "make win64" for the 64 bit version. This will produce in the binary/ or binary64/ directory the following files: ipfw.exe (you also need cygwin1.dll) ipfw.sys (an NDIS intermediate filter driver) netipfw.inf and netipfw_m.inf (installer files) Cross compilation of the userland side under FreeBSD is possible with gmake TCC=`pwd`/tcc-0.9.25-bsd/win32 CC=`pwd`/tcc-0.9.25-bsd/win32/bin/wintcc (wintcc is a custom version of tcc which produces Windows code) NOTE: the 64-bit version is compiled as a 32-bit executable for userspace, with appropriate changes to produce 64-bit pointers. The kernel module is built using the MSC 'build' utility instead of 'make'. THE MODULE IS NOT SIGNED. IMPORTANT: Windows 64-bit will not load unsigned kernel modules unless you boot with 'F8' and disable checks for signed modules. ***** Linux 2.6 and above ****** make [KSRC=/path/to/linux USRDIR=/path/to/usr] where the two variables are optional an point to the linux kernel sources and the /usr directory. Defaults are USRDIR=/usr and KSRC=/lib/modules/`uname -r`/build --- XXX check ? NOTE: make sure CONFIG_NETFILTER is enabled in the kernel configuration file. You need the ncurses devel library, that can be installed according your distro with: apt-get install ncurses-dev # for debian based distro yum -y install ncurses-dev # for fedora based distro You can enable CONFIG_NETFILTER by doing: "(cd ${KSRC}; make menuconfig)" and enabling the option listed below: Networking ---> Networking options ---> [*] Network packet filtering framework (Netfilter) If you have not yet compiled your kernel source, you need to prepare the build environment: (cd $(KSRC); make oldconfig; make prepare; make scripts) ***** Linux 2.4.x ***** Almost as above, with an additional VER=2.4 make VER=2.4 KSRC=... For 2.4, if KSRC is not specified then we use KSRC ?= /usr/src/`uname -r`/build You need to follow the same instruction for the 2.6 kernel, enabling netfilter in the kernel options: Networking options ---> [*] Network packet filtering (replaces ipchains) ***** Openwrt package ***** (Tested with kamikaze_8.09.1 and Linux 2.4) + Download and extract the OpenWrt package, e.g. wget http://downloads.openwrt.org/kamikaze/8.09.1/kamikaze_8.09.1_source.tar.bz2 tar xvjf kamikaze_8.09.1_source.tar.bz2 + move to the directory with the OpenWrt sources (the one that contains Config.in, rules.mk ...) cd kamikaze_8.09.1 + Optional: Add support for 1ms resolution. By default OpenWRT kernel is compiled with HZ=100; this implies that all timeouts are rounded to 10ms, too coarse for dummynet. The file 020-mips-hz1000.patch contains a kernel patch to build a kernel with HZ=1000 (i.e. 1ms resolution) as in Linux/FreeBSD. To apply this patch, go in the kernel source directory and patch the kernel cd build_dir/linux-brcm-2.4/linux-2.4.35.4 cat $IPFW3_SOURCES/020-mips-hz1000.patch | patch -p0 where IPFW3_SOURCES contains the ipfw3 source code. Now, the next kernel recompilation will use the right HZ value + Optional: to be sure that the tools are working, make a first build as follows: - run "make menuconfig" and set the correct target device, drivers, and so on; - run "make" to do the build + Add ipfw3 to the openwrt package, as follows: - copy the code from this directory to the place used for the build: cp -Rp /path_to_ipfw3 ../ipfw3; If you want, you can fetch a newer version from the web (cd ..; rm -rf ipfw3; \ wget http://info.iet.unipi.it/~luigi/dummynet/ipfw3-latest.tgz;\ tar xvzf ipfw3-latest.tgz) - run the following commands: (mkdir package/ipfw3; \ cp ../ipfw3/Makefile.openwrt package/ipfw3/Makefile) to create the package/ipfw3 directory in the OpenWrt source directory, and copy Makefile.openwrt to package/ipfw3/Makefile ; - if necessary, edit package/ipfw3/Makefile and set IPFW_DIR to point to the directory ipfw3, which contains the sources; - run "make menuconfig" and select kmod-ipfw3 as a module in Kernel Modules -> Other modules -> kmod-ipfw3 - run "make" to build the package, "make V=99" for verbose build. - to modify the code, assuming you are in directory "kamikaze_8.09.1" (cd ../ipfw3 && vi ...the files you are interested in ) rm -rf build_dir/linux-brcm-2.4/kmod-ipfw3 make package/ipfw3/compile V=99 The resulting package is located in bin/packages/mipsel/kmod-ipfw3*, upload the file and install on the target system, as follows: opkg install kmod-ipfw3_2.4.35.4-brcm-2.4-1_mipsel.ipk #install ls -l ls -l /lib/modules/2.4.35.4/ipfw* # check insmod /lib/modules/2.4.35.4/ipfw_mod.o # load the module /lib/modules/2.4.35.4/ipfw show # launch the userspace tool rmmod ipfw_mod.o # remove the module ***** PLANETLAB BUILD (within a slice) ***** These instruction can be used by PlanetLab developers to compile the dummynet module on a node. To install the module on the node users need root access in root context. PlanetLab users that want to use the dummynet package should ask to PlanetLab support for nodes with dummynet emulation capabilities. Follow the instructions below. You can just cut&paste # install the various tools if not available sudo yum -y install subversion rpm-build rpm-devel m4 redhat-rpm-config make gcc # new build installation requires the gnupg package sudo yum -y install gnupg # the linux kernel and the ipfw source can be fetched by git sudo yum -y install git # create and move to a work directory mkdir -p test # extract a planetlab distribution to directory XYZ (cd test; git clone git://git.onelab.eu/build ./XYZ) # download the specfiles and do some patching. # Results are into SPEC/ (takes 5 minutes) (cd test/XYZ; make stage1=true PLDISTRO=onelab) # Building the slice code is fast, the root code takes longer # as it needs to rebuild the whole kernel (cd test/XYZ; sudo make ipfwslice PLDISTRO=onelab) (cd test/XYZ; sudo make ipfwroot PLDISTRO=onelab) The kernel dependency phase is a bit time consuming, but does not need to be redone if we are changing the ipfw sources only. To clean up the code do (cd test/XYZ; sudo make ipfwroot-clean ipfwslice-clean) then after you have updated the repository again (cd test/XYZ; sudo make ipfwslice ipfwroot) --- References [1] https://svn.planet-lab.org/wiki/VserverCentos [2] http://wiki.linux-vserver.org/Installation_on_CentOS [3] http://mirror.centos.org/centos/5/isos/ [4] More information are in /build/README* files ipfw3-2012/binary/000755 000423 000000 00000000000 12012010360 014173 5ustar00luigiwheel000000 000000 ipfw3-2012/binary/ipfw.sys000644 000423 000000 00000356600 12011754122 015724 0ustar00luigiwheel000000 000000 MZ@@ !L!This program cannot be run in DOS mode. $C,"""""0-"Z}"Zo"Rich"PEL.'P  'vPЬH.textz h.rdata@H.data@INIT   .reloc@BUh jjhPhĿjjhaOhȿjjhAOhjjh!OhjjhOhjjhOhjjhOhjjhO]̋UpEMUBEEMQUEEE3fE3fM3fU3fE3fMEEEEEE3fUEEEHu =du3(,EEUB(EMA0UB1EEx tMQ fB fM̃}( Uz tE=݆ Mƒ MMEUB3E(EHM} U||L |1$1UUEH ;M}GUB ;E| MxURj VDžxxEMU}u*EHMM3uEM^ UUEH ;M}GUB ;E| MtURjUDžttEMU}ua*EHMM3uEfHfMUffEMUB A2M |UB ;|}JMQ ;|| EpMQjTDžppUEM}u)UBEE3uUffEMfQfU?ExMQ ;x}JEH ;x| UlEPjmTDžllMUE}u9)MQUU3uMfQfUEffMUtEH ;t}JUB ;t| MhURjSDžhhEMU}u(EHMM3uEȃfEȋMQELMUEE MpUB ;p}JMQ ;p| EdMQj;SDžddUEM}u(UBEE3uUB``t `tMȃ@fM8UȁʀfU(EHQh*{=`t 'UȃfUȋEHUDEMUEElMQ ;l}JEH ;l| U\EPj2RDž\\MUE}u&MQUU3uMȃfMȋUUEMUB%fEMQE fEMu%hz=`t &#UBȋMAXE UhEH ;h}JUB ;h| MXURj7QDžXXEMU}u&EHMM3uEȃ fEȋMQELMUEEeMdUB ;d}JMQ ;d| ETMQjPDžTTUEM}u_%UBEE3uUȃfUȋEHUDEMUEE`MQ ;`}JEH ;`| UPEPjODžPPMUE}u$MQUU3uMȃfM=UU2E\MQ ;\}JEH ;\| ULEPj`ODžLLMUE}u,$MQUU3uMXUB ;X}JMQ ;X| EHMQjNDžHHUEM}u#UBEE3u@UTEH ;T}JUB ;T| MDURjnNDžDDEMU}u:#EHMM3uEуt (#Eуt #E(PMQ ;P}JEH ;P| U@EPjMDž@@MUE}u"MQUU3uMLUB ;L}JMQ ;L| E<MQjEMDž<jjPhrD+tQURDž  EH08B;u Dž { 8Qu08Q$u(jQhrDUR؉  EPQUR+  xrDt뿋8$ u_~VB;|$HB; Dž Dž z 0REP8Q4R|CtEDž(EDž }E#EPMQU$R=Eă}EċHPEĉHPEMAIʋUĉBJEċH44BP4Q REPoE싍4Q4L,84B 4Q+‰(!:Dž$Dž 8,u Dž(Dž EDž(EUREPMQ8B=u08BMQ82uUB MA= tUB @MAEDž(EUz tDž(E83҃4ƒU؋EPMQUR8Hu08HUBl4QA4QAE4A I$ʋ4B J$9-4A(Dž(4BJ4BJE4A I$ʋ4B J$,4A(8B=t$4U;,u4QU8Hu08H4H 94B jQUR_E싅8Ht4EB4U, MMUB 9E}!MQE I#пtȋEHU44Q (4,8Dž Dž$Dž,\}ve}t_MuWUu EPTtAMQu6E%=t%MQUR8HQUR EMEDž(EUz t}t}um8yuFU„ HJHJ@ B 0ɋUEMA UBEDž(E0MQUREP] 8Qu08QEH= tUB @MA83ɃLMDž(E4BJ4BJE4A I$ʋ4B J$i)4A(U8HJ0Dž(4=hu EUREPMQL 8B8Qu08QQURԿuEDž(Ev8Ht8BMQREPhEDž(E'4QA4QAE4A I$ʋ4B J$Dž(EfH‰?u3uEP[EMU}u EsEHMU$3u3MfA uURMfA REPvMfA EUREPMQ^ E8Ph%8Qt3  t8Q@t Dž,8H@u}tA}t^UBMHPHPEA I$ʋB J$J&A(EhSMU E=ȿt hoS]s   c  N   k  W   IMv__VVIx"a!"!F"! $]$'v'##(,&,*o*(),\N.[/$$##B R-$%&-%k0  !!;"# $%&'())**+,-./001234;;;;;;;;;;556;789:̋UE ]̋UEEMQV!E}t1URjEPP MfU fQEfMfHUEBE]̋UEM}(ME #Pt EEE]̋UEM}(Mt EEE]̋UQE ЈE MQE #t3.MQUEM #U;t3]̋UEEEM MU+UUEEE}MU}u}u EEHM}~U;U~3hEEMM}wUl6$X6*MMUUEE MMKURE P]+6666 66̋UEEEMQ  MU+UUEEE}MU}uq}u EEHM}PUUEE}w M$7*UUEEMM UUbEPM Q]I7777777̋U}u3VE HtIU ztjEPM Q{u%!jU REP u3]̋U3] ̋U} t3ujjM QjUPVMQ1EUP$ЋA MUB uKMQ REHQUBPM$QUP8E}tjjjjjMQUPj@# MRj1#E]̋UE,H QU$RE(PM QUREPMQURE PMQ](̋UEM,PE MA UBM BMAUBM B MA] ̋UE\==t EEEPhhh0J=ȿuh J,=uhqJ Qh[JjEE]̋UjtE<h)J]̋U EEĿd`E@ MA0jUBExtMQRE}u/ExtjMQRhIEPBE}t h3ɋUfJMfA EfP MAUB-.MA,UBMUEBMUE@Mǁ,URVE$PH3u;dpPItjEE]̋UE]̋UEdj@tpM$M(M$U(M$M(MU ME MM jE;UR?EE EEMU;Q }EHUEMUEE͋MytjUBPMU M$E(}t MQ 3uj:3]̋UEE E}wM$p> E-E] IU>Y>[>W>̋U]̋UP3ʼnEE Q$ȃu3u3}Ehj`Q!F jjh U3]̋UEEH MU;U}fEE+EEHUEMQ ;U s EE0MQ ;U vEEMQ;Us EEMM뒋E] ̋UE8tM Q ~ >E H ,UEPE}u jjMQE}ujUREPM QUR)? EMAUBBE@ @$MA(=Ŀ} Ŀ=Ŀ~ ĿUB tMQ UEEEjMQUR*E}~EPMQREPf> MUEMQ +UREHUPMUDP-> MQ uc}~EMTB EEMfUfQ EH +Ŀ;}EH  ĿUfJ E MfQ fP E,UJEH QUREPEMQUEPM$U(}t jEP3]̋UEH M MURP E}uhh<3`}uM$M(UB E 9E|E/}uM$U(jEPi] ̋UQMM U,M,UEB MQUEM HMU E] ̋UQEE}tMUjEPދ]̋UPhEHQE}tEUzntE8u+Myst"jUBHQ[E}tEE耽EUBEMdM}AU$HPEEHM.EEUE;BrMQ2 E}uM$U舂(.MAEU;UrEPMQURUE܋M$E芐(M;MrUREPMQEjURE;Er-zjMQEghq Ej(hUREPEMQ $M9AuGlURE}tE }uEH ,REPO E#l}uMQREP* E}uwMQUREEH ,U}uPE8uH=lt+MQEUB $M}tE]UREPMQ}EjUR5jjEPMQE}tUBE}u}tMQURXE[}uNM$M舁(п UE#ЁпM$U芒(EEEx tjjMQURE}t`E3ɃxsQUREPE>j j MQURE}tEPMQUREPMQ(-Ej j UREPoE}tMQUREPMQ.EjjUREP1E}tMM舁 UREP.EMU芒 YjjEPMQE}t:MU舂 EPMQUR0EME芐 }tjMQUREEx s EMQUEPEj MQUREPE}tjMQ}E 3ҹ UMM舁 UREP80EMU芒 }tjEPMQUREP5EjMQ=htUR̿EhphP5E=htEPhEhph0X5E=htMQEhph"5EN=htUREhph4EEHQh4EE]IL@M~MMhN!P!P!P!P!PJLJLILOOOOŐU4EEE %EM MU UE M~ EUtEt Mu}r }v M$U(E@MM̃}U$HUEEu|MMEEUU EEMU;Q }AjEPMQUBMRtȃ}}EEMMUU뫋EEwjMQUREEE MMUE;B }IMQE M؃}vUB ;Et&MQUREPMQu UU룃}uE EejMQUR=E܃}u E?}~EPMQREPG2 MMԋUԉU EEM;M}AUBMU؋EPMQUREPStMԋU܋E؉MԃM뮋UB +EPMQE QUԋE܍ Q1 UB +EPMQURE܋EE MMU;U}hEM܋U؋EPMQUREPtƋMQ ,EЋMQ+UЋEPMQU؋EH UE؉BE MMUB 9E}&MQE M؋UB ;Eu M؊UQE EEMQ 9U}&EHUE؋MQ;Uu E؊MH`E UUEH 9M}@UBMU؋EH;Mu U؊EBMQE;u M؊UQ멋EHM؋UBM$E(MQ}t jURE]wQwQTOTTwQ̋UQEH tUU u}u EHt;U tEHU;u$E t}t MQ 9Uu EEE]̋U$E %fEM MU UE~ MuU~ M$M(UE EEMU;Q }8EHUEMuUBM;tËUREPT봃}t E EMMEE UUEM;H }\UBMUEH U;u+EtMQE;u MQUREEH U;~됃}uM$E(w}t EEЊM܉MM$U(=ȿt8EEtMQURh- EPh,3] ̋UQEHUD,E} u,MAAUB B$E@(M*u EMQP]̋UEE} 0sh >,0EH ,UE;E tMQU Rh, EHUB ;|*MQ REHQh+ UB EM,MU+UUEMU}MEH?MU;U~EQhc+UUE}SM`]$ ]}t }tEH; $rUBPh*}tMQ;$rEHQh*}t}U}tmE}t]UEHJ)Ut}~9EHtUB=~MQRh`'*E@9EtMQ|EHQh@)}t}t }tj}tZ}|}~lD}|}~V.}tF}t6}t&c7=`u $7=u   =hu }t }t}tUPh(EM;MtUPh(KMU}Br"}Kv}Othf(+[EQhK(@}uh`,(!3UREQh@ ( ]Ii[^ZZYZ[Y[[nZ~Z\[[[[[[[ ZYx\   ̋U E EMMMXUE EEMU;Q EHUE=lMQ $EMUD ;Ew\MQUREP& MQE}t3UпBMy tUB EMA UUUKEH ,UEE;Evh@@&KMMUREPMQ<& UпBMy(tUB(EMA(UUUEPMQE+E ] ̋UVWEEEEhE}u au}MUBAMUBAMUfB fA MUfB fA MUfBfAMUBAMUMUfB fA MUBARQEMQ PI$HUEH(J UB EM,MU$U!E+EEMUEMUE}~kMQ?UEH?QUREP$ M8~ EU E;E~MRhE$njEP3_^]̋UVWEEEEh8E}u mu}MQ UE$EM,M!U+UUEMUEMU}~mEH?MUB?PMQURw# E8~ UMU;U~EQh,#lUEHJUEHJUEfH fJ UEfH fJ UEfHfJUEHJUE UEfH fJ UBEMQPIHUEHJ @B$MUB A(jMQ3_^]̋Ud`]̋UhjjhHhjjh5hjjh"hjjhhjjhqhjjhAhjjhhxjjhhjjhhjjhhpjjha]̋U`djEP d`]̋UEE=t =u} th9uVE EEM; KEU M}'U;U u}tEM;HtUBl)u:E}u} u MQntEHnQh0! } tUJX+ȅ~UBl)u MQnuxEEMQl(uEHfQnfEHfQn}tUEMUEMUM jEPMMUEMUEE;}|]̋UQ`dEPM QUR)E}ud`E] ̋U$VWEE=uNEPqEEME}@MQl)uEHntUJX+ȅyUUEHl(uUBfHnfUBfHn}tMUEMUEME  jURPEH UB-;qMQl)aEH}@u 3uG}0u3u0MQ EH*;uUBMQ(;u E}0u 3uG}@u3u0EH UB(;uMQEH*;u EUEJ;H$u:UE ;H u-UB MQ*;uEHUB(;u E[MUA;B u:MU;B$u-MQ EH(;uUBMQ*;u EEEMU}u}t)EMEM UM UB hMQU}u EE MMUB` EMA`UB`E܁}w*}tI}t-}}v-} MAX}tXUBȉE}u&Mydt UE+Bdx MUQd!Exht MU+Qhx EMHhoUBX\;|r | iUBX-x;|r | x:xUBX0EH uUBXMAX} tU EE_^] ̋UQEM3QEH3ыEH 3щU#UUE]̋UxP3ʼnEEE`djjE$PE}tA89t+h`h0d`3! ; r jjE;rD9th`h%d`E M}'t }(tKURj'E$PeM fQfUE HuUU E HMUU3fEfMfMUUEEMQ1UEH3MEUB3uNMtUDEJMBEċJ MUtE4MPUHMP U$Et MQ(UEt MQ$UEt MfQ.fUEt MfQ,fUEPMQE}u-h`hd`;UBn;EMQURYEHn;M=ȿ9ttUB(ȉEԍMQUR]EH$ɉMԍUREPEhMQ,REPMQ.REPhMQB Ph d`hMQj(U$Rq1E Qh`h` d`#jjU$R~d`3M3]̋U VW=t=u";tB=u3MQEtR*E}uh3E (uCMMUBl)t h(MfQnfEfPnMUQEHMu} UBXEMHfU EfPlMAAUBB3MfAnUEB\MUE UE_^] ̋U=v #t  [=tjP Q=u =w]̋U VW= EH3҃‰UEPEMEMU}EHl)UE ;BMQ EH-;UB MQ*;u}EHUB(;uk}t.}@u 3u}0u3t!}u1MUA;B$u#MU;B uMAXE%U Rj)EP_^]̋U EEEjjZE}u3?E HM}t E(URj3E3ɃMUBMAUBMAUEB MUQ(E@$MQjUBP. M QU}tgEHMUB ̋UfJ}tE HɋUJ E ɋUJE ɋUJ E HɋUJEE}t%M fQ ƋMfU fB̋UfJ#E fHՋEfM fQ ƋMfAUB $ PMA UtAEtMɋUJE@ #Mt UUEȋMAUB EȋMAUʋEPMA U BE}t`MQUR2MfAU$ @MU$ MUB3MfAUfEfBMQ3MfA E]̋UQhE}uEE0MAE]̋U=pt=t =uEEE`dE MMU;!E UEM}UBl)uMQ-tҋEH`tU+BXMQX+ЅjEHdQUBhPM Qj:EjUBhPMQdRE PjEMQ/U}t2}tEMUE}tMUEMEUUd`EEMMUU}t(EHMUBjjjjjEPjMQht|Rh]̋U}Ъu;ExHu0jhbM(QURE(PMAHURhbE(PE i'MAPQTU(REHTQPPREP3]̋Utph`]̋U3u]̋U,x |pjh-jjhtPh]̋UEPhhl  MQ]̋U}u h v=tjP]̋UQ=u E kpEE]̋UVWE=uEM`dE UUE;MEMU}Ep;E w}MMu}UBMfP fQEHUABMUEEMQX+Ѕ EMQX+ЉUEMHXUpUa3d`}t3MUE_^]̋UE =| M UDEjTE}u MUQPE@@MA0UtE +Ⱥ҉UEEȋMADUE#BDMA4MU EPMQU@RE0PMQ҉E}u+ME jMQMU 3]̋U0P3ʼnEE =| M UDEEMMUtE +Ⱥ҉UEEȉEM#MM؋MU EPMQUREHщE}uMU &ME jMQ3M35]̋UQE =|<M UDE}u h 3uURh}EPMQ03]̋UE EMQUBPMQ REHщE}t jUR3]̋U3fE fMffMU}'EPMQUELMUR3(]̋UE EE}}Lj MUDP;$u43fM fUffUE;E}MQUR۸ 3]̋UP3ʼnEE =|3GM UDEEMMURjEPMQ(҉E}tEMQP3M3"]̋UQ} r-E MTUEMQhUREH03] ̋UQE EME3]̋UQE H|2U BMTUE @M QhUREH03]̋U EEM MUEJ;uvUBk MT UEMfQfPExDu MA UBDP!+ȋUJ EMQ4EMQPPEHUJ3]̋U]̋UlP3ʼnEDžT=ȿu EƅX}=t4;rw ;rZ  ;u;u TDžPfMQEL,$$ xt yu B A zu HT$B?$$$?uI$HQhj((R$H?$$$+u$H?$$$Pu$H?$$(P$-%$<DžPp$Qu DžP`=$Hu DžPP"$BPh@j((Qx$B=u DžP`"$QRh@j((P4DžP0%DžP $QRhj((P$QRhj((P$QRhj((P$QRhj((Pz$QRhВj((PS$QRhj((P,$zu E ȉQPPhj((QBtT(s(+ DžBPhQ(Pj$QRhj((PF$QRhj((P"DžPpDžP` DžPP} uh@hXQ ƅƅU$$ȋU$M$‹M$PM$Q R4PM$QR!EH1t*Rh0hXPMuxs+ DžfHPQfRh P XRSs+ DžQhRXQRhhXPMuxs+ DžfHPQfRh P XRSs+ DžQhRXQU$$ȋU$Mu7BPRhhXP hhXQ s+ DžPhБQXPs+ DžRhP XRPMQ1RhhXPs+ DžRhP XRE$fH‰M$fQȉ?tl% t Dž DžQURE$+PM$fQQhj UR}tEH DžURXPPQRh`!Tt:}tEH DžRTPh0 M3] IetFmw/S!у   ̋UEEM MUEEMMUM+‰EEEMME}~ U+UUE;EsDME#t3UMMMMM;tE봋U;UsEUUt3D߃}t3}}-E+EEM;MsUMMt 3}]̋UE} t*EQ RjE PwE}u3DMQ UEPMQDE}t"}t}tUB;Et MQUE] ̋U@EEM ŰEEM̉M܋ŰB EMUԋEH|.UB M̋Q M#t E̋HM ŰBENjM̃yt ŰBMԋUUUE̋H MM؋UUԉUEEM؃M؋U;UsEU;tҋMQ t E̋HM̋EUM3%EEEE}~ MMU+UUEMU+EEȋM̉MUzu E̋HM ŰBẼ}tAMQ tEH9MEUREPMQstE밋UŰE̋HM̋ŰEă}MQtE9M UċBxE̋H ;M} ŰB EMMUUEċHQUREPjE}tMUċA;Bt MQU}tEPMQURtEEċHMLU;U/3]̋U EEMMU UEH|FUB MQ M#t#EH UB U#t MQU EHM믋E] ̋UEEM Q UE HMUM;} EM UEMM}u U"E9M}UU EMUUEEEMMMUUUEEEMMUUEEM;MsUM3‹M#t3뿸] ̋U,VWEEEMUԋE; ~ Mԃ}uEU;U <}~#EP Q R0 EԉEM;M~ U+UREEP MQ  UԉUE; vMQu EEߋM+ MԋU;U!E;$| Mԉ $<U;$}$+EPj MQl Uԉ$  $P QEMԋUz 5 3tE}u} tEP 0Q<EUU}u3+E0EMMUR PMQ UREP QURiE}t!hjEPEMMԉMEUUUE;EsMu EEߋM;MtME؀UU؋E#Mt UUEU0;u M܃9MtEU+UE ЉM+UEfP}tMQ EP E_^] ̋UE EMMUB|.MQ EH E #t UBE MQUNjE]̋U4EEM UEH MUEMQURkEEEEMQ UU؋EEEԋM;Ms&UMMMM؃M;tҋUE&EMQEH3сU܋U+UU EE}t MMUŰEEM̉MЋŰB MEH #t ŰBE M̋QŰEH9Mw‹UREPMQEUBEMЋQ E UB #u MЋUQ EЋMHŰEBMUЉQEH U MQ #u EM̉HUEBMỦQE]̋UEEMMUfE fBM EP MUQE MA EfPMUQ EMHUB E@ MUE] ̋U8EEM MEUE3fM3fU}tHEH QjURE}u3EfHfMUB+fMUB E܋MQUREPMQEԋUԉU}=EԉEMԉMЋUԋBEԃ}t\MԋQ;Uu3u}t@Eԃxt9MUB;|(MԋQREPnuMԋQREPJt돋M;MuiUUȋEEԋMԋUЉQEԋMЊQ P EЋHMUԋEBMЋUԉQEH;Mu UEԉB MUԉQEԉEMȉM9UUԋEԋMЋQPEЋMԉHUԋEЉBMԃyt UԋBMԉHUԋEB UfJE@ }t0MԋU܉QEԋMfQfPEH UB MԈA UBEЃ}tMQ+fEMЋQ;Uu EЋHM UЋBEMQ}`EЉE MQU}tGExtUEEMQUUEHMMUBEEMM뷋UUu }uEEMUʉM}~E-EMMUUEExMUUEEރ}tpMMUEЉU}~MMUUEE܋MME}uUEMMMEE}uUE} t h`}uEMMMUUEME}~UUEEMM؋E%]̋Ujj(]̋UjjhЪjh0]̋UEMEU;U}EM E U;U~EMEU0}t%}tEPMREPMQhlU]̋UP3ʼnEVWEEMQ Eu8hhPh jlMQRjsMUu3tu 8󥍅8PM|QmpRj8PMR~u0.EupQjj~UE_^M3$]̋UQE H3҃‰UEHU B#M fAUB M Q #ЋE fP MQ E H #ʋU J E MP4#Q4E P4}M UA#BM AU EJ#HU JE MP#QE PM UA#BM AU EJ #H U J E MP$#Q$E P$M UA(#B(M A(U EJ,#H,U J,E MP0#Q0E P0!M U#M U EJ#HU JE ]̋U EHUUE EMU3BM3AU3B M3‹MQ3‹MQ3‹MQ 3‹M3‹MQ3‹MQ3‹MQ 3‹M3‹MQ3‹MQ3‹MQ 3‹MQ3‹MQ 3‹M3A4UJ 3U3B0EHEU3 EP3ʋEP3ʋE3H4UB3ȋUB 3ȋUB 3ȉME]̋UEEMt U UE EMQUR]̋U VWEH3҃‰U}E Hu  UE ;u[UE J;HuMUBM Q;u;EH U B ;u)MQ E H ;uUE J4;H4u EEE} u3ur} u 3u[MQE H;uIUB M Q ;u7EH U B ;u%MU A4;B4uMU A0;B0u EEE_^]̋UVWEEMQpUEQ\BEMQE}uhh3URjEPuMQ tu}EMHpUREHpRMAhUzhu"hh?jEP3aMQhMQhEQ\z8tEPMB\H8ы̼̼E_^] ̋UEЉUԡRPEPMQ#UEu MǁU+EUEEMMUE M܃M܃}~$UREPMQUREU͋EMUBpMUBlMUEJl+HpUMUBpMUEH @t9U+MylUE+ыEMtjUPMǁ=u5hqUB ߋMA UB ࿋MA )UMRrMUu5h@EH ߋUJ EH ΉUJ E+UE MMUE;s.MEMTEE뻃=} M=} E hЗh0"3^]̋UVWExt UPhphPٿ 3MQU}~ }|3a3uMQ t jPhh@MQjRjj2EPMQ t"h@Pj QURY E@}uLP=u$h hhjx QjYUBTE ȼMjUREP Q[E}uURhph裾 2ExTu MUBTATE MM}s#UE|XuMUEuDXDXι}u3u 3uM; ȼtEHTQE=~5UREHTQUPMQTREHQhphͽ3uEt)3Ƀ} MUUEPMQ]u}}t UREP3{}uPLE_^] ̋U EEMuU U E HMUUEH3;M]̋UQh E}tEjxjEP:^ ȼ ȼUǂE U3uE] ̋UQVW3u ;Mu3u=UE;MtUEME3uEM UE U E3uދU B\x0tMQU B\H0ыu}|UHtU|RE$QUt-E HQUBPhhVMǁU|RtEH UJ EH UJ EH t UR^_^]̋UQE H3҃‰UEHU B M fAUB M Q ЋE fP MQ E H ʋU J E MP4 Q4E P4}M UA BM AU EJ HU JE MP QE PM UA BM AU EJ H U J E MP$ Q$E P$M UA( B(M A(U EJ, H,U J,E MP0 Q0E P0!M U M U EJ HU JE ]̋UEHuUB uMQ u Ex4t MQuhExuQMyuHUzu?Exu6My u-Uz$u$Ex(uMy,uUz0u EEE&$E8uMyu EEE]̋UP3ʼnEVWEEEE EEԋM\t#EQhh`j CUԋBE}~ }| !MԋQt hPPj QUԃ R,3E؉E܉EEEEEEMԋQUEԋHUԉJ}t"uԃ$}EԋH MUԋBELP=u'hhhh QjREԃPMQRVEЃ}tEPjMQRTEEHuUButMQjURPSE}tMQ\UЃ}t>}t,j8jEԃ$P϶ MA UԋBMԉAUB.-EԃPMQRhh {E,EԋMЊP3MԃAAA jUЋBPMԃQ}uURhh }}`u}t EH(;MtUǂnEQ48||QUEuhhЙ蕵M|QUREQ苵 EUz\u/=~EЋHQURhh=3uGMQ\;Uu}u3=~'MЋQREH\QREPhh3ũ=~2UBPMQREHQUBPhhP襴3uUzhuEPhh 肴 u`}Mt)}u j8袄E}tU}jj@EP QQjUR*=~EЋHQURhh3u֋uԹ}MUЉQ\EM UB\HUjjEP QnPUEuSjxjQy jxjRTEMTjjR/MUu&jEPMQhh UB\x tMQUB\H ыUR}EE}t$}ԃ$uMԋUQ EԋMH#URjEP QXOt E/UԋEBMA3ҋEԃPPP EPL}t jMQE_^M3α]̋U E MQDU}tzE;Mtf} teU UEHMUEM:u.}tUBEM:AuEE}uE҃UEE}uEw3]̋UE uMM UBEMMEU33E] ̋U VWEEMB EMQE}u3j jU`R'REp}MUBAhMǁ3uEMP\EǀMQtDhh`h j`EH QjJUEujMQ3UB\E_^] ̋UE t MMUUEEMQ] ̋U EEMt U UE EMMUREP]̋UEMM}t[UEtFUEJ;HTt)UBPMQTREHQhh먋UREPi뙋]̋UEE8s#UPhh蔮 MQ(U}~ }| dLP EE}&MQE}u EEt>My4tUU;}jMREǀMy4ucUuEQ}UEuMQhhКv E UUMU9E} MUEQUREQE UfMfPLE]̋UjhPK=~ ȼQh@h 辬 3uj@PHjhj@ QHjjhA]̋UlEE3EEEEEj0jMQL UBEMM} jj0UREPtE؋MUQ}tHEM̋UB=uMQHvT}0vHUR|E}u 2EPMQUREP\tE؋MUQ}t2EE@Uf E@hphPXMMUuYMMUMfUE@MQu"EU EHUJEE EE} LPMQUR E}v EE}}PLEMMUEBM;M|]PL}t jUREE;Ev)MM܋URczEԃ}u E N"}u/} tE EjMQURExEE ȼUEEEG$EM UQEt" k\MMUUEt ȼkxMMUtEEMt̼k`UUEt ļk`MME]IBn:̋UQEEPh h8 QI>]̋U EEM MUBt$M QhU”REQ=1Ut%E PMRNu EǀM0MM;v EEE]̋UEEM MU 0UU;v EH| u Uzpt3ExPMQxB\HtU3EEMM}tQ,3 м+ʋԼЋEEMUM싑;UwrE싈;MsjUR 3]̋UQEEPhh4 QY<]̋U EEM MUB t$M QhUREQ<1Ut%E PMRNu EǀM0MM;v EEE]̋UEEM MU 0UU;vvExPuk ,3ҡм+ ԼʋUUEME􋈄;Mw+rU􋂀;EshMQu3]̋U} u<=hthf7lh3} u jl3-] ̋UEhEHQaE}tE;U:u"jEHQRaE}tEEHMUmU}wEp$dUBPhPh z EMQRhPhU EP&EM9ujURElEHM}r }.~URhPhМ E@(؋‹MQURE؋EPSWVEĉUȋEĉE؋MȉM܋U +E؋M܋U E@p5м=ԼMQpxURE pP1M MU|( ErM UE} hU3uEȋU +ERPVQEЉUԃ}t%EPEMUЋAEԋMAU B| M A|U REEЋMMQPh}t}tUREPM dQURE_^[]̋UVE M}t Uz4u33oMMy4UUED8ȋU BlRPVQjhRPEUEM;H,|URE}t E@EU^]̋UsEU  UE +  l+C]̋U=$t(( (; $s(ؼRPRP菂EUE ; v;} E; v ; } E}t4+jjdRPEUU;Ur wE;Evi]̋UEE}tEMQUE@MQ?E}u E1UREEHMUB EMA My |UUEPj3XEMM}uh0芀JUREH$Qq8UREPbH)MQjWURhIEPjW|]8 ̋U8VEMEEUB%MQҁ‰ELPMQU REP]t=@t#MQhD=UEjjEP QE}uUuEQ\Bt)M$QUR补E}uYEHhMU$REQE}u*UREPMQUH\Q҅tEEMQ| tEEMM؋U؋;ԼrM؋;мE`MUм Լ=t UB EEEԙM􉁀UUЋEЋMЋP QE м+5ԼUB RPVQ}EUEE̋M̋U;Qrw E̋M;HvUBEJMU􋂀EMU􉂀ԼP мQURjEEM;u_U uWEP:E܋MA :Uz u.EEMyr3UREPkt3]̋U(EEEHMU;Luhh s2E;Pt M; TuhhrUBE؋M؃xM؃}w U$EHQhprEMh hjUR_EPMQ%URBEEPMQUREP:E}tMQTEjUREPWBEMQUREPMQ:E}tUREjEPMQUEPMQ>E}t3mUBEMUQEPMQhhP|qUREPMQ9E}thh0Pq}t jURE]|\<̋UEfM fUEBMAUEB]̋UEEMMh hj UR=t>ExuMQ|u ExtMQ|t Mu3UztEPMQU REHщEU UEE}t\MQEP}u MQEM UBMU'EHUBUu  UBMUE^]̋U E}t} u3`E EEMU;AEHU<u܋EEMQU REPMQ)EEU;UuE묋E] ̋UEE MUBMUEEMQE MUBMUEPMQUEUuEEPMMUBMAU;UtEHUE M;MuU+U#UEHEMt$UBM#UEHEEM;MMyuh@h[U REQREPIM QUPQUR)3] ̋U@VEEMMUUExu;Myu2jhURkE@0@4MA<3VjjUR<EExubMy~YUB M+Q0@A4U؉E܃}|}vMQ EЋJMUB0EЋJ4MԋUEЉB0MԉJ4Uz~eEH U+B0IJ4EȉM̃}E|}w=UB HMUUjEPMQU􋂔PQUR뒃}t[EH QUEEMQVEjURXE@(MI83VQRPYMA0I4ʋUB0J4EM􋑐Uz`u&EPM􋑔RPM QUB`@(EUM􋑘3PRMQURmYMʋU􉂐EM싐+Q0A4UEă}(|}w MQU􋂔PQUR{EPM􋑌RPMQ[E^]̋UEH`M}u3UEHJ`UBPMAPUEJT+H(UJTExPu)  Uм ԼUzhtBEHhMUBPMAPUEJT+H(UJTExPu  E]̋UE EM U U Ex}u(MQ E +H0RP4MU}|}swEH QUEEjMQUUEHpUB<+AXMAE.t MU;u룸 뚋Et U*u3] ̋UEH MUEH;MsUEBMA3UUE EEM; UkEUkEHUkEHUkEH UUEkMMUkPMkREP4 MkREkQUR4 EkMM#UEB3]̋U$EEEMMUEB EE MMU;$EEMkUEMU: u.}tEHMU:JuEE}uEEMM܃}t뀋URhh{3 EkMQ ;t+EkQUB PhhA3{Mku$EkQhhp 3 CUkPMQUkP2 3hhP23]̋UQ%`蛱AE}t h@r2P QhX2 ]̋U EE EEM; }UkEE؋MQG=uzUE EEM; }RUkPMkREP1 MQ/UkEMkUU3]̋U EEMtE.tU_uM.]̋U=tjPhl jh0 ]̋U=d|hp0EEMMUEE}uM+MMUk kUkM kE kUkkLkk  ]̋U3](̋UQhipfwEPjlE}tMQjUR/ E]̋UEPhБa/]̋UQ}u3)EEEMMUtE]̋U  u8hph $ MUEPphEUM; U;EEEEE+ M $EMjhUREPZ.EU QREPMQQ.EUUUEEUE#M UE M $jj UREP.EUjh@BMQUR-Mjh@BUREP.MA]̋U EPpjh@BMQUR-EE]̋UTEEEEE3fEEEMQUREPjMQU0RE}uE0EMUJ(EMQ(P E %(MA$UEPMU QEMHUEBMUQ EE EEM;MswUt4EHt UB EjjjjjMQ`EUUEHM̋UREPMMQ+ UỦUEM܋U܉UxEfH fMfUĊfEMātjUR[EE} u MQ U EHMUU؋EH(QUREPMQUR }tEMQUȋEH MЋUBE@MMU:u EMUzu EMH UEH UEBMA} ujjjURjOEjjh4EPj6Eԃ}t?MAUBEMȉHUEЉB MQdUR!}u 3 EP3] ̋U,}tEEMUB}u}u } MQEHMEEE}UBEMQUEEEMyu E6UB MQMQMI  ‰EԋEEԉEMMUEtMUQEMHUEMA} tU UEM}tEE܋M܋UB}tMM؋U؋EH ]̋UQEH,M}t UB,MQ,3ujMQjUR]̋U E 0EM QUE HM}}MUE xu@M~2UMMU,2Ext M~MUMEM yu^U8UEMU QEPMQBPMQB0ЉE}tMQU BPM QRyEEEƀM Q RE H QURjEPMQjUBQUBdыUBQUBpыUUƂE xt(MQU BPMQdU BPM Q]̋UdQ]̋UQEEMQ{]̋U EEM MUU}t>EEt3MUMEEMMu UUu̓}u!}tEMEEtE+E ] ̋UQjEPjjMQWUREPMQdU REPMMUMMU] ̋UE3fEEMUD 0PE}u3M0MUELUJ(EMQ(P EMAUEBMU QE@MQUREPr$ MQUREEP[$ MfQ fUfEfMUtjEP=jjjMQjE}tUR#}u 3]̋U EEEE PEMQU}s E H MUB EMQUEE}!$Ct)}$CtgMQUREHQjEPUREPMQRjrEEMHUE;Pw MM UBEEM UQE MH2ҋM \E]̋UE@`]̋UjDH]̋UE P2]̋UEEPEMƁUB(E}uEE MMU;UsEM;Uu E MՋU;Uu EjjsjEPMQUEBMǁ @UǂEǀPTM8E8TPE3UƂEP}u MQhUEE]̋U$VWEEEEM~ 3EPM Q(EUMMU~"ME1MEMUE PMQBPMQB0ЉE}tEMMUMMUEMMU~"MELMEMUEH QUREP$}M8MUE MUQEM QPEM Q P E pu My}U REPM Qt E H@uEE"U BM TUE HU D E}u}tAMQt2EH@UJEHUED MQEMLURjEPE܃}t'}u MQU R 3EPMQBPMQB0ЉE}t]MQU R EPMMUMMUEMMUMMUE_^] ̋UEEE} u E} u EMMUu$MUEMEM~ EeUB<EM H@UEBDMUQHEMUEMMUu$MUEE~ %u) ipfw: size mismatch (have %d want %d) ipfw: rule too short overflow dumping static rules _net_inet_ip_fw.dyn_keepalive_net_inet_ip_fw.dyn_short_lifetime_net_inet_ip_fw.dyn_udp_lifetime_net_inet_ip_fw.dyn_rst_lifetime_net_inet_ip_fw.dyn_fin_lifetime_net_inet_ip_fw.dyn_syn_lifetime_net_inet_ip_fw.dyn_ack_lifetime_net_inet_ip_fw.dyn_max_net_inet_ip_fw.dyn_count_net_inet_ip_fw.curr_dyn_buckets_net_inet_ip_fw.dyn_bucketsipfw: OUCH! cannot remove rule, count %d ipfw: %s: unknown dynamic rule type %u ipfw: %d %s %s:%u -> %s:%u, %s drop sessiontoo many entriesipfw: %s: add parent failed ipfw: %s: Too many dynamic rules ipfw: %s: entry already present, done ipfw_install_stateinvalid parentipfw: sorry cannot allocate state %s: initializing timer at %p callout_init%s: stopping timer at %p callout_drainNULL IPFW tableipfw: limit %d reached on entry %d ipfw: %d %s %s [no if info]%s (frag %d:%d@%d%s)+P:%d %s%sICMP ICMP:%u.%u UDP %s %s:%d %s:%dTCP %sMACUNKNOWNReassNatNgtee %dNetgraph %d:%dForward to %sQueue %dPipe %dSkipTo %dSetFib %dTee %dDivert %dCountAcceptUnreach %dRejectResetDenyAltq %dRefusern_addmask: mask impossibly already in treeNon-unique normal route, mask not entered Mask for route not entered rn_delete: Orphaned Mask %p at %p rn_delete: couldn't find us rn_delete: couldn't find our annotation rn_delete: inconsistent annotation %s: head already freedrn_detachheadrn_init 2rn_initrn_init: radix functions require max_keylen be set cksum: out of data %s %s to %d (was %d) ClampBump%-10s no memory for new si %-10s no memory for new queue q_new%-10s new_sched error si_new%-10s invalid delete type %d %-10s cmd %d not implemented %-10s bad len o->len %d len %d %-10s invalid api version got %d need %d do_config%-10s sched %d not found %-10s invalid pipe len %d config_link%-10s exit dummynet: sorry, cannot allocate red lookup table dummynet: net.inet.ip.dummynet.red_lookup_depthmust be > 0 %-10s called config_red%-10s fs %d changed sched %d@%p to %d@%p %-10s missing sched for flowset %d flowset buckets%-10s invalid flowset len %d config_fs%-10s XXX TODO requeue from fs %d to sch %d fsk_attach%-10s error creating internal fs for %d %-10s sched %d unchanged type %s %-10s XXX WARNING link 0 for sched %d %-10s type/sub %d/%d -> %d/%d %-10s sched %d type changed from %s to %s %-10s sched %d new type %s %-10s cannot allocate profile %-10s cannot allocate scheduler %d %-10s invalid scheduler type %d %s sched buckets%-10s bad sched len %d config_sched%-10s fs %d for sch %d not %d still unlinked update_fs%-10s no memory for profile %d %-10s short profile len %d config_profile%-10s still %d unlinked fs dummynet_flush%-10s compatibility mode dummynet_getschedlink%-10s (WARN) type %d %s %d have %d need %d copy_objqueue%-10s ERROR type %d %s %d have %d need %d copy_obj_q%-10s error have %d need %d copy_profileflowsetinst%-10s sched %d has %d flowsets copy_fsk_listDUMMYNET already loaded %-10s argument len %d invalid %-10s dummynet: compat option %d %-10s dummynet: unknown option %d ip_dn_ctlDUMMYNET %p with IPv6 initialized (100409) %-10s dn_sched %s %sloaded not %-10s %s already loaded %-10s missing enqueue or dequeue for %s load_dn_sched%-10s dn_sched %s %sunloaded %-10s ref_count = %d unload_dn_sched_net_inet_ip_dummynet.io_pkt_drop_net_inet_ip_dummynet.io_pkt_fast_net_inet_ip_dummynet.io_pkt_net_inet_ip_dummynet.queue_count_net_inet_ip_dummynet.fsk_count_net_inet_ip_dummynet.si_count_net_inet_ip_dummynet.schk_count_net_inet_ip_dummynet.drain_ratio_net_inet_ip_dummynet.object_idle_tick_net_inet_ip_dummynet.expire_object_net_inet_ip_dummynet.expire_cycle_net_inet_ip_dummynet.expire_net_inet_ip_dummynet.tick_lost_net_inet_ip_dummynet.tick_diff_net_inet_ip_dummynet.tick_adjustment_net_inet_ip_dummynet.tick_delta_sum_net_inet_ip_dummynet.tick_delta_net_inet_ip_dummynet.red_max_pkt_size_net_inet_ip_dummynet.red_avg_pkt_size_net_inet_ip_dummynet.red_lookup_depth_net_inet_ip_dummynet.debug_net_inet_ip_dummynet.io_fast_net_inet_ip_dummynet.pipe_byte_limit_net_inet_ip_dummynet.pipe_slot_limit_net_inet_ip_dummynet.hash_size%s fs %p si %p, dropping dn_enqueuepacket on dummynet queue w/o dummynet tag!bw=0 and credit<0 ?dummynet: bad switch %d! dummynet/ether: pullup failed, dropping packet dummynet: if_bridge not loaded dummynet: fast io: pkt chain detected! %-10s have %d < need %d dn_compat_copy_pipe%-10s have < need dn_compat_copy_queue %s ERROR sooptcopyout %-10s size=%d, buf=%p dummynet: -- unknown option %d%-10s setting compatibility with FreeBSD 8 %-10s setting compatibility with FreeBSD 7.2 ip_dummynet_compat--- %s, resize %d failed heap_resize%s: father %d out of bound 0..%d %s: extract from middle not set on %p --- %s: empty heap 0x%p heap_extract--- missing hash or match function%-10s ++ ouch! not eligible but empty scheduler! wf2qp_enqueueWF2Q+ weightRR quantumRR weight%-10s rounding weight to 1 qfq_new_queue%-10s BUG/* non-workconserving leaf */ qfq_dequeue%-10s len %d flow %p inv_w 0x%x grp %d qfq_enqueueqfq maxlenqfq weightPRIO priority%s %s called my_mod_register%-10s unimplemented. ip_output*** ExSetTimerResolution: resolution set to %d n-sec *** dn_priodn_qfqdn_rrdn_wf2qpdn_fifodummynetsy_Vnet_ipfwsy_ipfwipfw+++ start module %d %s %s at %p order 0x%x SYSINIT%s mod_idx value %d init_children%s unloaded ipfw_module_exit+++ end module %d %s %s at %p order 0x%x %s: match not found %s: the entry %s is read only %s: len mismatch, user %d vs kernel %d %s: match found! %s kesysctl_emu_set*** Global Sysctl Table entries = %i, total size = %i *** conversion of names failed for some reason WARNING: global sysctl table full, this entry will not be added,please recompile the module increasing the table size NdisVersionUpperBindings\DosDevices\Ipfw\Device\Ipfw0jR0r0 tb>$XTf|4R`~x`L>&rhTJ@4.'POLLipfwdummynetdn_fifoFIFOdn_wf2qpWF2Q+dn_rrRRdn_qfqQFQdn_prioPRIORSDSݪ/OE)  :::<<``%&0&& X@&)0../0// ,01`3334p44$ P8 ?p8@DC0680 `DD@EEF@F@G< @incomingoutgoingN@DUDžhPQ|jE PMQhLj|jR ƅƅ Dž$bDž,gDž$XTf|4R`~x`L>&rhTJ@40DbgPrintmemsetstrncmpNExFreePoolWithTagmemcpyaKeSetTimer^KeSetTargetProcessorDpcKeInitializeDpcKeInitializeTimerKeCancelTimer_snprintf{_allmul_allshry_alldiv~_allshl_aullshrstrncpy_aullremExSetTimerResolutionmRtlRandomEx3KeQuerySystemTimeAExAllocatePoolWithTag}_allrembIoFreeMdlMmMapLockedPagesSpecifyCacheIofCompleteRequestRtlInitUnicodeStringfKeTickCountKeBugCheckExntoskrnl.exeOKfReleaseSpinLockLKfAcquireSpinLockBKeQueryPerformanceCounterHAL.dllVNdisFreePacket NdisAllocateBufferNdisUnchainBufferAtFrontNdisSetEventNdisMSetAttributesExqNdisIMGetDeviceContextkNdisIMCopySendCompletePerPacketInfolNdisIMCopySendPerPacketInfoNdisAllocatePacketpNdisIMGetCurrentPacketStackNdisRequestNdisMIndicateStatusCompleteNdisMIndicateStatusNdisReturnPacketscNdisGetPoolFromPacket NdisWaitEvent#NdisCloseAdapterNdisResetEventNdisCancelSendPacketsWNdisFreePacketPool$NdisCloseConfigurationsNdisIMInitializeDeviceInstanceExNdisOpenAdapterNdisAllocatePacketPoolExNdisInitializeEventNdisAllocateMemoryWithTagNdisReadConfigurationNdisOpenProtocolConfigurationUNdisFreeMemorymNdisIMDeInitializeDeviceInstancejNdisIMCancelInitializeDeviceInstanceINdisDeregisterProtocolONdisDprFreePacketMNdisDprAllocatePacketdNdisGetReceivedPackettNdisIMNotifyPnPEventNdisReEnumerateProtocolBindingsNdisMSleepNdisTerminateWrapperiNdisIMAssociateMiniportnNdisIMDeregisterLayeredMiniportNdisRegisterProtocolNdisMRegisterUnloadHandlervNdisIMRegisterLayeredMiniportNdisInitializeWrapperNdisMRegisterDeviceNdisMDeregisterDeviceNDIS.SYS<44)424<4E4O4X4b4k4u4~4444405g5C6J699::??333u4B5I5g5 Y9;=P>>>?0,v0Y1y11111111111111111111p2t2x2|222222222222222222222222222222222333 33333 3$3(3,3034383<3@3D3H3L3P3T3X3\366X6\6`6d6h677777778a86:@:I:R:W:\:j:r::::::;;;m;r;;;Cp>t>x>|>>???@80l0001K1g1111222 222223 4<4444576@6L6X667G777 8808j8v88829997:::;X;;;^B>>>?!?F?Q?^?h?m???????????P0 0)0H0L0P0T0X0\0`0d0h0l0p0t0x0|0000000E1s1595H5L5P5T5X5\5\6w6666777777 888199999:4:C::';;;;3<`<<<<< ===== =$=(=,=0=4=8=<=@=D=H=L=P=T=X=\==>q>>>`001222222222333"3+353>3H3Q3[3d3n3w3333333333344*4;4V4k44i5u5~5555566 6:6^666778899: :::):6:<:D:M:X:w:::;+;1;6;Z;f;k;p;~;;;;;;;;;;;;;;N=S=a=f=l=====>)>7><>B>i>n>|>>>>>>>>>>??0?_??p000!0G0S0\0e0m0s0{000000000000112444455!5<5K55i6n6t666666 77)7>7K7|7777777778 88!8+858?8J8X8]8c888888888 939H9N9S9n9}9/:4::: ;T;`;;;>l?\0q00000000000 11*111222223383J3Y3k3z333333344+4:4R4a444 5&5;5J5_5n5}55555[6m666+7F7Z7l777*8E8888889V9q99999H:T::::;<;@;D;H;L;P;T;X;\;`;d;h;l;p;t;x;|;X011111 22.2O2c2n2s22222222223>3Y3q334 ;8<@>>>?\C1O1j1w222333%3/355 6<6B6J6]6k6q6y66666666666_:::;J;c;;;;;;C1H11112%2*222Y23333334?4K4W44415655555666C6H6N6i6n6666666d7h7l7p7t7x7|777768<8A8O8^8o8{888899::#:-:<:w:;;;;;<<0<<<<=e=k=t=====<>B>K>>>!?4?X?^?c???????[0d0j0o0u0001111 2o33333444444445"5f55555555555566(6;6S6X66666)7.7777H8Q8g8v8888899L<<<<<{>>>>a?f?????00)0Q0V0t0y0001 1h111~22222344444556 6b6g666666/77777788)82888=8P8]8j8y899=:C:H:s:x:~:::::;;;;;;;;< < >>!>+>F>P>V>[>k>u>>>>>>>>>????????D[0`0~0000000001 1111111111262<2I2R2b2g2222222222222333$3.373A3J3T3]3g3p3z333333333333333444%4.484A4K4T4^4g444&6/6=6E66677 :<:B:G:P:Z:l:{:::::::::::::::::::; ;;;;';,;3;9;>;F;N;T;^;f;o;t;z;;;;;;;;;;;;;<<<# ????0111111111111111111112 222:2B2J2P2V2c2m2w22222222222233334 4'4q444444444V5\5a5f5n555566666H7T77788*8T8Y8_8w88888m9v99:$:5::;; <<>>h0001111 222$222X2d2233z3333333333[446-6r666H7/9L:,;1;s;=====>?? $0081i1u1%9*9<<<<=$=?04346688@ 060;034677777!8*8`8e8 9+969O9999999: ::!:/:7:F:N:]:e:s:{::::::::;;8;Y;;;; <0>>>>>????P 0070F0S0l0y0011{1111111111 223282222222 333<3J3W3|333444:4B44444444444444445 555!5'505c55 6666!6'6,62686A6S6X6^6m6|66666777(77k88h99[:::o<}<<=H=e=_>i>v>?????`0N22T3333333333V4t444 5B5Y555576 7C7M7\7777:8j888"9j999;K;o;;t>>>>c?i?n?u???????pY0000 1*1=1X1q111?2j222222383U3\33334n444 5*515W5m555556 6+616n678v88 99B9x93:U:;>>? ?????0)0b000/1I1p1112)2G2s2y2~22222222222222223 3333(3-373<3A3V3]3e3k3p3v3333334 4444(4-43494B4I4R4[4a4f4l4v4{44444444555*565B5N5Z5f5r5~5 >>>> >$>(><>@>H>\>p>t>>>>>>>>>>>>>>>>>?? ? ?$?(?0?4?8?@?D?P?T?X?\?d?x?|????????????????000 0p&0:0@0k0u00000000000011$1A1K1^1e1l1s1z1111111111111111122#2>2P2W2\2e2l2ipfw3-2012/binary/netipfw_m.inf000644 000423 000000 00000002475 12012006133 016674 0ustar00luigiwheel000000 000000 ; version section [Version] Signature = "$Windows NT$" Class = Net ClassGUID = {4D36E972-E325-11CE-BFC1-08002BE10318} Provider = %Unipi% DriverVer = 26/02/2010,3.0.0.1 ; control flags section ; optional, unused in netipfw.inf inf, used in netipfw_m.inf [ControlFlags] ExcludeFromSelect = unipi_ipfwmp ; destinationdirs section, optional [DestinationDirs] DefaultDestDir=12 ; No files to copy ; manufacturer section [Manufacturer] %Unipi% = UNIPI,NTx86,NTamd64 ; models section [UNIPI] ; Win2k %Desc% = IpfwMP.ndi, unipi_ipfwmp [UNIPI.NTx86] ;For WinXP and later %Desc% = IpfwMP.ndi, unipi_ipfwmp [UNIPI.NTamd64] ;For x64 %Desc% = IpfwMP.ndi, unipi_ipfwmp ; ddinstall section [IpfwMP.ndi] AddReg = IpfwMP.ndi.AddReg Characteristics = 0x29 ;NCF_NOT_USER_REMOVABLE | NCF_VIRTUAL | NCF_HIDDEN ; ddinstall->addreg points here [IpfwMP.ndi.AddReg] HKR, Ndi, Service, 0, IpfwMP ;ddinstall.services section [IpfwMP.ndi.Services] AddService = IpfwMP,0x2, IpfwMP.AddService [IpfwMP.AddService] ServiceType = 1 ;SERVICE_KERNEL_DRIVER StartType = 3 ;SERVICE_DEMAND_START ErrorControl = 1 ;SERVICE_ERROR_NORMAL ServiceBinary = %12%\ipfw.sys AddReg = IpfwMP.AddService.AddReg [IpfwMP.AddService.AddReg] ; None [Strings] Unipi = "Unipi" Desc = "Ipfw Miniport"ipfw3-2012/binary/ipfw.exe000644 000423 000000 00000441352 12011754122 015666 0ustar00luigiwheel000000 000000 MZ@ !L!This program cannot be run in DOS mode. $PEL6'P' *@Px `D a|.texth`P`.dataJL@`/4H@"@0.bssP P`.idataD ` $@0/14p.@@B/29d0@B/454@B/61tOP:@B/73  @B/871 @B/99@0B/1128 @B/123R0@B/134h@@BU$@KD$D$$_D$D$$SD$D$$GD$D$$;ÐU$@fƒҸtD$@$PtD$PA$@AС:At:$@ƒҸtD$@$t $:AÍvU$@ƒҸtD$'@$t $@AÐU HHUfP]U]uÉ։T$$*u#$&¸tB ]u]UWVS<RfU؁@uu}u$C@D$$J@Ctts@@Uԉʅt$!NjD$EԉD$$O@~EA@CM؅t% E؋D$UԉT$$T@NEA@Fu<[^_]USӅtD$$Z@u$]@\$$f@[]U]uÉփ=0]At̀Āunu8t0t$i@t$n@ $s@~ut $w@eut $@L 3]u]UP?]UH]u}Ɖ׉MD$ ED$$ËE8u<$t"XÉ$ YEԈ]u}]UWVSC/<uYC$s*$t$D$$!@ C [($^\$D$$(@<us{*D$ .ut$C@D$$#|$D$$!@{(D$ .t$0\$$|$D$$(@h $3@$ L[^_]UE D$E$uD$H@$GUE D$E$uD$O@$GdU8]u}]} u=,]A=@u!D$D$$Ҽ@@yD$W@$Ert'|t"nthtgtvtuwu't$|$ 1)Ӊ\$D$$覻#t$|$ \$D$$ߺ]u}]UWVSu} ѸʃtOtIu߹у9u9ҋu ߉8uUBEMuĸ[^_]UWVS,EUU/aA؋uDt7L$ED$4$/<\uF~ƃtD u<\tD$+E@$Ǻ9utE\t 9u}u&|$$@É<$ҽthE0f}trU$ս$tD$<$E<$能}tE0UZ؃,[^_]Ã$蒽UWVS$ۺt؆ĉT$$ tD$$Z@Gۉ\$$@2[]UWVSÉׅt*L$$@@D‰D$$@s?~S@D$$Z@˹Cf9t$-S~ A@뵃[^_]U(]u}uэY\$E D$4$¸u9} у9tE D$t$$@豹]u}]U(]u}É։D$@$RtȉtE ؋]u}]U(]u}]U u׸уL$T$$u.t$$tt$\$$@ոЋ]u}]UWVS]} ~<u*0PI 4)։)s9E ЍP9U ~tJI4 < )Is/?BI 4)Ƹ)sE} 9ƋE [^_]UWVS\EĉUԀ`D$@$TD$@Eԉ$u UĀJ1@u8t}E]ԃD$,$_pM8{(D$ F$}~D$`@$AĴPvD$D$@$A褴}ă )UfBĉJAEB}~%]ԉKQ9]ԍSU6uЍL1MCaADuD$ML$4$̳UU9u::}tD$@$Aѳ\$D$@$A谳;E|;E~&M̉L$uЉt$ D$D$@$A耳+EЃuB9~"EЉD$ ]Љ\$D$@$ANUԀ:-uD$@$A2CIك 49}߉ЋM-t}ËuԃUB aADE]EԋFu5uĀ~}}D$@$Au}u}u EĀHjE}tEȃ?~D$@$A4EȃUB*ME2Eu $L@ C@tu $R@E%@@@D‰D$$*MEEu $U@覥C@tu $R@营E%@@@D‰D$$ƇMvE$M_ESEtEE4C@tu $R@{y $;@Et UC@tu $R@¤{y $;@谤SU$EEtuEEt $Y@o}tMD$$@TCD$$`@>MESu"A$AxD$]@$u f"TAiE wD$袋D$VA$蘋t@f"TA.D$]A$A D$D$>A$AE;uD$xA$@Ȋ TA6!TAf$TA,TAf&TA;D$:<$uD$,<$tBpU$E;uut$D$A$A;f&TAD$]@$ku (TA (TAE TA0EE TARuD$A$@軉D$ D$$;f"TAD$D$ EԉD$E؉D$$AhuD$A$AZ"TA;E|D$A$A:EN TA9E>$U TAcED$D$A$A TAft3E PAEEtf}tD$ A$AquFE*tiD$3A$uUSUCuD$=A$@)$ɈyD$YA$A F]MMED$D$ ED$t$$tAD$tAD$A$蟇}tD$A$@腇u(D$$ @4D$D$A$@WD$]@$D$ UԉT$$Ƌ aADtEԀ8uu;8u1ED$$ @T$ D$D$A$AĆ过8"t ~~AED$$ @`T$D$D$ D$D$ A$Amu1ED$$ @T$ D$D$0 A$A4}Eω4$PEuEE UUEE3u6E PAEEt$$ @E }H Džlt/<(t<{u$F~uDžl DžlMMEtHD$O A$u+UByD$S A$@)ȀMAEuD$m A$@D$~ AU$5 Au8 Au8t Au8u $NEؼb Au8t Au8u $KE膼)MߋUE趾UߋEtMA?t8肾UUE&M9MD$D$ A$AtFD$ A$u2}t luD$ A$A脃EH@lt`tF A8t A8uDžlED$ A$@ tD$ A$>tD$ A$@ނSUCt`(t{uSltD$ A$@观PxuEDžlEMDžlE]tID$O A$u,UByD$S A$@5ȀMAEEuD$ A$@ U߈s$ED$/$ts)t7 A޹8tMĉL$ED$$贂u\$U$:jXst7@8tMĉL$ED$$]tڋEC@޹8U$}t!]MA?t/{UUEMD$D$ A$@ÀtID$ A$u5}t luD$ A$A膀EH@]lt\tB A8tD$ A$̀uDžlED$ A$@D$O A$=u+UByD$S A$@ȀMAt[D$@$tM$ EhtE@?tEtD$A$tD$3 A$@QSUCt`(t{uSltD$ A$@PxuEDžlEMDžlE]tID$O A$u,UByD$S A$@~ȀMAEEuD$B A$@~~U߈s$T~ED$/$ats)t7 A޹8tML$ED$$'u\$U$fst7@8tML$ED$$~tڋE@޹8}U$}}t!]MA?t/UUEMD$D$V A$@6}tID$ A$hu5}t luD$ A$A|EH@]ltUt; A8tD$ A$@}uDžlD$ A$@|D$O A$u+UByD$S A$@L|ȀMAtUD$@$rtM$ EtE@?t茶E;tU9Uu/XAMMEe>!u'ExyD$S A$@{UB}t$$`@qEKMx$A]{yD$S A$@^{E@]lt}uD$q A$@,{UJ@]lfD$ A$@zlTD$ A$@z$E"]3MA$E] $@Eٲ]$@E踲]$@E藲]$Ev]$EU]fEuD$ A$@yUUBJ @8u MAz aADu:D$,\$E$pD$ A$z]C.ED$$yu\$D$ A$A'y]E@?E+u Uz,u Mj-aEVUuD$ A$@xEGUtw<,uUD$MԉL$Eԉ$yU,ttD$ A$A`x<vD$+ A$AHxډ WUu"O]MuD$ A$@xD$]$\]eEuD$B A$@wD$U A$_xt7$ڋEvuMUD$D$X A$AwD$D$$x$E贯]MuD$i A$@,wD$U A$wt7$ڋEӽuM]D$D$z A$AvD$D$$aw$E]EuD$ A$@vD$U A$wt7$ڋE0uMUD$D$ A$A>vD$D$$v$En]|MuD$ A$@uD$D$$fv$E]$]uD$ A$@uD$D$$v%$E蹭]UuD$ A$@1u$@E]MuD$ A$@t$ @E]M];uD$" A$@tED$UԉT$M$.uUԀ:u $Nu ]$uuUD$D$8 A$AVt@GMI]];uD$M A$@"tED$UԉT$M$tUԀ:u $t ]$ uuUD$D$c A$As@GMI]!];uD$x A$@sE>D$UԉT$M$BsxUԀ:tD$ A$AJsG]K] $E|] $E[]l EuD$ A$@rD$U A$fst7$AڋE}uMUD$D$ A$ArD$D$$ s$AE軪] MuD$ A$@3r$`@#E!] ];uD$ A$@qE@}< UD$D$M$\rĉG]( ]uD$ A$@qD$D$$r$E] E8uD$3 A$@9qUM$@E] ltD$T A$@p}tD$ A$@p$'E]]]) ltD$ A$@p}tD$ A$@ypuFE(f@@Ut+׉\$$@$~ Fu}~uD$ A$@pu,D$$$`@ǴD$D$A$@oD$]@$"u fFD$ MԉL$]$oËU aADtEԀ8uuAp8fu5D$$$`@/]T$ D$D$A$AIoDp8"t ~~ED$$$`@MT$D$D$ D$D$ A$Anu5D$$$`@藳]T$ D$D$0 A$Anf^]EE UuD$m A$@nD$~ A$跴 A8twD$ A$nu $NE}CD$ A$nu $KEI)M߉ڋEzUߋEt ]7MD$D$ A$Am]uD$ A$@mE艻]D]EuD$ A$@NmE蜻]D]UuD$A$@mD$M $U]D]q]uD$&A$@lD$E$U]D]4UuD$>A$@lD$@$ֲtM$ ]ECt ]UD$D$RA$AFlMuD$iA$@)lD$@$atM$ ]Eβt ]gUD$D$A$AkM9tyuD$A$Ak] CCكڃ]誦MU C薦]}D]EuD$A$@Dk@8tEU uMD$D$A$Aj]f$$E4]E$%E]$$=E]$:EѢ]$KE谢]$NE菢]]D$E$O]})tD$A$@iUD$<$Q]KMAEAE8ھэ41zuT~D$A$AoiUUFI EMAUt?։D$M $i>ыUD EދuƋMA]]gEtOD$U A$uitg$QڋE茯UD$D$$A$AhD$$`@GD$D$A$@jhD$]@$袮D$ MԉL$]$ hËU aADtEԀ8uu?i8u5D$$`@賬]T$ D$D$A$Agh8"t ې~~ED$$`@gMT$D$D$ D$D$ A$Aqgu5D$$`@]T$ D$D$0 A$A4gۉ$QE|]UuD$AA$@fD$D$$tg$SE$]2$TE]M9t ˃yuD$\A$@qfED$LA$zt*D$QA$dtD$WA$@^D$mA$:tD$qA$$8DDuD$xA$@]sD$/C$ ^t-X$*^E< v\$D$M@$Ac]E U܋ϕtD$D$"@$D7];#5u,\$dT$ LD$D$H A$AKD$u Ah$L`~(dD$ LT$D$ A$AHK4$K(dD$ LT$D$ A$AK4$K`=D$dD$ LT$D$ A$AJD$&!Ah$Lu1$,x uȋuD$$P+AZ0;]uދuD$<U̍D:$=oEEEMԃMĉuuD$$P+A/u E9uDE9uX+uȉt$|$EEȉ$N/E̋U<E̍KMȃ9]u<э\ ;UuD$Eȍ<$knEEEUȃUuԉMЉMċ}ԋ׹р| ,uU9UuPM̋}49]|2UԋD$4$0Mԋ<эt9]}E]ăEU9UuuԋMu=$]Au$/$]A}}wW+A8}t$`+A-}EpD$=4$.ÅuGD$+A4$.DD$D$ D$D$4$J%{@{u$+A^-\D$D$$,ED$ED$ D$D$$$ bAbAEbANN(&$4A0]A ]A" ]A]A]A$]AU$P,#-@ D$ D$D$$+A,$,]A,]A]A} ]AqD$l3A$@+$`,8]AL(]A@]A4]A(4]AM $+ED$3Aut$}̉<$,bAuD$3A$@+M)щM̃~aAD tSC]A]A<]A3uЉуMȃNMȸ3A9ɉ8u]Ai}NEȉD$D$3AEЉ$*u]AD$3AUЉ$pu]AD$3A$gpu]AiD$3A$Bpu]AD3ЃO‰D$D$3A4$9*}~~sCaAD tfUT$@T$ L$D$D$$ <]A}tD$D$3A$A4)m<]A]Au =]AtmuD$4A$@(u =]At }~aAD tSC=<]AD$&4A$nu$1Y=]At/D$*4A$nu\$ủ4$1!=]At/D$/4A$nu\$}̉<$=]At/D$/4A$Lnu\$Ẻ$D$3A$nu$-D$64A$mu\$Ủ$<]D$<4A$muD$$蹎0D$C4A$muD$$臎 <]A<D$K4A$`mu $"D$R4A$=mu$]A$D$X4A$muD$\$M̉ $D$]4A$luD$\$ủ4$D$f4A$ltD$l4A$lu}ԉ|$\$Ẻ$BID$*4A$mluD$\$Ủ$D$D$q4A$@%M $% \[^_]D$Ẽ $y7D$ D$GD$$D$$7AT$$7A~ $,~ ,[^_]UWVS]޹ 9rU u <,uU D$t$E $U ,ttD$7A$Ac,CtD$$8A ,CtD$$8A[]UWVS,uE EF}D$8A<$E D$U T$$qU  ,ttT$D$8A$A=vT$D$8A$A D}uftHCFf^,[^_]ËE D$D$8A$ANUS]U ZC?t?uC DB؃[]US]U C?t?uF DE؃[]ÐUWVS\EEȋUUMىMEEu}u }ۉ]؃} uu]E EE9}߉}܋E؉E}uUM F}!Uȉ]Ћ  ]  U)…]E9Es!}<;މ|$\$E$Us]܋UU܋E)9EY9]s]뾋MMЋE EÃ} `E EƉσ} (E EEEM}|$EЉD$U$Uy:MԉL$|$E$UxZUԉT$MЉL$}<$U}I}8EԉD$|$U$U MԉL$}Љ|$E$U}I}ԋUډUԋMىMىMĉ\$L$E$Uy:UԉT$\$M $UxZ]ԉ\$EĉD$U$U]I]8MԉL$\$E$U UԉT$MĉL$]$U]I]ԋEE+UUԉD$T$M $Uy4t$ED$U$UxPt$MԉL$E$UIu$9Ay$D$ 9AD$9AD$?$9AE t$EEEl9AE t+E9A"EEE9AE tEz9A~0} tUy$kȜ)EʉU̺E kddEʉU̺EE9AE u E9A}эL Mȃ9E L0u] +]d~ k uӃ΃MЉ]9]|b]9]9MrUEȋỦuu؋}܉t$|$ $T$ ;U |;Est~ʉEȉŰu EȉŰutCrEȋỦuЋu؋}܉t$|$ $T$9]~ ~߉EȉUEȉU̸}x} }v~E tyE9E Eȃ ƋED$ UZD$]\$T$D$9AEĉD$ D$9AE D$U$ ML$UZD$ML$EȋŨ2D$dD$ $T$׋Uĉ΋MωečD$ T$D$9AM L$]$i ؋]u}]ÐffffU D$:AD$ :A@ $ U D$:AD$ :A@ $ UWVS]u }څt7t0tuu u[^_]ÅuU8]u}}u Ek D$|$E$f ÉE 8u ;Et8t:A! U؉]u}]UX]u}p}}}ыUD E$ øIuf3CC S{}̋}ы}DC}щJB}z |$ẺD$U$G}щL$EED$U$t$\$$mFE$ øpEfCC }|$\$$F;CEԉE$Uԉ$EԸ}EUfBB |$T$$=F¸]ԃ{}Ћ{ EEȃ}tq} tkUUąt_D$E$n;}vD$:A$$:AmU:|$} |$EЉ$H}tH}׍GD$UT$Eȉ$UD:t<.}ȉ|$D$@:A4$XCtt@uVvUЋD$D$E:A4$%O}ЋD$D$J:A4$ 4UЋD$D$N:A4$}ЋD$D$S:A4$Cu"t$ D$ D$$W:Ayt$$ ;GEԉ$]u}]UH]u}}w4$cøttEC{CC |$UT$$8D$ED$D$D$t$ \$D$$CE$ Ɖ$]u}]UWVS<$øECSCC T$UT$$D$ED$|$\$|$ \$D$!$CE$3 NjCS D$T$E$;$e[^_]U(D$D$D$D$ D$D$$e:A u" D$D$:A$p:A_UE$?URD$:AD$:A@ $_ÐQL$=r -=w) ̋@PÐffffffU8}} MuU]uEȉщu܉Uu,9vX1҉ƋMt؃ڋ]u}]Ð119wЃUu`M9Mv9s1Ҿ븍u 11ÉډڃUdރEIMԉ¸ }+EԋuM ׉Mԉuu މӉe9r}M9r19u1UED$$aAU]ÐU]ÐU]ÐU]Ð%pbA%TbA%bA%bA%\bA%bA%bA%bA%bA%aA%DbA%bA%bA%bA%`bA%tbA%xbA%aA%bA%bA%bA%hbA%cA%bA%lbA%bA%bA%cA%bA%aA%PbA%bA%bA%aA%aA%cA%HbA%aA%$bA%bA%aA%aA%bA%|bA%dbA%aA%,bA%LbA%cA%bA%bA%aA%bA%aA%0bA%(bA%bA%aA%bA%bA%XbA%bA%8bA%4bA%bA%bA% bA%aA%bA% cA%aA%bA%cA%aA%A?A?AJAKAL AMAYA@A@"AA+AB6ACBADLAERAn\AngAooAm Al Al Ar ArwApApAqAqAwAFO AA AAAA A AAAAAAAAAAAAAAAA"AA'A1A4A?ACAGAKAOASA WA~ A`A AiAAAAAAAAAAAA A A A A A.A A A A݆@ADA5IANASAYA\AbAgAcrAd}AAA7A7A7AA A dA^A{A"A AAAAQ4*AG8*AH@*AIH*AJO*AKV*AL_*AMh*AYn*AZu*A[z*A[*AN*AO*AQ*AP*AX*AV*AW&!AR*AR!AS*A*A*A *A *A *A\*A\*A]*Am*Ap*Ap+Aq +Aqu&AT&AU+A9A9A9A"9A )9A,9A09A@79A>9AG9AT9A\9Acyggcc_s-1.dll__register_frame_infocyggcj-11.dll_Jv_RegisterClasses__deregister_frame_info, setup %s %s%s%s!%s%stablearg%u ip4 ip6 ip from any to anyany&/0123456789abcdefABCDEF:Incorrect MAC addressIncorrect mask lengthIncorrect mask%*llu %llu%05d(%ds) PARENT %d LIMIT STATE %s proto %u %s %d <-> %s %d UNKNOWN <-> UNKNOWNcallocreallocsocketport list: invalid separator <%c> in <%s>too many ports/ranges invalid flag %s0x%04x%d??? DEPRECATED: '%s' matched '%s' as a sub-stringDEPRECATED: '%s' matched '%s'metable(/:,{,{hostname ``%s'' unknownbad netmask ``%s''bad width ``%s''address set cannot be in a listinvalid set with mask %d set not closed incomplete range %d-addr %d out of range [%d-%d] invalid range %d-%ddouble '-' in rangenot any never matchesaddress list too long not%s lookup %s %d%s%s table(%u,%u%s/%d%c%d-%d:%s/%d any %02x:%02x:%02x:%02x:%02x:%02x&%02x:%02x:%02x:%02x:%02x:%02x... src-ip dst-ip src-ip6 dst-ip6 out inxmitrecvvia# DISABLED %05u %10u %s %*sset %d prob %f check-stateallowcountdenyresetrejectunreach %sunreach %ureset6skipto pipe queue divert tee netgraph ngtee fwd tableargfwd %s,%dnat nat globalsetfib reassreturncall ** unrecognized action %d len %d log logamount %d log untag tag from any to any // %s from { to proto %u MAC frag fib %u sockarg diverted diverted-loopback diverted-output diverted-?<%u> layer2 %s %s ipid %u ipttl %u ipver %u ipprecedence %u iplen %uipoptionsiptos icmptypes established tcpdatalen %utcpflagstcpoptions tcpwin %d tcpack %d tcpseq %d uid %s uid %u gid %s gid %u jail %d verrevpath versrcreach antispoof ipsec keep-state limit tagged [opcode %d len %d] or } // %s/@V0@.@0.@R.@c.@A.@/@/@-/@@/@S/@/@V0@/@$0@V0@V0@V0@V0@V0@u0@V0@V0@V0@V0@V0@V0@V0@V0@V0@V0@V0@V0@f/@y/@V0@.@s0@V0@0@V0@V0@20@4@1@1@1@1@S2@S2@S2@S2@3@3@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@:@4@4@4@4@:@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@1@S2@4@4@4@4@4@2@2@2@3@3@3@z3@9@:@:@:@:@:@:@:@:@:@:@:@.5@U5@&6@5@k5@76@76@76@7@Q7@6@7@17@6@7@8@;9@8@i8@8@8@8@7@8@9@9@:@9@9@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@9@:@:@9@9@:@5@.8@:@:@:@:@:@:@:@:@:@s:@:@:@:@:@:@:@:@|5@5@disableenable enableset needs commandshowgetsockopt(IP_FW_GET)%s %dswapset swap needs 2 set numbers invalid set number %s moveruletosyntax: set move [rule] X to Y invalid source number %s invalid dest. set %s invalid set number %d invalid set command %s cannot enable and disable the same set set enable/disable: setsockopt(IP_FW_DEL)missing keyword to enable/disable firewallnet.inet.ip.fw.enablenet.inet6.ip6.fw.enableone_passnet.inet.ip.fw.one_passdebugnet.inet.ip.fw.debugverbosenet.inet.ip.fw.verbosedyn_keepalivenet.inet.ip.fw.dyn_keepaliveunrecognize enable/disable keyword: %s DUMMYNETFWTesting only, list disabled getsockopt(IP_%s_GET)## Dynamic rules (%d): invalid rule number: %srule %lu does not exist## Dynamic rules:missing rule specificationsetinvalid syntaxrule %u not availablerule %u: setsockopt(IP_FW_DEL)illegal set %sprobillegal match prob. %smissing actionmissing reject codeunknown ICMP unreachable code ``%s''missing unreach codemissing argument for %sillegal argument for %sdivertillegal divert/tee portmissing forward address[:port]illegal forwarding port ``%s''missing fib numbernet.fibsfibs not suported. fib too large. invalid action %s log cannot be specified more than oncelogamountlogamount requires argumentlogamount must be positivenet.inet.ip.fw.verbose_limitsysctlbyname("%s")tag and untag cannot be specified more than once%s: missing argument%s: invalid argument: %s%s: argument is out of range (%u..%u): %s%s: illegal argument value: %snotdouble "not" not allowed missing protocolallipipv4ip4ipv6ip6invalid protocol ``%s''orinvalid OR block)}missing ")" frommissing ``from''nested "(" not allowed missing source addressme6bad source address %smissing ``to''missing dst addressbad destination address %sinvalid "or" block +nested "(" not allowed +missing ")" recv, xmit, via require interface name or address*?[bad ip address ``%s''icmptypes requires list of typesinvalid ICMP typeICMP type out of rangeipttl requires TTL-,invalid ipttl %sipid requires idinvalid ipid %siplen requires lengthinvalid ip len %sipver requires versionipprecedence requires valuemissing argument for ipoptionsmissing argument for iptosuid requires argumentuid "%s" nonexistentgid requires argumentgid "%s" nonexistentjail requires argumentjail requires prison IDtcpdatalen requires lengthinvalid tcpdata len %smissing argument for tcpoptionstcpseq/tcpack requires argumenttcpwin requires lengthmissing argument for tcpflagskeep-state cannot be part of an or blockonly one of keep-state and limit is allowedlimit cannot be part of an or blocklimit: missing limit maskmissing source IPmissing destination IPmissing source IP6missing destination IP6missing source portinvalid source port %smissing destination portinvalid destination port %sMAC dst srcmissing mac typeinvalid mac type %sflow-id filter is active only for ipv6 protocol comment too long (max 80 chars)tagged: invalid tag list: %sfib requires fib numberformat: lookup argument tablenumformat: cannot lookup on %sunrecognised option [%d] %s IP_FW_ADDgetsockopt(%s)dK@L@L@P@L@P@P@M@M@L@L@/N@L@wK@K@K@K@QK@L@O@M@O@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@O@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@xL@K@P@-O@Js@]@]@]@^@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@"p@o@Js@Js@Js@k@ok@l@Ul@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@tj@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@n@o@`@n@l@k@n@Js@Js@q@Js@xr@Wr@rt@rt@Yt@rt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@rt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@rt@RESETLOGZEROAccounting clearedLogging counts resetclearedlogging count resetsetsockopt(IP_FW_%s)%s. invalid rule number %s rule %u: setsockopt(IP_FW_%s)Entry %d %s. invalid rule number ``%s''pipesrulesAre you sure? [yn] setsockopt(IP_FW_DEL)setsockopt(IP_%s_FLUSH)Flushed all %s. ADDDELnet.inet.ip.fw.tables_maxWarn: Failed to get the max tables number via sysctl. Using the compiled in defaults. The reason wastable number or 'all' keyword requiredThe table number exceeds the maximum allowed value (%d)table needs commandlistflushtable number requiredadddeleteIP address requiredsetsockopt(IP_FW_TABLE_%s)setsockopt(IP_FW_TABLE_ADD)setsockopt(IP_FW_TABLE_FLUSH)getsockopt(IP_FW_TABLE_GETSIZE)getsockopt(IP_FW_TABLE_LIST)---table(%d)--- %s/%u %s %s/%u %u invalid table command %sacceptpasspermitpipequeueteenetgraphngteefwdforwardskiptodropunreach6unreach//natsetfibcallaltqlogtaguntagtaggeduidgidjailinlimitkeep-statebridgedlayer2outdiverteddiverted-loopbackdiverted-outputfragmentfragfibipoptsiplenipidipprecedencedscpipttlipversionipverestabestablishedsetupsockargtcpdatalentcpflgstcpoptstcpseqtcpacktcpwinicmptypeicmptypesdst-ipsrc-ipdst-portsrc-portprotoMACmacmac-typeverrevpathversrcreachantispoofipsecicmp6typeicmp6typesext6hdrflow-iddst-ipv6dst-ip6src-ipv6src-ip6lookup!|{(ssrrlsrrrrtsip optionlowdelaythroughputreliabilitymincostcongestionecntransportip tos optionmssmaxsegwindowsacktimestampcctcp optionsynfinackpshrsturgtcp flagsrc-addrdst-addrJKLM "3nethostprotocolportneedfragsrcfailnet-unknownhost-unknownisolatednet-prohibhost-prohibtosnettoshostfilter-prohibhost-precedenceprecedence-cutoffarprarpvlanlooptrailatatalkaarppppoe_discpppoe_sessipx_8022ipx_8023ipx_iiipx_snapipxnsAinvalid number: %squeue, mask: %s 0x%02x 0x%08x/0x%04x -> 0x%08x/0x%04x mask: %sproto: 0x%02x, flow_id: 0x%08x, %s/0x%04x -> %s/0x%04x invalid oid len %d unrecognized object %d size %d Children flowsets: %u answer for cmd %d, len %d sched %d type %s flags 0x%x %d buckets %d active BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte DrpBKT ___Prot___ _flow-id_ ______________Source IPv6/port_______________ _______________Dest. IPv6/port_______________ Tot_pkt/bytes Pkt/Byte Drp%3u%c%-4s %4u %15s/%-5d %9s %9u %7d %39s/%-5d %39s/%-5d %2u %4u %3u %7.3f Mbit/s%7.3f Kbit/s%7.3f bit/s %d%05d: %s %4d ms burst %s%d KB%d B%3d sl.plr %f %cRED w_q %f min_th %d max_th %d max_p %f%s %s%s %d queues (%d buckets) %s q%05d %s%s %d flows (%d buckets) sched %d weight %d lmax %d pri %d %s profile: name "%s" loss %f samples %d duplicate token, override bandwidth value!no if supportinterface name truncatedBit/sBibytesbybandwidth too largerfopen: %s error in %s at line %d: "too many arguments"error in %s at line %d: "missing arg for %s"sampleserror in %s at line %d: "duplicate ``samples'' line"error in %s at line %d: "invalid number of samples"error in %s at line %d: "too many samples, maximum is %d"bwloss-levelerror in %s at line %d: "duplicated token: %s"error in %s at line %d: "invalid %s"error in %s at line %d: "%s greater than 1.0"namedelayproberror in %s at line %d: "invalid point found"error in %s at line %d: "probability greater than 1.0"error in %s at line %d: "unrecognised command '%s'"'%s' not found, assuming 100'%s' not found, assuming no loss%s too few samples, need at least %drule %u: setsockopt(IP_DUMMYNET_DEL)need a pipe/flowset/sched numbernoerror is only for pipesplr is only for pipesplr needs argument 0..1 queue is only for pipes or flowsetsqueue needs queue size buckets is only for pipes or flowsetsbuckets needs argument tok_maskmask needs mask specifier mask: value missingport mask must be 16 bitflow_id mask must be 20 bitin6addr invalid mask lenproto mask must be 8 bitred/gred needs w_q/min_th/max_th/max_p /0 < w_q <= 10 < max_p <= 1droptail is only for flowsetsbw is only for linksbw needs bandwidth or interface delay is only for linksdelay needs argument 0..10000ms type is only for schedulerstype needs a stringtype %s too long weight is only for flowsetsweight needs argument lmax is only for flowsetslmax needs argument priority is only for flowsetspriority needs argument pipe/schedpipe/link/sched needs number profile already setprofileextra delay needs the file name burstburst needs argument burst: invalid argumentburst: out of range (0..2^48-1)unrecognised option ``%s''delay must be < 10000net.inet.ip.dummynet.pipe_byte_limitqueue size must be < %ldBnet.inet.ip.dummynet.pipe_slot_limit2 <= queue size <= %ldmin_th %d must be < than max_th %dmax_th must be > 0net.inet.ip.dummynet.red_lookup_depthnet.inet.ip.dummynet.red_lookup_depth must be greater than zeronet.inet.ip.dummynet.red_avg_pkt_sizenet.inet.ip.dummynet.red_avg_pkt_size must be greater than zeroIP_DUMMYNET_CONFIGUREsetsockopt(%s)@@Ø@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2@ @s@@@@@@ՙ@ՙ@ՙ@@@a@@@@g@@٠@;@@L@plrnoerrorbucketsdst-ipsrc-ipdst-portsrc-portprotoweightlmaxmaxlenallmasksched_maskflow_maskdroptailredgredbandwidthlinkpipequeueflowsetschedpriprioritytypeflow-iddst-ipv6dst-ip6src-ipv6src-ip6dummynet-params$tIzDA7?G, sysctlsysctl emulation usage: ipfw sysctl name[=value] ipfw sysctl -a-aipfw sysctl: missing value ipfw syntax summary (but please do read the ipfw(8) manpage): ipfw [-abcdefhnNqStTv] where is one of the following: add [num] [set N] [prob x] RULE-BODY {pipe|queue} N config PIPE-BODY [pipe|queue] {zero|delete|show} [N{,N}] nat N config {ip IPADDR|if IFNAME|log|deny_in|same_ports|unreg_only|reset| reverse|proxy_only|redirect_addr linkspec| redirect_port linkspec|redirect_proto linkspec} set [disable N... enable N...] | move [rule] X to Y | swap X Y | show set N {show|list|zero|resetlog|delete} [N{,N}] | flush table N {add ip[/bits] [value] | delete ip[/bits] | flush | list} table all {flush | list} RULE-BODY: check-state [PARAMS] | ACTION [PARAMS] ADDR [OPTION_LIST] ACTION: check-state | allow | count | deny | unreach{,6} CODE | skipto N | {divert|tee} PORT | forward ADDR | pipe N | queue N | nat N | setfib FIB | reass PARAMS: [log [logamount LOGLIMIT]] [altq QUEUE_NAME] ADDR: [ MAC dst src ether_type ] [ ip from IPADDR [ PORT ] to IPADDR [ PORTLIST ] ] [ ipv6|ip6 from IP6ADDR [ PORT ] to IP6ADDR [ PORTLIST ] ] IPADDR: [not] { any | me | ip/bits{x,y,z} | table(t[,v]) | IPLIST } IP6ADDR: [not] { any | me | me6 | ip6/bits | IP6LIST } IP6LIST: { ip6 | ip6/bits }[,IP6LIST] IPLIST: { ip | ip/bits | ip:mask }[,IPLIST] OPTION_LIST: OPTION [OPTION_LIST] OPTION: bridged | diverted | diverted-loopback | diverted-output | {dst-ip|src-ip} IPADDR | {dst-ip6|src-ip6|dst-ipv6|src-ipv6} IP6ADDR | {dst-port|src-port} LIST | estab | frag | {gid|uid} N | icmptypes LIST | in | out | ipid LIST | iplen LIST | ipoptions SPEC | ipprecedence | ipsec | iptos SPEC | ipttl LIST | ipversion VER | keep-state | layer2 | limit ... | icmp6types LIST | ext6hdr LIST | flow-id N[,N] | fib FIB | mac ... | mac-type LIST | proto LIST | {recv|xmit|via} {IF|IPADDR} | setup | {tcpack|tcpseq|tcpwin} NN | tcpflags SPEC | tcpoptions SPEC | tcpdatalen LIST | verrevpath | versrcreach | antispoof An absolute pathname must be used with -p option.abcdefhinNp:qs:STtvbad arguments, for usage summary ``ipfw''natpipequeueflowsetschedsetinvalid set number %s missing commandaddshowconfigtableenabledisabledeleteflushzeroresetlogprintlistbad command `%s'"@@@@@_@w@@@@@@@@@@@@@@p@@@@@@Ŭ@@@@@@@@:@.@@N@k@@@no filename argumentcfNnp:qSextraneous filename arguments %srfopen: %scannot create pipecannot forkdup2()execvp(%s) failedfdopen()Line %dwaitpid()preprocessor exited with status %dpreprocessor exited with signal %d@c@c@c@c@W@c@c@c@c@c@c@c@c@c@c@c@c@c@c@c@׳@c@c@@c@c@c@c@c@c@c@@c@ @K@pathname: %susage: ipfw [options] do "ipfw -h" or "man ipfw" for detailsanymeme6/,bad width "%s''not any never matchesaddress list too longbad address "%s"unknown ICMPv6 unreachable code ``%s''unreach6 %sunreach6 %u not%s%s ip6%sError ntop in print_ip6:%s/%dinvalid ICMP6 typeICMP6 type out of range ip6 icmp6types%c%d flow-id %d%c,invalid option for ipv6 exten header extension header:%cfragmentation%chop options%crouting options%crthdr0%crthdr2%cdestination options%cauthentication header%cencapsulated security payloadinvalid ipv6 flow number %sflow number out of range %sfraghopoptroutedstoptahesprthdr0rthdr2no-routeadmin-prohibaddressportbkmgtpekMGTPEBKMGTPEKMGTPEBkMGTPE buf != NULLhumanize_number.csuffix != NULLscale >= 0.%d%s%d%s%s%s%lld%s%s%shumanize_number%s unsupported invalid%s error: buffer too small %s: %li %u %lu %i (read only) \\.\Ipfw%s failed %u, cannot talk to kernel module %s empty ether_atonmy_socketsysctlbynameipfw_config_natipfw_show_nat| ,@NAB FOU AB <`iaa4ic4cDcTc`cpc|ccccccccccdddd$d,d@dTdddldtd|dddddddddddddee e4eHeTedeteeeeeeeeeeeeefff$f0f@fLfXfhftffffffffffffggg(g4g@gLgTg\gjg|ggg4cDcTc`cpc|ccccccccccdddd$d,d@dTdddldtd|dddddddddddddee e4eHeTedeteeeeeeeeeeeeefff$f0f@fLfXfhftffffffffffffggg(g4g@gLgTg\gjg|ggg__assert_func__ctype_ptr____errno5__getreent<__main_dll_crt0@0_fdopen64_fopen64J_getgrgid32L_getgrnam32\_getpwuid32p_impure_ptrabortaccessatofatoibcopycalloc close)ctimeCcygwin_detach_dllEcygwin_internalZdll_dllcrt0gdup2errerrxexecvpexitfclosefflushfgetsfilenoforkfprintffputcfreefwrite getc3gethostbyaddr4gethostbynameAgetoptNgetprotobynameOgetprotobynumberTgetpwnam[getservbyname\getservbyportinet_atoninet_ntoainet_ntopinet_ptonisattykillmallocmemcpyToptargVoptindXoptreset]pipepprintfputcharputsqsortrealloccsetserventsnprintfsprintfstrcasecmpstrcatstrchrstrcmpstrcpystrdupstrncmpstrncpystrpbrkstrrchrstrsepstrspnstrtodstrtoimaxstrtolstrtollstrtoul tolowertoupperMwaitpidNwarnOwarnxCreateFileADeviceIoControlGetLastErrorGetModuleHandleAAGetProcAddress````````````````````````````````````````````````````````````````````````````````````````cygwin1.dll`````KERNEL32.dll@Q@1'@N`@"N@0 @ @ @ P@ *`@/@0@ 2@3!Q1mainCRTStartup'zV__divdi3cygwin_crt0"Ncygwin_premain0"0 cygwin_premain1" cygwin_premain2" cygwin_premain3U =_cygwin_crt0_commonenviron_fmode__cygwin_cxx_malloc]*]_cygwin_dll_entry_cygwin_noncygwin_dll_entry__dynamically_loaded,/_pei386_runtime_relocator0DllMain$2cygwin_attach_dll2C __CTOR_LIST__ __DTOR_LIST__QU'zSItypeUSItypeDItypeUDItype DWstructZDWunionLMainFunc  =Q_LOCK_Tn_off64_t~_fpos_t_fpos64_t_ssize_twint_t)_flock_t9ptrdiff_tJsize_t{__gnuc_va_listva_liststraceDWORDWINBOOL0BOOLE__ULongT_Bigint__tm_on_exit_args_atexitp__sbufS __sFILE64"__FILE1_glue_rand48_reentLPVOIDHANDLE_SECURITY_ATTRIBUTESSECURITY_ATTRIBUTESDHINSTANCE__gHINSTANCEHMODULE^per_processcallbackMTinterface:MainFuncpnothrow_tper_process_cxx_mallocB*DWORDOHINSTANCE__rHINSTANCEVARENUMV0DWORDWINBOOLBOOLfLPVOIDHINSTANCE__HINSTANCEU2DWORDU_LOCK_Tf_off64_tv_fpos_t_fpos64_t_ssize_twint_t_mbstate_t(_flock_t8__ULongG_Bigint__tm_on_exit_args_atexitd__sbuf'__sFILE64__FILE _glueV _rand48_reent size_t HINSTANCE__ HINSTANCE HMODULE per_processMainFuncSC {ix86_tune_indicesix86_arch_indicesVARENUM| func_ptrMGNU C 4.5.3 20110428 (Fedora Cygwin 4.5.3-4)/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/crt0.c@@charlong unsigned intintunsigned charshort unsigned intfloatlong intunsigned intsigned charshort intlong long intlong long unsigned intmainCRTStartup@@0n@@/gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3/libgcc/../gcc/config/i386/cygwin.asm/gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/build/i686-pc-cygwin/libgccGNU AS 2.21.90vDGNU C 4.5.3/gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3/libgcc/../gcc/libgcc2.c/gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/build/i686-pc-cygwin/libgcc@^@intunsigned intshort unsigned intcharsigned charunsigned charshort intlong long intlong long unsigned intlong intlong unsigned intfloatdoubleSItypeUSItypeDItype'UDItype8complex floatcomplex double long doublecomplex long doubleDWstruct;low#high#Zs llDWunion; __udivmoddi4`K n` d` rp`K nnbQ ddcQ rrdZ d0e d1e n0e n1e n2e q0f q1f bg bmg ww0Q m1 m0 Z__divdi37@^@8u7v7c9 uu:Z vv;Zw<jD@E A(yP L:'@^@3b>mGNU C 4.5.3 20110428 (Fedora Cygwin 4.5.3-4)/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/lib/cygwin_crt0.c`@@charlong unsigned intintunsigned charshort unsigned intfloatlong intunsigned intsigned charshort intlong long intlong long unsigned intdoubleMainFunc\b|||<cygwin_crt0`@@fLGNU C 4.5.3 20110428 (Fedora Cygwin 4.5.3-4)/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/lib/premain0.c@@wcygwin_premain0 @@argc argv intchar"GNU C 4.5.3 20110428 (Fedora Cygwin 4.5.3-4)/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/lib/premain1.c@@cygwin_premain1 @@argc argv intcharnGNU C 4.5.3 20110428 (Fedora Cygwin 4.5.3-4)/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/lib/premain2.c@@Ocygwin_premain2 @@/argc argv intcharGNU C 4.5.3 20110428 (Fedora Cygwin 4.5.3-4)/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/lib/premain3.c@@cygwin_premain3 @@gargc argv intchar9GNU C++ 4.5.3 20110428 (Fedora Cygwin 4.5.3-4)/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/lib/_cygwin_crt0_common.cc/usr/src/debug/cygwin-1.7.16-1/i686-pc-cygwin/winsup/cygwinP@\@'signed charunsigned charshort intshort unsigned intintunsigned intlong long intlong long unsigned int_LOCK_T`long int_off64_t$&_fpos_t,b_fpos64_t2n_ssize_t8wint_t`D_mbstate_tG__wchH__wchbI __countE# __valueJ# ) _flock_tOQptrdiff_tsize_tlong unsigned int schar__gnuc_va_list( __builtin_va_listsva_listf{%_active(# version-# lmicrosec.# execing/# vsprntf&_ZN6strace7vsprntfEPcPKcS2_S0__mwrite'_ZN6strace5writeEjPKciactivate*_ZN6strace8activateEb+microseconds,_ZN6strace12microsecondsEv dll_info0_ZN6strace8dll_infoEvOprntf1_ZN6strace5prntfEjPKcS1_zvprntf2_ZN6strace6vprntfEjPKcS1_Pcwm3_ZN6strace2wmEiii write_childpid4_ZN6strace14write_childpidEmKXattached5_ZNK6strace8attachedEvactive6_ZNK6strace6activeEvactive_val7_ZN6strace10active_valEvbool  s DWORDXWINBOOL BOOLfloat__ULongX_Bigint- _next.# _k/# _maxwds/# _sign/# _wds/# _x0# T X __tm$5 __tm_sec6# __tm_min7# __tm_hour8# __tm_mday9# __tm_mon:# __tm_year;# __tm_wday<# __tm_yday=# __tm_isdst># G _fnargsH# _dso_handleI# _fntypesKE# _is_cxaNE# ` _atexitYS _nextZS# _ind[# _fns]Y#^#  ji  i__sbufi _basej# _sizek#  `m !_reent@E "b #d $_unused_rande#$_strtok_lastfm#$_asctime_bufg#$_localtime_bufh#$$_gamma_signgami#H$_rand_nextj7#P$_r48k#X$_mblen_statel#h$_mbtowc_statem#p$_wctomb_staten#x$_l64a_bufo#$_signal_bufp#$_getdate_errq#$_mbrlen_stater#$_mbrtowc_states#$_mbsrtowcs_statet#$_wcrtomb_stateu#$_wcsrtombs_statev#$_h_errnow##} $_nextf#$_nmalloc#x%_reentx%_unused $_errnoF#$_stdinK{#$_stdoutK{#$_stderrK{# $_incM#$_emergencyN%#$_current_categoryP#0$_current_localeQ#4$__sdidinitS#8$__cleanupUF#<$_resultXL#@$_result_kY#D$_p5sZL#H$_freelist[R#L$_cvtlen^#P$_cvtbuf_m#T$_new#X$_atexitX#$_atexit0#$_sig_funci#$__sglue1#$__sfu#   `  ~ `~  - `  C  S __sFILE64p _p# _r# _w# _flags# _file# _bfp# _lbfsize# _data# _cookie`# _read #$ _write #( _seek #, _close- #0 _ubp#4 _up#< _ur#@ _ubuf3 #D _nbufC #G$_lbp#H$_blksize#P$_flags2#T$_offsetn#X$_seek64#`$_lock )#d$_mbstate #h ` __FILES &_glue u$_nextu#$_niobs#$_iobs{# 1 "&_rand481$_seed2#$_mult3#$_add4#   s  s  s    %  s5 '@@  5 T L 'i o ^ S  LPVOID V`wchar_tHANDLE `&_SECURITY_ATTRIBUTES $nLength #$lpSecurityDescriptor #$bInheritHandle 0#SECURITY_ATTRIBUTES  XD &HINSTANCE__g$i#HINSTANCEy DHMODULE g m( ^cygwin_getinfo_types^)CW_LOCK_PINFO)CW_UNLOCK_PINFO)CW_GETTHREADNAME)CW_GETPINFO)CW_SETPINFO)CW_SETTHREADNAME)CW_GETVERSIONINFO)CW_READ_V1_MOUNT_TABLES)CW_USER_DATA)CW_PERFILE )CW_GET_CYGDRIVE_PREFIXES )CW_GETPINFO_FULL )CW_INIT_EXCEPTIONS )CW_GET_CYGDRIVE_INFO )CW_SET_CYGWIN_REGISTRY_NAME)CW_GET_CYGWIN_REGISTRY_NAME)CW_STRACE_TOGGLE)CW_STRACE_ACTIVE)CW_CYGWIN_PID_TO_WINPID)CW_EXTRACT_DOMAIN_AND_USER)CW_CMDLINE)CW_CHECK_NTSEC)CW_GET_ERRNO_FROM_WINERROR)CW_GET_POSIX_SECURITY_ATTRIBUTE)CW_GET_SHMLBA)CW_GET_UID_FROM_SID)CW_GET_GID_FROM_SID)CW_GET_BINMODE)CW_HOOK)CW_ARGV)CW_ENVP)CW_DEBUG_SELF)CW_SYNC_WINENV )CW_CYGTLS_PADSIZE!)CW_SET_DOS_FILE_WARNING")CW_SET_PRIV_KEY#)CW_SETERRNO$)CW_EXIT_PROCESS%)CW_SET_EXTERNAL_TOKEN&)CW_GET_INSTKEY')CW_INT_SETLOCALE()CW_CVT_MNT_OPTS))CW_LST_MNT_OPTS*)CW_STRERROR+)CW_CVT_ENV_TO_WINENV,)CW_ALLOC_DRIVE_MAP-)CW_MAP_DRIVE_MAP.)CW_FREE_DRIVE_MAP/per_process  initial_sp m# magic_biscuit X#$dll_major X#$dll_minor X# $impure_ptr_ptr #$envptr #$malloc #$free -#$realloc G# $fmode_ptr *#$$main f#($ctors l#,$dtors l#0$data_start `#4$data_end `#8$bss_start `#<$bss_end `#@$calloc #D$premain #H$run_ctors_p #X$unused #\$cxx_malloc "#x$hmodule $#|$api_major &#$api_minor '#$unused2 *4#$pseudo_reloc_start +`#$pseudo_reloc_end ,`#$image_base -`#$threadinterface 0#$impure_ptr 4#   `J  '-` " `G`J 3 f M j `JJ r  ' ^  X per_process_cxx_malloc  oper_new # oper_new__ # oper_delete -# oper_delete__ -# oper_new_nt # oper_new___nt # oper_delete_nt # oper_delete___nt # &MTinterface $concurrency #$threadcount b#$pthread_prepare 4#$pthread_child 4# $pthread_parent 4#*Init _ZN11MTinterface4InitEvj*fixup_before_fork _ZN11MTinterface17fixup_before_forkEv+fixup_after_fork _ZN11MTinterface16fixup_after_forkEv ,callback .$cb j#$next .#  MainFunc f-stdp.39.4J/nothrow_t0cE `Jp x'` 1_cygwin_crt0_commonE_cygwin_crt0_common@8P@\@92fE:3uE94P5newuG95uwasnullHA ^6:7_impure_ptr)8_data_start__+s8_data_end__+s8_bss_start__+s8_bss_end__+s8__CTOR_LIST__,j8__DTOR_LIST__-j9CYGTLS_PADSIZE1:_tlsbase*%fs:4m8sec_none_nih;cw_std_maskL7hProcImpToken 7__dynamically_loaded,# *G _fnargsH# _dso_handleI# _fntypesK8# _is_cxaN8# d _atexitYF _nextZF# _ind[# _fns]L#*^# ^\ \ __sbufi _basej# _sizek#d_reent@D_errnoF#_stdinKP #_stdoutKP #_stderrKP # _incM#_emergencyN/ #_current_categoryP#0_current_localeQ#4__sdidinitS#8__cleanupUK #<_resultX#@_result_kY#D_p5sZ#H_freelist[Q #L_cvtlen^#P_cvtbuf_#T_new #X_atexitF#_atexit0#_sig_funcc #__sglue #__sfo #dvdvd   ' __sFILE64p _p# _r# _w# _flags# _file# _bfd# _lbfsize# _data# _cookied# _read#$ _write#( _seek#, _close#0 _ubd#4 _up#< _ur#@ _ubuf#D _nbuf#G_lbd#H_blksize#P_flags2#T_offsetf#X_seek64#`_lock (#d_mbstate #hd__FILE'_glue J _nextJ #_niobs#_iobsP # _rand481 _seed2 #_mult3 #_add4# c _unused_rande#_strtok_lastf#_asctime_bufg #_localtime_bufh#$_gamma_signgami#H_rand_nextj;#P_r48kV #X_mblen_statel#h_mbtowc_statem#p_wctomb_staten#x_l64a_bufo #_signal_bufp #_getdate_errq#_mbrlen_stater#_mbrtowc_states#_mbsrtowcs_statet#_wcrtomb_stateu#_wcsrtombs_statev#_h_errnow#   | _nextf #_nmalloc #x    a/ _reentx _unused ? K ? c i W  size_tHINSTANCE__ i#HINSTANCE  HMODULE   per_process initial_sp# magic_biscuit#dll_major#dll_minor# impure_ptr_ptr#envptr#malloc#free #realloc # fmode_ptr #$main#(ctors#,dtors#0data_startd#4data_endd#8bss_startd#<bss_endd#@calloc#Dpremain!#Hrun_ctors_p#XunusedS#\cxx_malloc"|#xhmodule$ #|api_major&#api_minor'#unused2* #pseudo_reloc_start+d#pseudo_reloc_end,d#image_base-d#threadinterface2d#impure_ptr4#d ddd ^d   M1 GG 1 c per_process_cxx_malloccMainFunccygwin_attach_dll@@h fu @\A  GNU C 4.5.3/gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3/libgcc/../gcc/libgcc2.c/gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/build/i686-pc-cygwin/libgcc0@0@ intunsigned intshort unsigned intcharsigned charunsigned charshort intlong long intlong long unsigned intlong intlong unsigned intsix86_tune_indicesX86_TUNE_USE_LEAVEX86_TUNE_PUSH_MEMORYX86_TUNE_ZERO_EXTEND_WITH_ANDX86_TUNE_UNROLL_STRLENX86_TUNE_DEEP_BRANCH_PREDICTIONX86_TUNE_BRANCH_PREDICTION_HINTSX86_TUNE_DOUBLE_WITH_ADDX86_TUNE_USE_SAHFX86_TUNE_MOVXX86_TUNE_PARTIAL_REG_STALL X86_TUNE_PARTIAL_FLAG_REG_STALL X86_TUNE_USE_HIMODE_FIOP X86_TUNE_USE_SIMODE_FIOP X86_TUNE_USE_MOV0 X86_TUNE_USE_CLTDX86_TUNE_USE_XCHGBX86_TUNE_SPLIT_LONG_MOVESX86_TUNE_READ_MODIFY_WRITEX86_TUNE_READ_MODIFYX86_TUNE_PROMOTE_QIMODEX86_TUNE_FAST_PREFIXX86_TUNE_SINGLE_STRINGOPX86_TUNE_QIMODE_MATHX86_TUNE_HIMODE_MATHX86_TUNE_PROMOTE_QI_REGSX86_TUNE_PROMOTE_HI_REGSX86_TUNE_ADD_ESP_4X86_TUNE_ADD_ESP_8X86_TUNE_SUB_ESP_4X86_TUNE_SUB_ESP_8X86_TUNE_INTEGER_DFMODE_MOVESX86_TUNE_PARTIAL_REG_DEPENDENCYX86_TUNE_SSE_PARTIAL_REG_DEPENDENCY X86_TUNE_SSE_UNALIGNED_MOVE_OPTIMAL!X86_TUNE_SSE_SPLIT_REGS"X86_TUNE_SSE_TYPELESS_STORES#X86_TUNE_SSE_LOAD0_BY_PXOR$X86_TUNE_MEMORY_MISMATCH_STALL%X86_TUNE_PROLOGUE_USING_MOVE&X86_TUNE_EPILOGUE_USING_MOVE'X86_TUNE_SHIFT1(X86_TUNE_USE_FFREEP)X86_TUNE_INTER_UNIT_MOVES*X86_TUNE_INTER_UNIT_CONVERSIONS+X86_TUNE_FOUR_JUMP_LIMIT,X86_TUNE_SCHEDULE-X86_TUNE_USE_BT.X86_TUNE_USE_INCDEC/X86_TUNE_PAD_RETURNS0X86_TUNE_EXT_80387_CONSTANTS1X86_TUNE_SHORTEN_X87_SSE2X86_TUNE_AVOID_VECTOR_DECODE3X86_TUNE_PROMOTE_HIMODE_IMUL4X86_TUNE_SLOW_IMUL_IMM32_MEM5X86_TUNE_SLOW_IMUL_IMM86X86_TUNE_MOVE_M1_VIA_OR7X86_TUNE_NOT_UNPAIRABLE8X86_TUNE_NOT_VECTORMODE9X86_TUNE_USE_VECTOR_FP_CONVERTS:X86_TUNE_USE_VECTOR_CONVERTS;X86_TUNE_FUSE_CMP_AND_BRANCH<X86_TUNE_OPT_AGU=X86_TUNE_LAST>ix86_arch_indicesX86_ARCH_CMOVEX86_ARCH_CMPXCHGX86_ARCH_CMPXCHG8BX86_ARCH_XADDX86_ARCH_BSWAPX86_ARCH_LASTfloatdoubleVARENUMs3 VT_EMPTYVT_NULLVT_I2VT_I4VT_R4VT_R8VT_CYVT_DATEVT_BSTRVT_DISPATCH VT_ERROR VT_BOOL VT_VARIANT VT_UNKNOWN VT_DECIMALVT_I1VT_UI1VT_UI2VT_UI4VT_I8VT_UI8VT_INTVT_UINTVT_VOIDVT_HRESULTVT_PTRVT_SAFEARRAYVT_CARRAYVT_USERDEFINEDVT_LPSTRVT_LPWSTRVT_RECORD$VT_INT_PTR%VT_UINT_PTR&VT_FILETIMEVT_BLOBVT_STREAMVT_STORAGEVT_STREAMED_OBJECTVT_STORED_OBJECTVT_BLOB_OBJECTVT_CFVT_CLSIDVT_BSTR_BLOBVT_VECTOR VT_ARRAYVT_BYREFVT_RESERVEDVT_ILLEGALVT_ILLEGALMASKEDVT_TYPEMASKcomplex floatcomplex double long doublecomplex long doublefunc_ptr+u |  __CTOR_LIST__ P@ __DTOR_LIST__ \@% $ > .? : ; @%% $ > : ; I : ; : ;I8  : ; : ;I: ;I .: ;' I  : ;I 4: ;I   I&I.? : ;' I@: ;I 4: ;I1RUX Y1 U414141  % $ >  I: ; I' II.? : ; ' @: ; I % .? : ; ' @: ; I $ >  I% .? : ; ' @: ; I $ >  I% .? : ; ' @: ; I $ >  I% .? : ; ' @: ; I $ >  I% $ > : ; I : ;I : ;  : ;  : ; I : ; I8 I !I/  I  I : ;  : ; I8 2 .? : ; @I2 < I4 I.? : ; @2 < .? : ; @< .? : ; < .? : ; @I< .? : ; @I< &I I : ;  : ;  : ;  : ; I8  I! : ;" : ;# : ;$ : ;I8 % : ;I& : ;'( : ; )( *.? : ;@< +.? : ;@< , : ;-9: ; .: ; /< 0G : ; 1.? : ; @I@2: ; I 3: ; I4 U54: ; I64: ; I? < 74: ; I? < 84: ;I? < 94: ; I:4: ; @I? < ;4: ; I <4: ; I?  % $ > : ; I  I : ; : ;I8 : ;I  : ;  ( .: ; ' I@ : ; I .? : ; @' I@4: ; I4: ; I 4: ; I? < 4: ; I?  % .? : ; @% $ > : ; I  : ; : ;I8 : ;I I .? : ; @I@ : ; I % $ > : ; I I : ;I : ;  : ; I I !I/  : ;  : ; I8  : ;  : ;  : ;  : ; I8 ' ' II : ; : ;I8 &I : ; : ; : ; : ;I' < .? : ; ' I@: ; I 4: ; I % $ > '  I : ; (  : ;: ; I I !I/ 4: ;I?  jJ /usr/src/debug/cygwin-1.7.16-1/winsup/cygwincrt0.c@i?x /gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3/libgcc/../gcc/config/i386cygwin.asm@%!KY1g=YY1/>///A!x /gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3/libgcc/../gcclibgcc2.clibgcc2.h@tB+,yi~- .z.y.= <0Nk<.Kw= KW=qsTdZ:?;gI0-/KH>>EMqL=w_ /usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/libcygwin_crt0.ccrt0.h`@gYhR /usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/libpremain0.c@ =hR /usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/libpremain1.c@ =hR /usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/libpremain2.c@ =hR /usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/libpremain3.c@ =0| /usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/lib/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/include/sys/usr/src/debug/cygwin-1.7.16-1/newlib/libc/include/sys/usr/lib64/gcc/i686-pc-cygwin/4.5.3/include/usr/src/debug/cygwin-1.7.16-1/winsup/w32api/include/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/usr/lib64/gcc/i686-pc-cygwin/4.5.3/include/c++._cygwin_crt0_common.cclock.h_types.hstddef.hstdarg.hstrace.hwindef.hreent.hwinnt.hcygwin.hcygwin-cxx.hthread.hcrt0.hcstddefwinsup.hcygtls.hsecurity.hcygwait.hglobals.hnewP@gfX.wu t<i /usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/lib/usr/src/debug/cygwin-1.7.16-1/winsup/w32api/includedll_main.ccwindef.hwinnt.h@ pX.{ /usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/lib/usr/src/debug/cygwin-1.7.16-1/winsup/w32api/include/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/include/sys/usr/src/debug/cygwin-1.7.16-1/newlib/libc/include/sys/usr/lib64/gcc/i686-pc-cygwin/4.5.3/includecygwin_attach_dll.cwindef.hlock.h_types.hstddef.hreent.hcygwin.hcrt0.h@v:>=;q@ /gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3/libgcc/../gcc/config/i386/usr/i686-pc-cygwin/bin/../include/w32api/gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3/libgcc/../gcci386.hwtypes.hlibgcc2.cgbl-ctors.h| @AB  | ,4@NAB FOU AB | x`@"AB | @AB A | @AB A |  @AB A | @@AB A | (tP@ AB E AA C | `@*AB f 4@AB g F N E A C N p@ AB D | @@AB A | t@ AG A |  @3AB Dg strace_on_exit_args__dynamically_loaded_on_exit_argsttutttmumntnptpNu,0,\ N\W]PRboPR40N04LRQorRQRQ4RVWotVWVW<RXoXQXVNX<JPoPPR/W<HToTTTNTL$<RWoSSRS%V%(R(NS!R1P%(P(DVDGvGNVHR0PSxLO'NLO'(;R@DR(DPtt"uttutttutttutttutttut u}SP SPPP"01tt)u)*t01t13t3ZuZ`t`ututu t0Y1Y]P]w1wP1P 1ttutttuttt u ttt.u.3t4RNpUW4RNpUW .filegcrt0.c  .text.data.bss 0 Q n 48% .file-gcygming-crtbegin.c$_obj8JF \  .text.data.bss.rdata_t.jcrJ.filepgipfw2.c~p       2 _pr_u64K     _do_cmd %  2m  =J  Y  e  r  ~ X  >  _fill_ip  f  *`3    '@2_f_iptos <`GTt+ g\0 |2 _n2mask7 +&8 9      #f "h i .textpMn.data.bss  .rdata@ ".filegdummynet.c"o _o_nexto , p <Ip Ikq Ur `r lwz }z 7|   ?  .texto(a.data0%.bss .rdata,DW.filegmain.c  _main .textB.data .bss .rdataH; M.filegipv6.c0  ,8 M7 X, i {n   ׯ  ±  .text0 g.data  .bss .rdataFq.filegqsort_r.c_qsort_r@ .text@.data.bss .filegexpand_number.cк .textк.data.bss .rdatadI.fileghumanize_number.c I.text.data.bss .rdatalI.filegglue.c  J/ @J_strlcpy0 T ^ lJ a  J  J.text@.data.bss .rdata J.filegfakeQ 0 n .text1.data.bss   .fileglibgcc2.c .textN.data.bss D )' z 4 DtD8[%Y@ P.file5gcygwin_crt0.c` .text`".data.bss m i  {x ,,D"k` .fileMgpremain0.c .text.data.bss  LN w l 48f& .fileegpremain1.c% .text.data.bss " L0  l 48& .file}gpremain2.c6 .text.data.bss n L O l  4/8& .filegpremain3.cG .text.data.bss  L  l@ 4g8& .text.idata$7.idata$5.idata$4@.idata$6D.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text .filegfake.text(.filegfake.text0.filegfake.text8.filegfake.text@.filegfake.textH.filegfake.textP.filegfake.textX.filegfake.text`.filegfake.texth.filegfake.textp.filegfake.textx.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.file gfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.file"gfake.text.file&gfake.text.file*gfake.text.file.gfake.text.file2gfake.text.file6gfake.text.file:gfake.text.file>gfake.text.fileBgfake.text.fileFgfake.text .fileJgfake.text(.fileNgfake.text0.fileRgfake.text8.fileVgfake.text@.fileZgfake.textH.file^gfake.textP.filebgfake.textX.filefgfake.text`.filejgfake.texth.filengfake.textp.filergfake.textx.filevgfake.text.filezgfake.text.filegfake.text.text.idata$7.idata$5.idata$4.idata$6.text.idata$7.idata$5.idata$4.idata$6.text.idata$7.idata$5.idata$4.idata$6.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text .filegfake.text(.filegfake.text0.filegfake.text8.filegfake.text@.filegzXP .textP =.data .bss  D =' 4t @Y$ Po .text`.idata$7.idata$5.idata$4h.idata$6.file*gdll_entry.c` 4 0 ,  8 p .text`.data.bss( J * [  aIWaF  o .file.gfake.text.fileFg .text.data.bss< I %/ D t@ 480@ .file`gdll_main.cc4 .text .data.bss< n 0  t 48Z` .filedgfake.text.filegS@ _u.8982@ .text3.data.bss@  2  y  88(NY o* .filegfake.text.text.data.bss .idata$7, .idata$5(.idata$4.idata$6.text.data.bss .idata$70 .idata$5,.idata$4.idata$6.text.data.bss .idata$7$ .idata$5 .idata$4.idata$6j.text .data.bss .idata$7 .idata$5.idata$4.idata$6\.text(.data.bss .idata$7( .idata$5$.idata$4.idata$6|.filegfakehnamefthunk.text0.data.bss .idata$2.idata$4.idata$5.filegfake.text0.data.bss .idata$4.idata$50.idata$74  .fileglibgcc2.c.text0.data.bss  C   .6W.filegcygming-crtend.cgDvJ0 @ .text0.data.bss tD.jcrJT`.idata$2.idata$5.idata$4<.idata$7.idata$5.idata$4<.idata$64@feat.00.idata$7.idata$5.idata$4D.idata$6T@feat.00.idata$7.idata$5.idata$4H.idata$6`@feat.00.idata$7.idata$5.idata$4L.idata$6p@feat.00.idata$7.idata$5.idata$4P.idata$6|@feat.00.idata$7.idata$5.idata$4T.idata$6@feat.00.idata$7.idata$5.idata$4X.idata$6@feat.00.idata$7.idata$5.idata$4\.idata$6@feat.00.idata$7.idata$5.idata$4`.idata$6@feat.00.idata$7.idata$5.idata$4d.idata$6@feat.00.idata$7.idata$5.idata$4l.idata$6@feat.00.idata$7.idata$5.idata$4p.idata$6@feat.00.idata$7.idata$5.idata$4t.idata$6@feat.00.idata$7.idata$5.idata$4x.idata$6@feat.00.idata$7.idata$5.idata$4|.idata$6@feat.00.idata$7.idata$5.idata$4.idata$6@feat.00.idata$7.idata$5.idata$4.idata$6@feat.00.idata$7.idata$5.idata$4.idata$6$@feat.00.idata$7.idata$5.idata$4.idata$6,@feat.00.idata$7.idata$5 .idata$4.idata$6@@feat.00.idata$7 .idata$5.idata$4.idata$6T@feat.00.idata$7.idata$5.idata$4.idata$6d@feat.00.idata$7.idata$5.idata$4.idata$6l@feat.00.idata$7.idata$5.idata$4.idata$6t@feat.00.idata$7.idata$5 .idata$4.idata$6|@feat.00.idata$7 .idata$5$.idata$4.idata$6@feat.00.idata$7$.idata$5(.idata$4.idata$6@feat.00.idata$7(.idata$5,.idata$4.idata$6@feat.00.idata$7,.idata$50.idata$4.idata$6@feat.00.idata$70.idata$54.idata$4.idata$6@feat.00.idata$74.idata$58.idata$4.idata$6@feat.00.idata$78.idata$5<.idata$4.idata$6@feat.00.idata$7<.idata$5@.idata$4.idata$6@feat.00.idata$7@.idata$5D.idata$4.idata$6@feat.00.idata$7D.idata$5H.idata$4.idata$6@feat.00.idata$7H.idata$5L.idata$4.idata$6@feat.00.idata$7L.idata$5P.idata$4.idata$6@feat.00.idata$7P.idata$5T.idata$4.idata$6@feat.00.idata$7T.idata$5X.idata$4.idata$6@feat.00.idata$7X.idata$5\.idata$4.idata$6 @feat.00.idata$7\.idata$5`.idata$4.idata$64@feat.00.idata$7`.idata$5d.idata$4.idata$6H@feat.00.idata$7d.idata$5h.idata$4.idata$6T@feat.00.idata$7h.idata$5l.idata$4.idata$6d@feat.00.idata$7l.idata$5p.idata$4.idata$6t@feat.00.idata$7p.idata$5t.idata$4.idata$6@feat.00.idata$7t.idata$5x.idata$4.idata$6@feat.00.idata$7x.idata$5|.idata$4.idata$6@feat.00.idata$7|.idata$5.idata$4.idata$6@feat.00.idata$7.idata$5.idata$4.idata$6@feat.00.idata$7.idata$5.idata$4 .idata$6@feat.00.idata$7.idata$5.idata$4.idata$6@feat.00.idata$7.idata$5.idata$4 .idata$6@feat.00.idata$7.idata$5.idata$4$.idata$6@feat.00.idata$7.idata$5.idata$4(.idata$6@feat.00.idata$7.idata$5.idata$4,.idata$6@feat.00.idata$7.idata$5.idata$40.idata$6@feat.00.idata$7.idata$5.idata$44.idata$6$@feat.00.idata$7.idata$5.idata$48.idata$60@feat.00.idata$7.idata$5.idata$4<.idata$6@@feat.00.idata$7.idata$5.idata$4@.idata$6L@feat.00.idata$7.idata$5.idata$4D.idata$6X@feat.00.idata$7.idata$5.idata$4H.idata$6h@feat.00.idata$7.idata$5.idata$4L.idata$6t@feat.00.idata$7.idata$5.idata$4P.idata$6@feat.00.idata$7.idata$5.idata$4T.idata$6@feat.00.idata$7.idata$5.idata$4X.idata$6@feat.00.idata$7.idata$5.idata$4\.idata$6@feat.00.idata$7.idata$5.idata$4`.idata$6@feat.00.idata$7.idata$5.idata$4d.idata$6@feat.00.idata$7.idata$5.idata$4h.idata$6@feat.00.idata$7.idata$5.idata$4l.idata$6@feat.00.idata$7.idata$5.idata$4p.idata$6@feat.00.idata$7.idata$5.idata$4t.idata$6@feat.00.idata$7.idata$5.idata$4x.idata$6@feat.00.idata$7.idata$5.idata$4|.idata$6@feat.00.idata$7.idata$5.idata$4.idata$6@feat.00.idata$7.idata$5.idata$4.idata$6@feat.00.idata$7 .idata$5.idata$4.idata$6(@feat.00.idata$7 .idata$5.idata$4.idata$64@feat.00.idata$7 .idata$5 .idata$4.idata$6@@feat.00.idata$7 .idata$5.idata$4.idata$6L@feat.00.idata$7 .idata$5.idata$4.idata$6T@feat.00.idata$4.idata$5.idata$7 Xh_putchar0 @A P _sprintf`  % \4 _free  ? _strcat _strcmp Q   $        pA  % ; G [ t  L  _warnx    H \^ x  pA_getcH  pA  pA   (   ( _puts8   # H . :  N ] t  _fputc0 _execvp   @_toupperP  `  @A__ZdlPv&   _environ ( 6 ,_atofx N  ` pAr ( _isatty }  l _fdopen   @   pA_co __dll__ '_fwrite 5_strncpyX D X g@v$_atoi p_memcpy@ 4  /@A_fileno Mx _waitpid \D_warn p}J_tolower P_fflush@ P pA_err` ___main _fprintf  __alloca _strtol pA_strdup 0p P  &8 _fopenh _callocX 0 __fmode$ <_strpbrk O[ _ctime _dup2 _bcopy "0 ,fu_realloch  _access #6__end__pA_strtod _strchr H( R(_malloc8 l\_fclose z<_pipe _strcpy |( pA% 3@_strspn @NTc,q_abort   x_strtoll(  pA%_fork :___errno Hp _strncmp D_errx   d_strrchr  (_strtoul 9"Od_fgets v#_kill _strsep __Znaj'!__Znwj(4_exit t_printf .h@A4 _getopt P_qsort  8pA$  __ZdaPv%_close 0H>.eh_frame.debug_aranges.debug_pubnames.debug_pubtypes.debug_info.debug_abbrev.debug_line.debug_frame.debug_str.debug_loc.debug_ranges_mainCRTStartup_WinMainCRTStartup.debug_abbrev.debug_info.debug_line.debug_frame.debug_loc.debug_pubnames.debug_pubtypes.debug_aranges___EH_FRAME_BEGIN_____JCR_LIST_____gcc_register_frame___gcc_deregister_frame.eh_frame_fill_cmd_lookup_host_print_flags_f_tcpflags_PRINT_UINT_ARG_show_prerequisites_next_cmd_add_proto0_get_mac_addr_mask_show_dyn_ipfw_safe_calloc_safe_realloc_match_token_strtoport_ether_types_fill_newports_fill_flags_match_value_print_port_print_newports__port_name__substrcmp_add_ports__substrcmp2_contigmask_add_srcip_add_dstip_print_ip_lookup_key_rule_options_print_mac_show_ipfw_twidth.5354_icmpcodes_f_ipopts_f_tcpopts_limit_masks_ipfw_sets_handler_ipfw_sysctl_handler_ipfw_list_minimask.5646_ipfw_delete_ipfw_add_actbuf.5791_cmdbuf.5792_rulebuf.5790_rule_actions_rule_action_params_ipfw_zero_ipfw_flush_ipfw_table_handler_oid_fill_compare_points_parse_range_print_mask_flush_buf_list_pipes_is_valid_number_read_bandwidth_load_extra_delays_ipfw_delete_pipe_ipfw_config_pipe_dummynet_params_dummynet_flush_dummynet_list_ipfw_main_ipfw_readfile_fill_ip6_fill_unreach6_code_icmp6codes_print_unreach6_code_print_ip6_fill_icmp6types_print_icmp6types_print_flow6id_fill_ext6hdr_ext6hdrcodes_print_ext6hdr_fill_flow6_add_srcip6_add_dstip6_expand_number_humanize_number___FUNCTION__.3520_ipfw_show_nat___FUNCTION__.31260_ipfw_config_nat___FUNCTION__.31265_strtonum_sysctlbyname___FUNCTION__.31644_wnd_setsockopt_wnd_getsockopt_my_socket___FUNCTION__.31687_gethostbyname2_ether_aton___FUNCTION__.31695___divdi3.debug_ranges_cygwin_crt0_cygwin_premain0_cygwin_premain1_cygwin_premain2_cygwin_premain3__cygwin_crt0_common@8.debug_str_cygwin_crt0_common.cc___dllMain_storedPtr_storedReason_storedHandle__cygwin_dll_entry@12_dll_index__cygwin_noncygwin_dll_entry@12__pei386_runtime_relocatorpseudo-reloc-dummy.c_DllMain@12_cygwin_attach_dllcygwin_attach_dll.c___FRAME_END_____JCR_END___register_frame_ctor_deregister_frame_dtor.ctors.65535.dtors.65535__imp__getopt__imp__getservbyname___RUNTIME_PSEUDO_RELOC_LIST___inet_ntop__data_start_____DTOR_LIST____imp__err__nm___impure_ptr.weak.__Jv_RegisterClasses.___gcc_register_frame__imp___getgrnam32__imp__GetLastError@0_getservbyport_strtoimax__imp__strtod__imp____assert_func__imp__bcopy___tls_start____imp__waitpid__imp__setservent__imp__CreateFileA@28__imp__warn__rt_psrelocs_start__imp__cygwin_detach_dll.weak.___register_frame_info.___gcc_register_frame__imp__getc__imp__abort.weak.___real__Znwj.__cygwin_crt0_common@8__dll_characteristics____size_of_stack_commit__.weak.___real__ZdlPv.__cygwin_crt0_common@8__imp__getprotobyname__size_of_stack_reserve____major_subsystem_version_____crt_xl_start_____crt_xi_start_____chkstk___crt_xi_end_____assert_func___dynamically_loaded__imp__strpbrk_GetLastError@0_dll_dllcrt0_inet_ntoa__imp__kill_GetModuleHandleA@4__imp__strncmp___register_frame_info__imp__strtoul__imp__strdup__bss_start____imp__fputc__imp__getprotobynumber__imp__strspn___RUNTIME_PSEUDO_RELOC_LIST_END____size_of_heap_commit____imp__access_ipfw_socket__imp__isatty__imp__GetProcAddress@8_GetProcAddress@8___crt_xp_start___inet_pton__imp__pipe__imp__getservbyport__imp__putchar__nm__optind_getprotobynumber__imp__optreset___crt_xp_end____imp__DeviceIoControl@32__imp__puts__minor_os_version____imp__strsep__imp__strtoll_DeviceIoControl@32_gethostbyname__image_base____imp__exit__section_alignment____imp__inet_aton__imp__toupper__imp___impure_ptr__IAT_end___cygwin_internal__imp__strtoimax_getgrgid.weak.___real__ZdaPv.__cygwin_crt0_common@8__RUNTIME_PSEUDO_RELOC_LIST___getservbyname__nm____ctype_ptr____imp__qsort__data_end____CTOR_LIST____imp__sprintf__bss_end_____crt_xc_end___inet_aton___crt_xc_start____imp__fgets__imp__strchr_strcasecmp___CTOR_LIST___CreateFileA@28_getgrnam___getreent__rt_psrelocs_size__imp__errx.weak.___real__ZnajRKSt9nothrow_t.__cygwin_crt0_common@8_cygwin1_dll_iname__imp__memcpy__head_cygwin1_dll.weak.___real__Znaj.__cygwin_crt0_common@8__imp__strcmp__imp____main__file_alignment___getpwnam.weak.___real__ZdaPvRKSt9nothrow_t.__cygwin_crt0_common@8__imp__strrchr__imp___getpwuid32_cygwin_detach_dll__imp__malloc__imp__atoi__imp__strncpy__major_os_version____imp__warnx__imp__dll_dllcrt0__imp__ctime__imp__realloc__IAT_start____imp___dll_crt0@0__imp____getreent_snprintf__imp__GetModuleHandleA@4__DTOR_LIST____imp__fprintf__imp__inet_pton.weak.___deregister_frame_info.___gcc_register_frame__imp__fclose_getprotobyname__imp__close__size_of_heap_reserve_____crt_xt_start____imp__execvp___ImageBase__subsystem____imp__gethostbyname__imp__fflush__imp__strtol__imp__strcpy__imp__calloc__Jv_RegisterClasses__imp____errno_resvd_set_number__imp__cygwin_internal__imp___getgrgid32__imp__inet_ntop___tls_end____imp__dup2___cygwin_cxx_malloc__imp__optind.weak.___real__ZnwjRKSt9nothrow_t.__cygwin_crt0_common@8_setservent__imp___fopen64__imp__free___deregister_frame_info__imp__snprintf__major_image_version____loader_flags____imp__tolower__imp__printf__imp__getpwnam__imp___fdopen64__ZdlPvRKSt9nothrow_t__head_libkernel32_a__rt_psrelocs_end__minor_subsystem_version____minor_image_version____ZnajRKSt9nothrow_t__ZdaPvRKSt9nothrow_t__imp__atof__imp__fileno__nm__optarg__imp__strcasecmp__imp__inet_ntoa__nm__optreset.weak.___real__ZdlPvRKSt9nothrow_t.__cygwin_crt0_common@8__RUNTIME_PSEUDO_RELOC_LIST_END____libkernel32_a_iname__imp__optarg__imp__gethostbyaddr_getpwuid__imp__fork___crt_xt_end____ZnwjRKSt9nothrow_t__imp__strcat_gethostbyaddr__imp____ctype_ptr____imp__fwriteipfw3-2012/binary/testme.bat000644 000423 000000 00000005235 12006744007 016210 0ustar00luigiwheel000000 000000 @echo on @set CYGWIN=nodosfilewarning @ipfw -q flush @ipfw -q pipe flush @echo ###################################################################### @echo ## Setting delay to 100ms for both incoming and outgoing ip packets ## @echo ## and sending 4 echo request to Google ## @echo ###################################################################### ipfw pipe 3 config delay 100ms ipfw add pipe 3 ip from any to any ipfw pipe show ping -n 4 www.google.it @echo ############################################## @echo ## Raising delay to 300ms and pinging again ## @echo ############################################## ipfw pipe 3 config delay 300ms ipfw pipe show ping -n 4 www.google.com @echo ################################## @echo ## Shaping bandwidth to 500kbps ## @echo ################################## ipfw pipe 3 config bw 500Kbit/s ipfw pipe show wget http://info.iet.unipi.it/~luigi/1m @del 1m @echo ################################### @echo ## Lowering bandwidth to 250kbps ## @echo ################################### ipfw pipe 3 config bw 250Kbit/s ipfw pipe show wget http://info.iet.unipi.it/~luigi/1m @del 1m @echo ################################################################### @echo ## Simulating 50 percent packet loss and sending 15 echo request ## @echo ################################################################### @ipfw -q flush @ipfw -q pipe flush ipfw add prob 0.5 deny proto icmp in ping -n 15 -w 300 www.google.it @ipfw -q flush @echo ############################## @echo ## Showing SYSCTL variables ## @echo ############################## ipfw sysctl -a @echo ############################################# @echo ## Inserting rules to test command parsing ## @echo ############################################# @echo -- dropping all packets of a specific protocol -- ipfw add deny proto icmp @echo -- dropping packets of all protocols except a specific one -- ipfw add deny not proto tcp @echo -- dropping all packets from IP x to IP y -- ipfw add deny src-ip 1.2.3.4 dst-ip 5.6.7.8 @echo -- dropping all ssh outgoing connections -- ipfw add deny out dst-port 22 @echo -- allowing already opened browser connections -- @echo -- but preventing new ones from being opened -- ipfw add deny out proto tcp dst-port 80 tcpflags syn @echo -- another way to do the same thing -- ipfw add allow out proto tcp dst-port 80 established ipfw add deny out proto tcp dst-port 80 setup @echo -- checking what rules have been inserted -- ipfw -c show @ipfw -q flush @echo ################# @echo ## Cleaning up ## @echo ################# ipfw -q flush ipfw -q pipe flush pause ipfw3-2012/binary/wget.exe000644 000423 000000 00001420000 12006744007 015660 0ustar00luigiwheel000000 000000 MZ@ !L!This program cannot be run in DOS mode. $wwwwwx흳wG7wGkͲw*w>*wvw(uw-wRichwPELI  @4UPX0UPX1 @UPX2@ $Info: This file is packed with the UPX executable packer http://upx.tsx.org $ $Id: UPX 1.07 Copyright (C) 1996-2001 the UPX Team. All Rights Reserved. $ UPX!  G0O p9 QRh'E<6`Y<0p-LJ|3~ꍛpPh0' o| 󥣅zA.S2==JMUӯ^ X SA2ry '#<j͆Ba/b3yr<%&ja%  5 p5v!fmp=GBcSp?^Esd`._$rGy~'=bsp&I %$2OwH1Slt Q 23ȓC ǎ*5ja 1٥q~C'bR2G$ 9-r^# 9cp@Q oS$0 DF *4'/t)^WtH}kdʉN kf݉5b[! & I(VTBn@yNFz_u#ܤ ջt\^A;C*%u KC9u@42g{u+Gx /u;IL_^]ּer.(nͷ5OFGky?=V wflGǚ5˯fB'_i? >  ?e|gNaoӚ.&5 w    ;% Q>9J$Ppa stQRPua^T+uZtG)<>t^YÊW ȃF2~d%N |m?<ʃtb Fcwe.'>u_p_gr/tFN, ׿!(C]3Q:_KWS^S;u^ܛEm[u"īN*ÃV \WM_T| jG*x -/$:SߨUWtPQS4 RJL6 Z @}=_vVY[Q^Z$P26CV1RN7^+: t0<[<<<><"  < 2aB؁BAъ5OȥVm1wrp.\ v4&Aamp;Q(HeA<ʀg>tW1ƙqAuo346#(32wuWAG!rw^)f x0-CE(p db"2:'FȳUP5_ G/,a~} (RNj'Djz ~U+Qj[XtFW]*UR_u^ VpCX+9qRL6l 0u4SWhVV0*EM{WP e:!nþ3hWb{,Pl8{_RPT8]D@G_tP;ʃ#t28k t   %@3F!ۿvs25 3N@FҰWkP(x}O^q(W3hvqp  ]$ ;~;9hA@;u;͆;luhfR 6}Cly ;!q+ u&ً[s*KWQ#'7%t @n$}6Ճ8},QCh81݋6\uRq#ѫHQQ;9Q;w,F((vr&Jh`֗Bf{#)U@dPSx+?s8r53ԛ̆K,Qܣ|}F7Lg6A2bl)NPQ~ `=B 9=l sQPh0 E1#U m5L$@\%qo$| r@>$u@0*) \IUa *ϒ\$hfNˡvY%@+;}UU)0D w >U]hAR+v*̣^1 ;2w?}SVʼn}h̉EG;O l߉]+x/ij|8@qVu2߼La},ψw/ >QhB$XMsWR:Shhڋ[V)PU@;!L=8̻{]?uvF|fR3t/W@'쉗6@ W{v;-uf ;3]`^!npS UBW aP!w?VEG;V:Q$(v\:M7RJ ×[օ:E6MI9ж91~y9ΉA Pf@fZV}~WjP6tQ^ܸo ц$lh6@L* ̂~lΫL'(Ãc΅ 7 EFxzH >,u03᥮\}k ,E[7WFVB:5C6\=?ZtC=> <=<5=;.=:'t" @g=M*=C 1x=Q/6́쾊 ~u3[nD$=|c(DX2H<[8ܬ/ ؟;Eh4PģT} 1t)? xw&. $QY}R@PkVBޟ ٠?e}hڤ5NrjxB.tKuPYtף2}Ӂ/@_| 0Lm@>}Dz%8s>1{Gw0I6|VР $(q"#: WB95LumԮ4 =\wC,_A?MfO|)[k/wOitQ4RQbVj2Vls 쒸I\APddd Pмf @ rrQ^9ITA;_lTB#{ 8*Aq0ֽrlp+ SP3;~|4$ ^tXA @CR,Tl+U y~+Ͱ_YÄ8+t)wI!Rn̠ѓq^x_ڞ]|tV3"WO_C,7 NW>]uaWhwZmj!դ4v+k< \,,_tnUq0L[@+S~.UQh`ZhH!ðE: lO|S fpkx'cufojQl-|ŠСp t t:16|= 7s- PI8~}_4j 8WF{#z mOxj$QWƬ|29/yDHxx6b&W}K("0| ,Za:<%h89_0_KVw m8,gՒwaۢ]n|,*ZS*U^-wkAfP*č& f ;}0W-(URt-|}Z73,= D|#|[,4R/k\ Í>UX0y||o6Ol 4J1#_ S1Ojd:;} N8^Pj t9eVud&Z(1F +k$-IɭÐ={24}V][9Vh~@;un(>"[ F1 T> PWozڨ X\%?PNsaJVM[&ms8511c^>cN Q ǡ XH d K\76? f;w|;7|j\h4U ?.G^_*1ߩk6W~8x~t A;|3w.\-Fth(r\. qN󢼿U+}4La^ߡ xhpD F<h*LARPȐaR;$=rt!= .x==u~øYW ?H\FXß1\\VKy S @QOsk8$Bu0 y Q(7Nݒ2Xc+?bNTAX}Wh'(#NX9R LPܭ& @S_w ZUA d/FCTh+q ^à^B 1BD1X {p~j3ۅ~:-H3o)ٛ~;}C;|"1n$;>z7s"IFlGgS( 0^_S+=0g"b@xx}| SAo: #|KHIw'(j(lK2 zb]iR6|FPhRIH;}+HeM!<RF P43 @_qH; y>c91WuxiWM>|tVu$F\yp'-0W+! |4z%C:h58#;n;sZMu9FPCMA< /QUN *R~I+hgQh8*\\ |w8,)^k|ǜ;%}jQdN^ȭKn411'S3*r@ߚ9 P@8^[vt]?݊(ѥu={Mx៵:t IfGg}9ӝ_FFMN#2uuuk#3UQ|t["us.@M`"taAC^tH"xQ+n~1Ӌ8:tdJiT2Q0 A ;t'NiItt!;u] tV(#8um^؇|CEj;1rMCG#WcEl_| 0zuUPn@B:w+/.\QAt>S!qI j :;u+TR`TumSzƋ¿|:ѕW_?+tGf߅ +ٍSRM *@ Z-j?AB w?ZD8:r  Nʋe,˄P1ݏit3i|K;&Q d$?3>ͼd{uv95Xt8Jb{1ȚD}C VA+x :v3D; 0AwWj 1>4 V',Lou0]b"GrF6bLVC t_(u ^q P ^>` ?$HdH(nBdDLǿ= $(Xh :pm..1.[t)MGu 9M~w[xT_!+ -uc@4t$c!7jB0hOdPnԪH63=Lnj \Mi$ jbR4S/RqS)86 fyk M gx V$N*V ,VPx<8{WQ\zI_x06l_R &EQ6\7L#_=l)(~+ܧ1Ӎr֋5CQ~}F`;5COws\0]PQ>|m2yS4¾~SltTO/w5f@K O Vt̓ygOO~ ɽ JKByh`!寫n # @bwN?kr'jh\PW|i0t:EuaC,Wr.jhT0RPoWOM= ?9 ]4;E\i4PRW?>3ܾ9]|(uB 5S;PT)qW]8<';WJNȋ MHaQY@H|aҝu'>6 P8P _Wh]I!h8gC}tÍ_DY\~ d3M`3-qP@@dF~=+=L~ nNc=G Ƅ@ SPIx>C_pJv|;.GHRX\ȃA6K_WDRh?X/x2]%&=٠u;2#)|b܈[%H)3k}PA<ρI3NşӠoet@p? Qs/UQPFB! tkD2 ;.0+4Sw{/UГP ALG2B T%X@'dXQQ Aj ;M5}gN!uu#6"u ۫14L!Cs )`a}TyG P#MTR!6PfVGH~ XzBt6"[ Edq#R{4K Vb9S+cG4"; u'޸4S1CD$;7ƥO2;=;ކ: /⃭ W iC3HHW6_Ojtuku+4\4XSI9vG"E)AtzypH BzL +\[K$͎PhGpx{oA6xUr K4L?#N׉_,uh>#uHNh,kĩG(VtH $RL E\ H+a$FB(r =?u\t/j; ;v?UwNH1wߕb\P>hipDE$[xC >u htiCB$PWP唰,Xq(\e^UPC+tn]u8[4mH7QnOl`qAۄ u3p%B@[tpE $ĥX0RD\$0to ]+ك)8%M<}P]/5TGP;8FuCE=| A݃ =-tfY=. R=/K=3DQt.<\Tj h43M\jhw,Q)c 'TMˎSZg@Ic%;=Z6:eVDj.RCpd%>h޲UˮM1ph 1P؇IPHGPNoFExdڡf( h[R 2I@7NDQ}t'ShRKM9PCM~E2޲ )d2v6jhT>^Ȓ-4= &%`; (G`P.A8t;Fu;Nu S&eu_r<PM| ,U`R?A#Ӄ+O !ˉNB-9 G{ z/4 MT#`O@bl]8<aWS_~Rd|! MrB?Pha\8 U<|TjU8 i-3sth;=|JC' Bό٣wbx 0Vh y mp=B0qQ* 6[CkKCI"^F !V VtPhl"Unu*_듛Ŀ۔Ia2 Oʹ|Nd^SIx5B|dVLe E9M`Q`]%AaRusmbD2A57"QA"~R8-u|=:g' N [|B4D n"üs<,TCy.cP&\N-vtr "+4л\<@  cʆruUbuwW;Vh9acq#eP= =*d`EH;FKK9Z`A!ڐp^PDU5ynt$phćx9s|UL|L0#¨kt{K;4xuC'OjJ VUh`Bdmg[u3@R9.>;8.477JE!eQWRLZ|4lR ;䰗 8Q$tyi C;v!MZx_/}u!0fA[z?zPLLn5ͤhȏ㶧׌lS»RhC ". quѫ(> !_LhlydP4LQ`RTPQ=XCSv߭I>}-Wlz>0hO*thh$hLPWYaM]?(QF:cdstR00,b3BLi08O'GyS5QLHm;ԋ=fn5 $Gщ-RpFt OhRͼ t`Q3p%NK5 T Rss DK@C( tk{P7;pu;tJ@-y[|.֌'A=0 Hs&)eaP(!֋qQЋ;t:]Ƒ#Oj>w1;֗BwS`03gInb_J؄/(u1I PMŰMugIԻJJS-;OWiUr`^>(ۀVeGTU@~:8!~p둁G!}aJ2Vm<4$tۮ<#O 0̾=o f t>9 > tJ>z ~w^_'Dy  vx !0dւAPkan-CxE/MoSG@?* <}L! N.,T\5Dt]EG8hA޸ )ت4R,$ ch+ }mmmsM u=jdn1H7fp8 w7ss[oN~&? sgB# 2ShhKt2$)NSϲgE]-TR%- HTBOQ uǢTˆQiqr0,>t rs܋qw?8Z0oWaN h$,h .7'EPVaVxy/}ġV3 [/<M]`t(u.؍3}H5u̡FSh躧_8]@J*eć3N,$ tVe#imM`'Xx`U%҂ʷxT9P";'Yt?W  }x%rH x"!V/HEQJiAYT ="NMKrVUAJ ^ 5gVXq/xhl4Zh`@^xK_0O h,_8 P伻I.w!>R+ue yTP7 +0SosP8#KP~ ?h!jvh S m.#@w,E|dUto@@hX1//\L?Ql U7 /So,82t]YýfS)j Ѭ:F՛h쩢7V}Bu4#D# g>E<2uSq <3t- MЗ]SRI_^rS 8!$|Cw_ QoR:yZuc3ATP73u9 u0PAQP|sS u*MPIi Ce/$5,4jtCsWqu j8QP_yڌ+rU:X2C(Z1Hµ[} ]^9W![#8뗠Y%f;^Y X`_Q_Rhb|,0F:6:},u@|BG!RJ|UxaQhH(2;#5zЉR=$@D #w ӊtW&1HdY"(u) g#Yxd"_WP,W@EDPvB5PukM/2w|"TZl\3Ja\5P 1?m)*nlbMd?4ԅ\ ^rW|lMu/?5u<1u hjپcB@%JsFS`%Dc(n4lѫ&_EVѻ[t4H'R|?WokJ M,7KdWH,y ipe\ToDd6xȢtqC#̞_h|~a2 t]ON ȔdL5W_?P,P ӰeTt hqVP`",*Hý\׿3@:S I 4*Pnt#_QYJCW l?NOSQ3>N2,WtX^Bk(_V&LD/)C< pI^i5@|K)(t@uz3T @@Q Zm宨N[ l ߟ͆ݡIɀ|UbQ{n'C xefQ/hۚ,]0}މU7nEW)~'XWa+b9#:/CO8B[R /.G`]@}.ch.)t o^GV}V hTp` tE.!NR8]Vb\e|[ Pwpl( /%HHQZ0HAp66ǭ2S#pqEtnaPvdkćPn R"pRF mnT䬔h N3 ȃI$NّM :GQ-W̅X}Wo0VFC!"'Mf01V.Y`+ >M A$%9M-y9<+ЌœlH[đoB24i8<\j]PRlUZXLIمP .Br8Q9Ѧ'$QTpK`ya!yPs#k-(%Ecmt/!] Q/Q3\ƉUQ !Ǖ?Cu8w _O:wR{>|0Q+(=RCcC P\nRx;AMd~ulR.csz5gyDDп)u\K Q!s|@6~QA0y[8 = u#TR |Chc9}֭MM1>|}鉕3۸> +u,Uд+ sVRRQdq Keݩ\ƻJY[MI1A+7ͯnp_:.}xHuEWP!gl*;uxr֓ϮZ6ƹEv?D}izbj@h$}K ūTA5ܦw2UR K>kKXtu|J!s؜a#D뎈^ u/HL#I%x@tL+H@ ulx=w/-q uWMf_@_)$oGM_-%p@@,onwC;$!Hoа. VS\niկ00Sp0j{`&'6SB[x_P 6'y;QȸaXP(EK779=N .V Rh`#ػ_< j:(u  _S3ۨGY`2g:UySh^/3N# oJO%~? s5  iF R6AHjb"2?8fl$D'X%`%$Ti38Htv`RG |09 =x d`o~pP>`Pj`RWSh\ :fWWL d GUHKX aG C9PURy5|g ugG3wa4 T XuYc4 G`)0c BI;k>(px`;wtbLm PQ[KC97 rPF)aPž#|'7 F ~i+mPR0 (.U)5xe@x" /bbouMgDdLQ.)4(4RrU<PN<%OCtA4 6x1 Hq@;+"_ybɠlL$>TٛdA3;/C,tMTUhpigUg5);s I [|M)=z[x6>r.! !&0`L: NWILwO$oqh䱌WOS4h{^04)< 1uV u6VA4$a<> 0 H+H+S߉50S2!3F/h& s8QAXST| +xڡ|. t9^*P| 9 R |)>K@"l}vW,ЛD~ !1}TG Vq`g|,h\QS(= 7swS}wA(;0N }G 3SW\Z3=eOY0:7 ;RUāp'duș$ohPK CWSLj^!-3u*laޱv ;R!#a tI tc;+! 1ŃK7(9W {"JAyƧ#uFv̎&OCCO] Ѕ[rܯplUSq}& @3ti tf# vXFdzVq* vo}) VRli-a]c3HNLCYX_]iĪ0H?ྟA+ʼn7`u=Mx랪z#t'k㯼ǡ[zp(Qtx# ZԂ+v )tTĩqMM됩`[/FcdP0l8O:*VJ̩?@opA#@q$?h>|O$uQՠZEgr~SR _:1A|ؘI WDƐOɈoHa4l- `Qa@P^GL >G7M#hGRwH4XE@P̌x>o|e vZv19D3I]R hLH9t}4P3b_h `X Fdj#AHDu3{h( 0n4C |*#z(,46~T*tPVeT$9StuT0t\#$ 51S.U u^NU<8QU 3JztQh@ށQ#c Ut, f|M}-"j/C/P-a!\uuwEt8H^hIVA`=XVb6pZ7e7$,},7l1!XpQߠǻ s ~ A-ʇ5rÿW3۲wWퟞC4Fdkfeidc)RMg%ߍ aO_[(xUUIx3H\t3$dhu*2(s]Ď$ WI`uX(1|bH b;:  JB5UK'S|F:oaC{-@TtK
4` @>|uV+tCY0~Q|Z+|,m]j)!'CF u PHtC$!K噫hLG@"40ď@}uB]U3==uфPtC0 <(ZҊEؠgGiqН >8 wp20kAⓍLHm]Du<:d ";rmot[,tM) :u259EoT]tRx ^<:n ӧ>VHUa.9";}N( |uCFDhpUOK2/3iCTף#+ov+ngJHsVss΋DQ BF*5 U83*`FuS{h>VCl(i@u\atNhY?aBLIZe8'*u)h ;Z$^dT=}FDZueNJ9l'K-dd# j(] qW Đ @*h?EI$9tdJq\hWyk U8ة7tQxDT'@$U$>iZ|$ րapu ;P+@~=!UddC-tR$' 3%(i?(N'Q(|PAb 0CobԲQ)hy$9SUG 3aU? קH'F NldFvIC;4?WO u3Pu =dp oRPQkI>R1CN ji) 0p< ,|\ )LO\-U$ UX;u'=i^hSW3ѵzW /[hV\\b /;+,7:5+rjBdhc> 1JUh8&l;t 0'O?\(BU@7@ QA;P h%FXog 1`M*]kIQPgjlXuh4qry;/ YP`CG\T]KV?h0\Ӹ sP K 4,_Rs_:4ASztg |3X Txa{ҹX30MD+Aa@ 9R<~f:t 361FV3!I" %(SWC!Iֺ@R0'4_bD!LaH\ GhL)P`pVy>6 )-yEGG !}jiK>\duVh|*qh2}#T?tbH 'c!p[@ B鲅%RsGʬHh+x9dV@ 4F5A d? Ė@cO,6-$,C@.SBX5S2ÐpW.V!+00| 9 q[iߺ!8H{ hè"&)J P0M+v#652!AŠpO)cM,&K`@T Y7d\@ "'š!حz+xL73/S>Z yWߺF& fBi7Z ]IXț Pr.Ck@hI &-O~~7C4i.tKW,mQ.WhR-[UHthxBhh jhX_HS0/^*(4x׃b0Kkt Vj/APcMbgjUKlWE>BAH$/(}?Q$Dcl0+ץCX Eٕ t 6CF) N[A+mD;H99 3Vu ' $R_   .pUV#fm/%S98$Gx۾?'| I\ L  ٹ}H+Ӄ@|9t$Bv Í(k_! XO@$+' ~/܁@0a]l7ynÃ>?CDmOq O aPK|B!<K ᙍ~ Fo BN13 ) O.~@ /@$ٌC9_[Tpd V#U x@Bh޹䁇Nj2}_3C3Љ^ލc) ~>}jUR>{^}|O{ul,'lCc; cn,C.aa (4L &Ȅ[=<~xG ;~p++;~4l~(׍ ދ)(! q_KuX+,~&]h%iڋb01P`݂s ^]-<,_) H|*RhlJU8ODSm5˷8@uF@Fd`o1+'܍I*|W%-?{e4d 0a.!pWJ@:L߅iH5D63m(~ϥ< ~͉.9@XuTtm'W׌[,f |NEDǽŅQ ~ś ( CjFPRjGkKˉ ,ӟ_M?S#  aifG.U#AI;͘|@ _Pb-Xb8'msM$BeEqÊQS'3׳V&FYS_Oo P?33Ӌ4t%/$2@QuT:)<2LȸAկt@7UG?  J],4b!p 60ƂV0 +#jbbb!Gs9 >OO} @,r^S V,7a[PۖWn @Q<+FaƚEϱ2#u%<3S5u 0~#^sG8}t5Q,n8  N L8kmØ' ;qbr ^;L eV;V&l|1A< L8_(p^VbaPǼS|ec,tS1vtUWJDq q>q>W G_;8|N<ŊxmuVx+Fs Dpء;;*sTBJ s! rĵh9 Imѓ߿@(% L 'lkA-g= 9( r(w{^[!ЂЈfb,tH%6=)8ɉE韛(%"S@ߥ;}i@ iX3O5k C×Vj8m"}Jp;"XAPHQP1H_9AA>Su<6[}3?sSˋыMN/~28_[ ѱhSd؀?clNP7iA;ϡ^?%C#NUj臫R / -xu;hr)s`?SQx/tQ1A}0 3Q7oAE=~`|*}!$dbit0ABWݱ]3'vut9;uA?N=;+Ƴp [tvℵ>a#Ŵ<ts]*muSmu pS&dilq;Lo.y9cpu^ouX:suS;MR*>FL(1Δs/1;+u"uu7tu"~Q:B]{MTԶjN(nl$2@tB;s>@@_: } 8r $;v>{AK-w5үM$i\?;-FN}^g'|JE x 0ܦ &ߝ%< ńۤvoʶwuV$ S&u- H@(F(-/^#<uY=EXHl;r}?xZ++;~h\~AX?0+W;} ;L!LPSQܢl펾7w;} M{%~tFwVUE2R"OR0Fie]=C2Q@ ]} ^ Hrt>VYEGEPgmID w@Bx^dc1: ( ?^Re4pM_A=H#@! [~o!=8ȗ{֬&5wA g> e  Lk+] %-u #يt~ty$ztt 6]-'t "rȏt0W : u2I춹 z>m[PC $@ސ6rA4^< wi; b# 6&Ͳis9>g4˦5iZRYt@R ;Ss]-&Ba?}>uC8uKH5}Y&?_s.LuB@ftm vK [r"@L!p%#qX.υޞy-=18ݬ  (tB. $zD 23aMH$t V|WcL\n`03]xJ<+FRjZ 60;F#WYCeu鞶/">@6 ~&4 F![  w ,_61 ~@:&Tw=/ B.L~,h"tW<'c1+}լu q/EXt;Il>6/Lfݘ`_G2g~g8:Oi,E(Kt  6v[d>u8ӅȆn1@½:.Da$ dU=ufu47(H3֝>$_x;ыvяlth) jtR :KP<'I&<@Hp`gX>VNHԴ%,QqdpQ;$0dPXGD>Y_Lr+BA/CFj6ރӆ sA.-&-upc?&"B/ޱt>6ږq@y!\6&4P'.f rR)R*0 N:$l ݼ#hp~"B*pp0 v/Ju릔{ vt lcKi<;OGT,6>BۺjB Hڋ<m*8PQ+܁"r؋5੓%$3{_PnS^fqF5N^WMm"5X00? ~w nt-=_j )LhJʘVrI$SD\ +]AA"r FJ%~!32d Umq/KF]a.O0 vqTW'hB,Ĥ726%~q40OćwxJ { N+QhPRX!) U8kn>VRh0mUl3Ntɻ]S1Sr`T+)S6bhȔ&kS#krj A?\z |+>zx;R ` HuHS~e O\MA%21F!3 LQF9@㫑N7! A=) (pO;,?r+ =9saqxUtl@*}b<@/VWuM)KUT$(ôpECmw +@8|J+k@O n k;DQh$(̭Gbt@bbQWS8 Sj YN֬\H|_, niMI'dyP^_,v}`XM#%?;Aq|R!aQ}R+h#dxHN-^ 2k- #a)4ehiي:1uߺa.0۶G+ epu;6UW:,7!RL]"=@]>jPU|r@.PhI4\__`X@=_}tR82BW4RAWy4b@©8Â~]]@M:u_7ʄ   .@!,oAVo ֛,"A4:~8XcqlċX;~\ᄎ t#$+m90$ ,4+*|BQs.JjA1}:Ijʙ*-Fc4 5BCQIc$StrWV_1yiX!hGCB.V@"&_U/;/Qj 'gm/s3 FO s 2HM9 ;FVh{0np FV t(CbxQ9Vv+p#8u<^TB0 W4A8wWbi9Wj:UP Fk+}"4Iag'F4~ r)ؿTk7dV +L W` VP^|`t[/ۭץVe@!)nXD VckXA[aSl RQ{&@Biq#lDL2 vGL[`nP 9_mOv[0N+^(Vtp)"UtPXh @}  TR \S =dN/^),U\+e` t]kCTlSH`uC0%$}Ȍ)`m_ J%/cI0]Ð/=~F\tRn4eN|) ,+w}@A; | k lЗ]![$ *YO\8*5.񁀂:ޏ '^4  2!Jpn$ 0 5B)9 `/r3 Q Z@cܢꂔ e ܇l%-uƉAWz0  uR X,VB3_ ˖Ԅc3-#Y؈>C݇HdP{0 Ǫ+މ(Y̬CT(Ti{_[ݰwvܵ[\ ,1H&BOog uTM=#̸XV"q7΋ѹBƋ0%+\ -T^B!yh,VLtt#$,n*kPЇc 6;P_`V4P`m4h*_V?ludW} yVA ́p9}'0<>hRPVޮߗ]Kg͙y7rųR7 V9D[s փnmE.;Qh8_Hmc] [ _|X1!@5]2SW7A#]RPI^qFst$VB`_!W\@E-A[ t+R1BUՆ'MVOkH f߇(t~;=}4vJ)P!h ݊R D[Fmc, Ћ7kKtbs$8Zzb=@pↃO 2' t} k +{B }}7J|d5 v^.08.d~h{}Kr86}Wh0$Vm'Ps  ,JS* 0<j }8/ f+Bf !?pIIiހL99 Q@&*[a~݄b+B߆c֣+'T~(O5rٚ{_=_Vh>B(;}- F@M|]Fw(L- EJ "G+6@d~/Q*<=wle'/ >AٴC7 XI7B?ֺ`+bw,ҋʋPH\݃xhIIA2; *(R<ܣ΋LXܗtH>p4QP }E 2Nc |CD91r)KIȣ HYN{H(ȰCp9ঈ'a'04󫨠 7t@!/z+L脝R+#Rt՗mՔ`޾Y @5A \\(ث,Mxdi| ;] a؃b+;H@y |wB%a8x1w[?P!4-97UϥV.IPF;<]_R(-m6u$vjlpMWh#NQs(6&k xZ u1%v 5̴ZM~DEI< )/6<}0R8%FVQA8];t Q?E\-٠4y y'+i/Ezʋѣ@8T䚠/M@xHLfȍ,Pü|He} A PQK FQ\ofPoS(s=WS i?})H($Gjf#-4ʸ68 J8ѴR }0AY'C(5EKaSV*i* 7 U`mDA+yLt PJ N]@PV~)ڴM7PBy`1%Vm%zSu/'Kt+xC #~Βl0])X Zči v% CEΔ =+891CPL‡Pj QZ =t@)•@.AyC~oC$0D!|sQ%[I8K nR], }Bc@2 LO9} SWl(CP S)jKt[Nbw3X {Y8opY[ IZ[ ExV/XS\hÚ~.TH=M4`L{=%Em[0`OGV8Wq2%ocz BQQ,qtf|D;^+uJ$${DV U_4'nO F <ȩOĩ4! 3m$NSh0C2a D]!K FHMւ=oV$ m:F$P8R:QDa\^0)ct `1on {hMdƑw8=x21 LfS!)>:| Saa7<)d)<+~BR<8+Fx?MqZtee:Mu$4[P0kI5 8$xi):CYgC;0"OE߃n,Quq9 l88y”Lȷ<9tP9x8q\11X.l0yC {]aS@Kt˅aUol!OXEBG!HIS)P0+htq#Q.^IhJi1=jhN9GJ4 $76ݎr " f! _[^3<1]4+kTJj'@f@z `4uzF ȉ~)\@52 D+STHF|L_5%B7đ~Ne-CINalWh Ug8P(J<~cHklUS()uGDWoFCBH";_tK6d X j͉n](w*j mQ].X0 ⩃&j)YtzUIW7C)ӟFH:Ћ;="F; G [5rX9KFp#g_A.; ]Ot#E;r9v)M%w9ÃOr9T5s!BuncGzLs55Kk3Ye:H:s`_s p W*Hu&SA8U,0H+u*u 4ڊ=+uKVx`KG !@ 26pA;M*>OH+4 ]S?"6DŽ`"5ur$mGKiK:!Y~8QuLGx9(;I$$.prƘ!dNG.|SθhѼ<GLQhlӐK9~-ER`g(qۿVO PԒWh J@sFhf^ F?6 C[7F ȃ^QD= ۅ>m2 BAM4O`%u[}NkyKO=Nk! ;SRWQhC?Cm/+KM-y!{Qo :Rh c)( MSO"RV3-W : rA݋`A&n@FMvcM D9Y9H kmMw-2WDaDP#a;%2h(0a  BT}3!V V riugUC.0`=C},Jx:]Saq;WTlpHw6vk ["vdXt3JW\]VI7ȅ,}<$t tC7{B%Pi‰~ Ö3tz 5t"ޕ$ ɻ愙`tpw5.[mܢ9+3,xVRpa5Hk.Cmt$-%Gl-AF&պFAΫ\pӅL&̪jK 2?b2?$QX4tC<H{Aft4Xx~`bDDV<+OXIb[pc_3VU!Ueъ) ILF@@@ FJO_HF‰ ,t[ÉD$+P|RUqNO@wUuԇ>ùNڀK0NhwQ}tM5<--+P6zu5t F< ?W:^^r(@$h#7C;߭0i E:S{߂=K1k WqKJZ,ȞVS=hIE/JC^\S4WA@ƃTtZ"Bٌl2N:uI^M͒ /thdPW VSq0G b$d<+D1/^3^!ధS'Ԕt G R_Q~_|r} C#/60d~Cj})KW-8CyBFVM P?RT)E# OXڏҍAȍt,Pi^3D `)5Xzs'bYkcI@8!s)ZL _;IR%[?.Q #_R)DET¿C,_.6)}.ӳߓ#ut2SAmx<'ݻZis_` J%Adr>?]<+!7\9KV}3?C!o FJ5YPz{ -J7zA +%ssG x 5. %-)@@2ܶr3+&ohVVb Wpst g:gdE4 /m?kY+KW[ @=SXX -Y0z/S;I?=M$;MIt I} SH Nj>Z_}uBҨ?S9ub GwAPx+NƻՍy *Fdo2!!SQSmF: ;t5O/tj='`w$+zddbIR"x 8%ʭC$@]\>;s c;OÂmO1S؉ܭU N 'E^MY,_$S d$F@pxl'p!C9†AȡCVŃRQc{! M?:WOY:^$QssaeѸAEOMy D pD$(?vVl W Rx9.$us {+=_ C<uU;} ,!"/K ʼn _K'xO* V?ǍeA#ЭRJ]೴9w5 ̸MWbpEPIpGm8 5l%)T+[@@M. @Nx :<((h}k|M ]+P&Mp8pG GGZE:W P_q2 A,8itG_W-@5 Clh}g B2|RwUcEh !U Q,NM $╸a*%B1]n -l%O$l؜&b(]xAfx-q<.ݹK4=E u+>LsRUk?Vr~o7qK5CS%;>\ ~ 7F." ס j-fCQ310ǭJ؎[Op"SO C[G}j.o@>W_2R?ix|N4%=`zu1,䐚XvWb ONjW[v&U .tۿZvh^)8EĂeZReBP /8hgA&-T0'`z>fQ"L$+߁\)H u%{S#bopM:Sd2^{R N䍬Sq_`)g1 Ns+.^8=vCn@WIDN1} FWa>@ @{B\B։?_(C> $@x/VY:P3^J3UsWmҬ(47rr 5!]+s];< YHWV&ЅA=$xy(@J <"PW+M%?ЄZ⮟t"pT_ ?n VxCt8< C`K mQƏV,W$P(D#LK&VFUW%)[HgW /v1QhZWE6jm}4 8R,b?0hܺ u ( r |$ pj.XlGS띩$Wg/ЭZx N (ۭR G#$ Gʹ^@ u KC Qx ),YT$h!o}UQ|X2 JydD1օ >G` CfA,ìr_IJsY?J]W#ǭSJ]}SpYC] t;.=%pbS 9Sdja`!*W2,Eʴn! V?p?euGy47@PW+}*/}z] S@%O7p!Yzҭo_  XբV'es /%WZGMDsO<7 }Vuӂ=VGG4\W?G o0S(W`H@0vu*mqJre֙rT _B<0౧H& l>t;v^MSK+wjwC6+#s#A^>ao6"_tErkCsJ ׀?c*sTj_,mW0~]]cNMuYwi -FvN!r2ёv8!e2q+5t,xybu]CGWN!lc2' B틐6G-Vkґ&S-[-rE}\7LN!)v`@:jG5[μ *.X't)y V%m tOhSRW N zo9u3 ~/Dnt25yu!yNf1eKs 1IHRKY:qu#^f:u8-}%no,ڮ01 @82me=Rc X!ti`PG%cZp;>~# ]-@;8,-tj3٩+58tlt!֭3dr1/nX~ރ y{0e rX  ~2;Ʀ s5ާ876^fSa6  rPs` ?P26ʶ N!7b* 8hI Bs4~tHNMQi9:CC>R@/ȕz]+ncP.^S'/yQgĒOcc@  I n.u)9.(dz6It@CR.Y&TVۘΒA0Nj@j(B, q S`MTRuVE | qF=|WRh$땡6IKE(;t=2M r #@l&56 I^Zi" 0K~$d G|srVXdh >h:0}%bTxi Ju5FWsSaN^^`]__³@s[JǽJ'_q 2oٙ w2p 2VվJ( Xx s7>[j t衁 Dt9&={ _̛ܲ@ɻ4MDA-+"bR|ւX[E H2C#AWHz0PHj;#F EiFN;V#_wah NkhJsX~=+?I#ȻvN<,SsY*t0,:[4Wqs ^{$bPN,7Ui-LC^C .i0kݺp3tGy{4FXK|j:SW'*xw:X1^)aƁ8 Bk (/t"UCG!yPҒڣPtĞ$)(Ux; x`_&{*=42#<,Ÿȓ@x-! DF7σPu+ < H@4EB_ -v=Rf㉱q(Pxÿ^+ͩΏN+.@[))xM+ԇO,j]  Q@KUWR8"$\ 1CE&O5?EM >A@u\cE8[mU([DAt1? XѨ !7zV;~;|*}o4~,ەt-N! 'ÜswCp%QEGÜ}mPtQ㝘s ͌A%~/t D>TF<>܁V6MQWI(7jvRz{.s@/FSZ5c?N^R 3SV+)L(0@Wk_ 鬍 u/+X;\q t܀5?;2œe? 4FdKAC)?G_QRSF K>ue[%̢uN6Ό2,)!QFҊ=%t M *![i=[kYO,\!ȇfFu=A2R Y):8uQIH#}sԪ,y -,{482\ӖXxq<_^JׄHu.Ab0Xt?c*t;;fU>|S W[ ? ><mL/ X'ήGT IC 9$&A&Xsхf!ܒT!D_Q.O(mOV p*& )ȉ[fbܛhoRKWil;H$.x6<=d@)(ywO`i, .`MuWL<dAHU]$4s0A sZ\P0 j*I\i: MֿVۃ߽ vWSQ* #O00  `yA; uH=MLӋτ0Rw m >Ph RPMiMu/M-ڌkpFI$|s)#"uZp!`C(F.i  *5qG)pr62-9 p)$FY%)<4)yF!_bX ssj 8l,N)F'uR韑֛LiKsE/P&.?'s+U"} 0~Hza[-FكM"v@NL ,Rfds<С?Ls,Rdh0S ^,F{[\;Es'Cd ےZ'!jךy@Bq's+ֈ XN 6(;`y6XT;VAiʚ;`0Yi VMۂd TͲ"XmvHghǠ XmiFS+= <h m'+CS' Bi#rN8XhF-I`m[C-\S!χ[Z=8@z/ zHm a[}è`aaHSY>~WƤIa Z@ )`S4? #qx8ˇochZp塆0ɢJ SdxEc] }(hb+`XA )PS+r dCV,\*]M"-_H5E1SXLDh^,d1Z*Oo$QDa3oSZ,pFhF- d!cS5#W9vQ, |?8^+T~FojE [7xCfu<wz3ֻX ;+|.j"}-B.J ޵ox%8DmV-00C(T"o+5 2qJ E'T>;scSG2F늀 mO^+% RA/mG;F=cM1("?s\Ar[q8dJtMJutF{j%#l'=A+!Ik_/V$]_a{g^i)Rjpfxxu&1El&; @pv hh\ eh)y`"Xn0P$dl`H f0Mb_E*e-NHXR;#o@Ui ]>uIJEWVq΍\iru$pnA;Io-"*^nL=\`)Vc!ԱDLq6$ Cq)5AÁ8D>t!ȯeS@wz.MG.1mI}hSFb |FNT!PCh\KA$ B$5yc\ t҉ge 6d:??"3FMHp[å2s[svha)E`<c'=f!0 )N(Rn~JƁr ۇ\\^V SZ%W%Q׾a^7G@ R$G@w `_@w Bh: -B5dF0a[l4QSIH hX/aGC.dBLax(_xA&^HjTJ?E=s @#hh2*p,< UR5i>LV l`x响/\X^!?v86݋6R4H4@k^1Qx#FA;[|/B ,Qhh"E%IUd(!t !ֱ ƹɹlhCh_e,Y>#KiCb1v_Bohfh m˫.l(B D,9,Yx&ppP3t"u2#:i[%Sdh#1pc/QHG00K3YXb[-%yu I,.S%@E2bh(>4,965(uVx=OEPZxs Z;]Nv>*,&N7P T}=Pc=BPElEozO2+Rr`O"|_x|\ ?уwA  vXg{4S* Ge,VIXڌ~1PXGaJFݼuL iɬ?AAT5˦JŚMkM +rA"\,w.ޭ$ddE#]94>+SYP岘[5Ȁm\=DR}K{AQ?G؉eqYN_5%X[E@):56B",Hj'8Fpy"sp)b 4.- t>WV1l- V#KI_!^V6Aa3U$%rpʸ]ns`j TmklG?]j,CYM bUSkd,|!L/m }@{} w_~# LLSImT$_G)Z5. ,j.PZ؍Yr"@a)ajBb n,LV$5&"WZ3ٙ:z_4c $eOuDUhm Dϭ,:^/t(Th2~ NQUƆ =,/]V۸50S+Ӹ5J[#+o?pŐ)p3PU$T P{K%=R0jܵVV 0 h48L;o$’z4jd#j pTDçoHꍌQ0/DN*g&͚G<۸q `L4 22N22222222tdD$092M2&MCgd xi>c-=39?EiKQW]ciiou{iii˶`! $ I aMkW~4M4 &,24M8>DJP!4MV\hbMV9T|;M} nt,RcܒWRw"Q2arbL<~Š3Ǎ#Eg ѫ ܺ{2 vT2 'C-L  XLU@_$Q9?GAYqyosAbd9`e33э*xjQ`g ˋ33p#3T.V3zp  ֋p]#T~/p $j$L #o{WUP# +νoj( [ XT,M%Py3#3ݿ|[ ـp'B[*E#3 *|G T?[3#F0@gN0nRp3#7F  R<N3#3;AiR<M@@D DNDr+/3ͦ[H>Hdץ\\+F Ll>L3"khPPZX@S;q 18Zߪ_'ꔌ)CyTo4\ l#6 H!I~XHM,X_pNb%`|{M p #3ߜ3@@Hu? f޳#ٺ?XZoQZ^&pPga#3@W9Ƕbp,\˔cqx]/6XOH@XSD IO3@`hqI/x@2H ^@!@ϛ`I(7 S,I@9o ב 6*|PeVM8o{˘FEA8GD") 0rC T, *Cc7m #< 9 ? 6K" Ĝ Y[ezBH@ r*H ً,ϛ }`LI<] GHúPO~o``pMUI,/0P,H DQIC@I`@NF ybxI@~Sd砩`QE15:k4$M UPs3hyD*\ `̩D",ӆ0`wa 'd,<_Yhx ^($cLCSU\4X }%< C8x 8z%4]|M5K{݉L3!4ST S~'PS| 2~e S_XK)H ] 2>WZ&+;wؤ`@O,"~(24Y@'/v2 {WƎ^M7Lwt-}f|+]?"tvfVmx?.e(K4¶Ͽ{=Ai0x= K#] %:QU>7c+?$ x8ukYXQ i~ww :վJ|+4z5·acuk"UL/QVݶ5SC/{( X23 % /=%~\@Pyǻ\8 mR)3#I_PIxXH)<[u9u| E_ WD@1%j ]━u]$$48F\c@3ɝC,xҐzP J# .pTC: }[làHevESٌ?_Lq۠: AtTcNc<tJ#xW+VQhRJ;d}'iv!x#A`*_pV;'#,[,h辴-"UW 'z4ԅ|^_*w`ߖ:0MGQt.TUsk0&o|3ծC=߰%ؗWF^;u͍iryi QiB*wetOe`Ŧ^XEF U=i5;Os )#ͫVUu# 0*Ԩm@"0:ڈaW WTK"Pc SRE0Vti"0^0D\5 kOőRQ$^t ?|9~} "n!ˊp7*۬@} =#݉ .?jj\oKL}?j0%Qz&[ Dt5ax@SPXL* tbgch0aut @+'"-C#-L=P$liu_/y lO=3 ;O;,[P=vptuc 5@WXQV@J4$N!~pW߻*q uE- 2QMnQߨq> GwUu!/Iu<~+Vï|IxWQUWw6a7#t4F !;'K'ʃf疧u_'CY*GH]r1&,24( M.fz? *ZHѽiމH8<.gص_Ƶdh8I-@wy*?H{, ?, o!9 .\_% x0S^w( HL``ǡT`jAJaϤ h|Ŷ[,, < ,~KY0A2 h7o , ~LRP GOW*Aܡ'p81NS@RN=hHqotHP..[?]Q2Ó\ZNt-֓K4|ݯ8S~7lP I] \)$ߟV -—u# Q%ti]JQGLR?"$J R^YDeb@'G8 VG$.QCEGi|db;Cj PCCDB)PUVV<+¿؃\[T[x_i`^_i`FF E|0p+TY\<I%WhS%N3@T#DI,Iss4TT?5CLEW0i) d[55a<"P}G~(Gw/#e$텒v&؊}_3SU@Ba{C ?G(G*`tUt2?Bv;u恟 :Qtm{A][" ]] xV{-J d p'MUXz)o0Q"NR`V FW.g8u(5 Xy8VVPU`!XaP"VM@ Z4>`C8Nt"l? E7xj} Vv e rTj5L |#D =(ߩu6(%t p2222lhd\2222XTPL2222HDx@2222<840322,($ĿkJ,Rba2\\gR.  ]-d)CjRPJ@of@i'n6=rE(28DhW4M0 r,N$Y֚UDS (VSg$.j.   @K?Dh Z%jL7EL $~c>7p iowQjRMlAЦ/̣D0Ad0 mDjRe`l(8 VS ѕ8&fh֘IY@'`k! 3P܂y:# 8YӞaH ܽh(%&*{ \~Ypwg ookOuXHՔBPȺ=OF ؄;IL$-m'\1jDjgSij<8r6XUN\smS NSãUz4$]K@\{.nj@ ,J1raW+Q % q$8Xh(f#֫C@|[0QR!P@hwXA7yWP܏,tCN$,i$ ɸr,!DH L laPP,ͰeۿWF?8 ŐQ@J2>vlW3ؤh4`H44x hD44X%ruu5!aHPA ,W r$R+t[6lN5t>u9":<;,)1 4# A11}:RRuV5pV!XSCT௦jh?BNlhl G}۠^j z4\蛬 Ҝ ^Ffic Gp_䛔\?h!N`YP%fWVvHhvU_˄4K hx;a7m(?څ\S?Ih (? Jh]J*>%hevhjD{A0Yp P" 8Y_#`֋ lLQ,LDTS%[ƾ/@vḣ* h)}aN9*8h0-h1בۑ 47x\ nu*\\ p3jGC>Lu*1!E L}~hbQ[NK N:&7@#8F@/ PJwG)) ӱOOuS7_#%+_aq ȉVa` F՟F48R6ݏȃ;2# 'LHPxi3:<2 *Q Gt$Aq!8^I05~3@VV6"/A^K[ E_8(-;Ati;}+as u}ho88 tGቮ*iZ< `\>4h(UIua=ȼRg @PRMNn3X3Y5;t1+|!b\wEH<Ƞ/7B+_F EReoYh3PK1L!'MT?!-Ւ6Qif $ 9Zmj~i [` Ggg-~ h8(`Wc!@KS8ceuAf^hVQ (NMhPB]x,IBLI,jrOpDHP}\OAh\$`;}l-!/ _Uw,#~Xӊ>3Q֓@FMuƉH T]΢ф%]K_@tr('= i;ܭ.su.t_H6؎ { T%,W7p9V ${G\CVJܣ G<ƻy?!"/ _W$h|>9Rܛ%Shp8f9a.bP{$XX8 8  $ࠃhtȶXSWwedK}q2sv-93BY/A76p;vDNa_VR*XWB[V8l >h$SIp>*F\DNr%>$\SZExVOj .]Ys[D_R9j_C܊<a`L[`_A _0 Hp݆76c_$H#* QWWR8:CFV}G(LNXV8Vf<\5@<F;V ;mVRCx(708&a۟74k/]^W(< ?SWZ{ $ca&+OXV|>W! fN' /RN,3}8]} XdGQ)78S ,c` Z%jlƚll3|QTapyI)wsp}o|y; f4nMhEQ03L!8 QhX_$jM|,HCP=}^>0J؉|(_`d^X7ZR)vA} a%&0p4%kB/XQGACnp<:7}| CaFy W', rωjky;N㒪\N|%hNt`Ajqj 64UjWap{W4V>w<}"efS]B`aIc^BҐzxQ,VB}˞WhUMCjsnAfU^F. .CH+0} Kj? V^] A-O$K_x;D4% :ue<+ah`='IqhQ i=j ,!LKVQ55$VRGc> l]_pLTS>iL[xH(=:DWOUzU@8z!z*>k\&Z?a${)r<7f{0;>t kءpZ*>`Tpj z$k-hk whqWhȲ& qeheRlM4M "(.4M44:@FL4MRX^j|M4M4M4d4Mpv34MW&ب^XR["/)_d҇\d@"O{|C 8LVqbg8(|\ mb; 'HtQdgϊɬiBnE 0UCJ8 a~ FmDEYǘXB_`k-1&v#[`XU ߹t nv' /jA{ T)Xٛ`5P;K;Q%F <^qnp];>Y/WYyPSи-U5#Js: 0u-;i[g]Hm7SIxL8߃s2E_:*NyD[D_+!uۻ|9|~"U\@x“ VGJ&6⻋ F:FR#($njb-Gr_20`gtmhM=a_HZ+ "0i]&Y&Y&Y7Y&Y5X/Kt}f?FxLs(_ imp+K?"h@S}Wn_yomw#|nưl HY~H\)}0;k= qd1< ǟ()r 0]#{P@37@8bPF[=V%XE:Q-C*LV(O+~oy:A@@;9Tl@:6:[Jr_H0uP4\XwX愵9\\JV03Ɋh$ř@7#3ظHDM/+#8XW3~)mx XV.@I২6#3;co @p?(B3#@#a^C䐿( TyZ" ZT##;`Bwޒ`.J<vZw @;oWp1xdx< ,A##ojd+l$`[H 0+M38 d #r 49>mӿN]$ r ^f ׶#~'> 2!:22<:oNDӧ@ H㵥8[T[ڡn&6U+ ӶNt"z&*e{Fܯϟ$0Z3f/p [Vp(,fXێ#0KXHF4*iJ8M."LL4*A+8J{Ǖl~KWVSldgeCp܀+A:kXh H\S{OsZ8v'K ڝI`eVS318QԣSF|8K8NSFV CFYdKF)FFm?;&, XyK@ @;FBK?eys[ Xgq;J@_/ m[VŠI`1 Ej4JN^h,I4CF9ҴCg:;"hSF Q,!S=;9!h,y/^ T ,hZboNJhؼ'hik , 6${HD RP=)hwWE/w!j`h R70O(;R_ s j,\l-lhy69B ?CIJIBDb@s:A~7P<lC'u60 _4@8 US4@o`J.xyo&3V4ô( 8gĥR s+QMjV k; /zf$ ۙ!,5T>2(H[ƴCv1+( py?hG?HL| ^l?rqr?zyB^\*!!%,HzrJX_7j:!h-z|X9~P[}q 2W|i4iIܓ+@̥%UR4khG]Vt6hK9fz Āfh1s7 hV@ %" h]k +%?y9>Bh|uɂtKm L!>P4%I(<҆B @PN BiO``qz[?w\IF0JaEv`wt0j @G hWfG:euXS@K6lo1VM+P\F \P.KmȍM#?U $լhQEsLtCh}86* K}VG``5V j Q0Al$\53L2ZC4}Xm]15!Oi FJMN0H\xmh[ߡIZLVQޙ%i;^]V$F02#'+ 0UeeG "(ݔ?zE㫂I\_!?^z\ ,^jl` 3h F,&ej SHġ1MNP?X1V ! ~;|}d9^W| 1oaiTФ'ujnnTbVjp#A| `sd}]> =ۇ+7 /_Q1;G{Gme3A) ׋kf)8y{zNIChLB)ULqY/9i]3/{;ΉS]#K߸ 1Jq-v@&(@GI"w"H?VwFTHWuPuHXArjah}I/V4 9=)[@d $T'+GVrKj\j&S}_j~[CjwURWh$xA:9PD0{ ۰F NPH`HwA@䬆?G`h%kr$Ha4L4-0 Òah\$Эձl0)8oj|H$MB h6kсΊd| 3̞'  9̌_4,&WI }a&N#hI"8|s)h?+ RaBL `p c0 =I8 abx5  8$|&%Dz뇋7R} ^ yXX,8ok *d)l{ny YkplNmBd8B¨klr=B5Bw' 4,܍X|gKލңJa+RPGW~0δ,RX9 H{kU7j(e\LR %%\T@Gzz~-?ЊL02шC|eޣʲ`t#6ctؑý(*ۈ^(쏐 "*T)2;/,i+ZfF.dd9Y-303^<_/F?[NFF1#C8u |@a,"b}%uR  ][Q54 Ab'O ;bUDIZ&ݺUFG8e߼gfffhsJK+M ,:Q ^D=# hx/ +^C;ވ,.:~ ]:tVi$ʈZVr$3?Q;2r$#S<3r$#S=4r$#S>5r$#S?6VZSL~QE70A8(b $8If!9B9 P#G~,?Sqkf(4cL@h8 6*Fs8^v99'oh[*N4A IH}LN --@`m- 9 cI8@u/Hk7t1moq8A?n)A\ v%sL5vbPL\Bg1^T8ٽGLdţ2(![-SO,#9<twaSh h%a9#@ഩ;e뫣+?at6-H5uDԃG$h+T3Y[Ad )\?+m OVh>uu d`mhS_T2mU_?iDֻEoiik!? 00Wtg5%j ''+B~kA*`ON@WRBK ,MOŢLOpaoU!4LEC+iX}o!1V'Kp;%(X80&h]0F]vF*<0@FD X8 aXڊ4(h U0M^ V TeTLTXnLK簐-U3Ap[ u cmp)cZ! ;P`uOn9-MQ"\R}rvQg|2W+74tٵ h[bTs_ pi ?PW @1t T+ >e}L('WP+y~ KK)^a ~}#jBO2POFi/]}t._ ሱ$W{@{icQhEj 'G5k(WLF m!} \:`cHb@L Qu:;EsFK_)-: $+4t4~ t T+߃ u~c 3퐂 Y <C ]F4+ՅNwl`|IVAi2P|;'V,;=`+H<}XyF;\tNJdD'p; BCҕLh)tpcls zkӮN;.\LDȣ?UR0ߤM` #LbTӻUc 0>? &w6HLORKCޒk8`=LON .UWS~1᣹+NP3Q5DVxp^`Z\47M{؋DUW+0o` ?]Ew%YPHLސGgWOZiru@?sKw3mmBOQ— jQ 5Epuu 0䄰(H;qM bTH8jJ"ncT8I] iLoXewr,nBB5 ꦽPS&EuX'd@ҳ4Ӣr;fTAЩbFo o! E(pQ+ pÒ~LPжV!ըe%&TP̅@n?Sd}lu=E>6bRq1cH)@F.hIS)|lHt! B .Q_ >A13vF2(qMP =|hhJd@6[\&<|P'96:|:R&M4WP)8QE|j%9E而SWi:-4h }ƀ0G 8 Gm%:Q*j=x"(ѵR,}z]ӇF*Xn|,7vρ Sm:((= l*n[>$躄$eD QqN最h#"AW=y@%`(7=Wj$$t_] y$k@JduuA,#;vgR>;t US jd  whC`[y" SH(ܵk}]s9tEh;h0 "<pg)18Us#[h%2%(?vʭjjbE4vrA(7- K27$v^%qI9׉7T#n_(V*nn#(VfuWh%R H0E͝ob$>"dY=VXH|$WupqMM.ޟu&X eg`+Ph"` mUGxJr1J_]oFb7e%|5G>iA\MkuD D-tl7t&!e$nM V{N}S`!X AL7TX[GmN j;+רu2G~,hYhMThY8t`y)hfY0a|!pIs= a7uiQ B(8+C_@o0Ѐ0pWN۞h(򊎈$0 { 4Gڙ`t ,xXf)hR0#먃p*rz .3_?SbRsJ@Qa%S0PR^$+(4[_P rOU(*/R ~{ր) _ DnY`phS0xV`IZjZsp084%"yxa }J I fuD{{0tXl2Ӹ{$p Hm,HMj c\ Ͽ?t;bwU1ly/$4uhSRi#!R+B <.2R$ 0Wp)*J:$ @R (](8.VR.$ VFz o RGDDQWL[`Dt]%ph%eᐉ#Prh+4(>iO19Ld!}M ѐbVPv6+OJI .!rK n$)3:h 7<`mȟ4LzhS<=;-}Tjp^@PN A2L;X^iC`h|fh pPr~܊'6 { yqsdjxP% ,EP Kz3uVRhTb;KyWEX2-L\ ,o&BZv'PA+N&HVHdJpٜ l\`, WA !NlX cuHh!)H%hrMT`3 2Vkcv%|ːPIPrی}`$eR;| BtnBHe;Vyɟ]g+8#V0U`"h}Je+7{ML>dhh16AfGU;MhQ^"4cS_|5WZ> iZ@9`p$5ˤ";]hУL3Nr @@V'>C HBU+!$PA ANQVē+;~C.vv{ $ѳ WEd4p SW:"d _$O,UTj 6Bn}rBFC: t|vq0) `tHtd0~Z<`clu SݯJT wK~ ѭ"2?gI &d3tƛ)ID$>hS;!9V#tsH&{4Ra}8SFqPMt8RWWNܢ =M\0`'P?61w rao̎C07,6qW)mmPT@A`ydT07,!чtS`6!NI|~2@ s&Psc16VUW m8W_((W 9 y3D@gC0 ^T2/ `zR"nX.Wu-9%u<:唾$!9r &!B xH3YqA .{ЋC˜-BLJ| 浪g|7 TN0WX} _//#RQ7 ȑ̏tSWtNzu H@ ZP2~7Ok.PA1" U./ zd{PP쌜Zi?Q xzPaSdqWw7,_ t B,U$p6Cl^*OP7(eF[хU`!LEBJ0Q UXuNBIL*  Pm 2A. H1 +H5Qw6Wzf$ğB'%Q"0V|*fH0+zR+Qy*R9Hr SVjAXle 3;C }.=zm7<s 'tMp D - S Zu“)$(k.S? &֯@ \C;t_23t4]e0 WP(co ~0p=u%Kl0 La|#)h T~,S)V5uVWo}H ogUYְۨ|[%myRE 6L?` ENA8x,VHRA",G>;28:ζrיW) G:0?{t+Rڻ`i5&&(t`PJ 1m|RhǶd/HI@b;pRhL6fIQ _M3nt@P@c2}=PSqxS4^` hW*$‘,_UZB8 ~,~iNYl OwUp\ANPhڡ~ĉFSK aD}{|hEQ=X 7,+EÀЋMf%Ȁ ^­_[FS!cWp8>X_, u-}ZѬCǃ-9 oD7-th&cS<)BVjqj ,w:hv#.жMA nj?D|R3őBF_xIC/=H Q{-ە blʉ84bxP;%̌A]3TGDݹqw~caҕQlqQF*14L8< x Pd)u Bÿޢi B0Y,_ ;j$tprpTk9A犸"vP OG}}ȱpCVSj TMt5#0hP:Z6NMVsI. cB [)0/rq* H\)俕V` S @ |\9:~~ W?Md!NV@W|Q&yە0\yߒ /ɴ'hKA=&gפaM|oH'#T.bMH*};h1IvSJ, PO >bȓ`J9/W mr ea:M0j, čSDaX-4XL3t5h%ā,3I%sTQ/ `Aa^\&aya[I#U\h+ViH$)E!雌m!.q#3:u B kApn@ w\>OR(wA:p ,p8؈[<im`TA.b*oA]VHv phX6A=R#E<@{x #ZySZoV̞Ƅf\X-JK Y,UW@jqzFj}y Հ>V?,GbmL_I7[[lC~@wb U I.xuS$NT|C4 6ujA&bqi-}Q 'JStbVl(U(32 1b ,>|Z`MTVca*W"!%^Fvvtp}uh{ct޿ZIGX'إ_G?h zj `99H -QF0HL=w"FhHV nT)B_u@ievV|mFT`g'\J"\\K8eLrI0 RA-;~>y'Vu zaSR^hAhCi3D OXKvRhH$Jm9^?hZS XY (@L8! 3CwKxWO%RE% E53I~-9jOVc85<nǨ L,!_yſqTKs/T DZ+ 8t3#h#F82EK_S~>hU`hUU S 8R| !G_td}hj8H8uMx>S6k%N'^hT4!KnF<ALWw@%^!1u<2+h l,O(Ff& 4!d;t >a7Ĥ쳗ޑc`YjYW.9q$]ЊĢOGMwh ۸tu@!\huEm8syԦ#x04y5}@.hIG<6/C h_J䔜H_U.?!@Z:aAl jK!hMTABܳ+M*oj ~jWR 7I '&|Sa[ǟLL)\ OB9e }`Pt\xh,$p$L;SP:L* _Q A?j}hY,!jhB/F8T@x3y"^z × t?,kN1A1ȎS i bKB,HVE |8Wz| ++@< 9Hu64L#m_@[v/颖311tH2_7' ˧q /+$})wr<8_}S+#?A| I^5 ?q aPE`a}C^b,BH   `K~ ;됉8˿&gD(L/| ;}I4U;} .}N)GZa}pZHcT"u6*rX7Sjc{X 2\ F@S{;}{ ]zd!PE_4UASj!"0*X/W~󶈣~ Dc?9v.f ao;}t<{yJAN~t˺ .!"%Wt }9~^9>RHeǚ_kC8PXBQSӐNRQB8# p+}ǀ!O$6X@DWm&Gv;J[KA_M)E} QE- C1p,u((GG K 7JC=?&j]Kf#VxtJҽ$Q$R ?g Y}oAhCiX O%" M2e ^J ~ oA~rK0, ]@U]ѺSO.\;8:dSfzIFFE؊.Ja0a9/7<vn` xW#  w*Lj =kLМ i_P$2\FWO,<9>/x}(q a\j d65Dj4TzӪ]\\̌$I6C7[~9Ui5x;9hzHG 05 BBoAر.FOu15EKt<ch=ˏN(.ˀ@*%Ӏ.[F] 6>hb]T@{\!!!@+e+t;6h!ϓhjkjmzW3LjaA >`R ra rQjPP*ȃO~4h0#/_Sq P~ I KvLb1W7 !C1gV#;4udИe(Q]T7$!NGI>hQ3: ?{j H )$Fts#e$F@-J $@btE03kGV)(X4@C:JY0H 9k }oi|' h4?S&EuDE @@ 9CA1m{Q`cLX!ʹ%N UPW>_&Yw*?'@$D i ]h>Kyf StĠ.N2iRdྫJTop$E^POh$|U[a| Y~?z~UAZ~K tF09~< 't7(t2)t-+t(,t#-WF /t:t=t [?tIĿu[L$^ ? U ˃S2CltjPG9Qu/"_E AJLh^=D4xV?plJ&. Jf^BVQ8,F#_{jr( Yj`cRÿ`'j!hmsZnl9kx ֘( q Iݪ3<KK}  ؈A@ *SKEB;G?ʀl$_Xf 1A!~U^ 'ݣz~ }АM;W~ HUaa(=K>nCzәgyJ~ !u+G]N_Q((LD@zYQ-l+5!H 80[ Z h`\a Q0p;0LG#^2j3PC Q|i-_b |3t2@ y# X`( Zk,f 6?s<%W~2QB@g(L@RPQ\N+ht.=Y%&'` @8ZJ0(RI~ }E\3 Q-ch,CAejg ?%sD;L@02G d@&hCLhA)?[Mr$'4H&0 NAlX#d@f_NqlN~L>N-1"1[[ȳ^;|6uK[zwt;?~{(~۠LCQNPNI_5?&b A@@anc ҇FpX> $F5_&p6n2: Bwsv UW JJEkBv< @]Jĺ%zb$#, +ѣxFXUS ]YX$S],И !]I8oup!fOzMW PZ @aaLL@P,܄Ԑyx&+I;l5@(TC@ML||q ke gycC4^:vO~}qHgV jQ8K<| t!#; w_cPOr'E(hSX1u ],UaV|w0$$|R`/ڜS_nk69(~3  މNy8dPG{Hz ه,njV 戲~V30w4pn6a˸c P끉z\&R*=jwP 2܄ ȳ gD7/!{' Gc @ xWah0ũWSSjGt#9~  ,84^4 MfRZF8 ;-zutVC,*½_(K6#~N4`Zzo Ȩ0#X<4t/t C`%@l5  m93}t" tΕ%V!n CP\fBB&j/p%MN[O >;4/rna @o ϣd$!P(wŲ3H,k%v ^?$tUSo5]bLe7N C<6ܚsM8Qzo g3^a!:٫u}auA_F h8w`> mP Rm1 ّ(RQ3;3ZR?PR3_ aO0>Ӱ6(G㐏u)[(_@vqc]G36'ZXZs sOwF*WOFN1tIv^S-~R"ݢ`) lp(|Ito.[RDyR L~=F@35=MF/!HHB8F$tu=?uw+ 6=q)L2rtGw?twdZ`Pv>1:2tN<܄#qat l4tpWR{Dc UL:s άll[I1FF O= F!;~]%FJ&BX E NA( q$o*í oY&]TW e("n?k ?rX@?RhP~5#C#VMbO&NJUuO3Gv &^h,z^h36ܦ0W:Xel|B#V؉+Y B:?ct4[7m?@_Zˇ_؞|6 p0 9Y1 /XhdOݱ% $,lmr`g ͛jgrn<:Oo޼yRQhك[Vr 2ˡlWrP j#ZOtA07%ࢴ@qRFW<7\F2P KpN !2?f3 #+b#3$C47 s/#38{%3 lXZF3$c! 8d @Bpw\2 6Px8(MXj~B#(m OD7q!y$u A 3@agVdC)3w#. C{p\b{;d #~3^ND |$gnBʕՖN` #e3ʷRjhjE@.2 ``h$t0- #r]eE49t f(۵C!) xp#x5թ"*9ş(Šxdא Л y$#4[V9:\2 jg#?ю{|Gpa`@u< hx/$#a,/3Y  ,2 v28lBApL.rI4  &=l5\\,Q#!x31Y$?7wXa}7 e @Lvx .T.UW )M(Q !pMo&#E,^/ѳʤq-wE _o##_p'##HF,`fAy5 x^#8<z.8 8?69xHxJx9#@R"=i9,Hp)%2 80N 4&Xq(n 0 {|@8Tv) `mr a@c*1$Lد5H p z"#C(7y)Ӎն#L HuI;P-h#e(&} UjGYʒdKn>93#\^@i(0(Kp XER>@vt]rUܪZzVy n\u04b8w'=PGKWހ>4y+0R?kAF`?y!~2D0n?@7Ndq$^HDCSVL8M+ r,A3T"(ׁ <[623LHig33ӚkL2w3pYX8Fx M|<3w3RT\<ځ.fҤbAP$8T0Z\+ib\3Èы|T‰\ &U(,Rq2@4 bp2ж_p)B8,~<e#'Bؽ,Nͣ.<x9p8kl9w~EkXT&T35+_)>rq"xjж#Ël)8LlB|tџ\3u]Gu10`e$1̹xopھXpB\ǁ+c_FK 3@F3KDŎ 04"(5 UPHD _M1PeT/;M;D(V4OUƤs|kpB`>7W @UOƱ#6L##v?Iexflj *,1¤ Ń`3ɥ` $膓T2MD@a)0ܽOQ4ŤB 8<#̐8DY_ bۉx2I3H(,3ၐ( $;l86t5h>"7$#j9@D?):LHޑa̰HQǚL,Z էL248L<8##PT2r4ؔ7#8HiA *@ &DÆܪ4 k@nE0,(@22$ ,!04Ii؄e5Zf+PTLT##"3\T3}ޯ8,+0 fޣ )d04$d"0D@d0,(!dD8 <́C$5k4 `0$#CшͣH$22$L2PTȁ(,On8t(Va'40dʡHc84L4$08D !#@4PҜ(T,PҜ(,N4ܹ222 $H*0LXA&@Dm$E@P2!STDP#CD<8P #40<4'CH0L i 0& duDd ̴$J(,Ld=[2ϘB04B M),,,\&xkBA|#W,#ϟ {( 'c[ e;H_H5΍'-3O65IB]≷WN8o8nx#02'|3UЬL<Y8=4%ȉG=9,(ϠET8OVSFaH=,@D1O,xb I N/t $/t&opR E=>ƹd$$uA@.8y l0J{xFxw/ڝoa22 J1p|#1%a ؉$Ġ qP2XdZ?,,x03j '?#2CHLc)7\VP3LB"(1L T9a$#\<(#39$CP :):ަ S CL8KAU53 4Ko{Y;O|kQ0 Wöڣt D @j<Ϛ8b͈4Pf@ 3$(,K50X53 $T WSP3h]H<83r  $5By;3цX4?ЃrD0JDGh0(,FD3`@\, )($FjH3!3('XP0](,p5%ѸdV/u< bFcH ?VC08!ddd@D4A/h04(,5.@/ E!y40z3r@D&iψ5V R3/E y@VƣP918P7da0<x! 6(HztJ_ȍp~6xeax0 fR.2[[IIč#H獘װv>!_ xd;=84 :hƇa d3 @ h]U1Ʌ o%E3*\%)~ً視8 <\Xd`o hlQ0\x-qޅP&Jd7;টmV~X58J$"x{b%y\$F-(,(,$#Z,,02,4 < H?0`FIs[O87a,SExQԷP>HV jL@%x<^Ppv+Ty0 p@C?F01})oƈKNC0}D9@ Q~eS|L-jhJv{aF(zNFyVGc'˲xHwHLvr,HLuLIHtLH,˴sd1rNq$Opei(kԐB ;?@ttZ– m@mWXd@ {6@T@i)6b+BN X'\UbV? v@dd $څ@F& ;(,X$#04L#9@Pݛ@8vƯ ZW?Q !l AtFPM9ɺ%"d(Vj !!L+kB_#f3JC7hҧe l@r~Y5qsL ֛lN8' w{UdqiM1`_0T nZt Vj _OyyE7'9t"Ot&p 9,7G] h6*LlB3?3h`1. w-]wFʲ) ($[ԞE܂3WSq$RWãU܃cKunp(!CoY:!HYϚ/8 $D2 U9@FAH"#B9ha0Ĥt|Wj]pM;v x7E[FF0t2Pv{`}hqA>(Lya dcC?B8u'H6te^K\$L24!2q!TjCed]Ղ'K%\6l Y Hvh\ KHnSłGg,#aZLV5L0()hA]A?u+4LWP I0I~=UP->Ix@އ5PCNhh@ g,SS$L02\><5KRSgQ$HcO8PO5(-)2+4$ޖ"YV $gV3$?uhheIx-#A(4I1՟@J^'<A.\Qqe1_3x {FR!nw10@R_E1v6ͲiLGVdF,[';EvL   8׻O'I, ?&LeG#4IX?8$`ah 7pEH0eD6p&ܔL2VC$BW[^VSu{j~eyVqSk,pMsSׁmN6;"[3su[1 sB B3jJI',ɯ B !9PDN(_\8C\p% U $7+>X7PQTvŋ/ KP.jasB SX#̒>WNAIm!RZH), $oқ,j$LhJH%Wh KCᑸL5 U;wL?\S:_[ۚ;|A,渤z%& ) { 04m72.CǝkT_u^,.[g"1#%-" #: :ufV:LiqqrIG.WV8QRQ}#q2Վ\<Q)*YZȑ؄w?V2tP&8Qo6W{lGE^,>z4#@лt$r5> /F[N;K;9K:_݂;D/D%Zh[ ÔAŠ?MA6 ^C:IN9/iiC[ETah%EhaXt8]8RSs]6Xi:V L$]\Z kx ES;R7SЂr1{\RjPQ%Xjyxj#cIʨӆP%AƋBNGRm.@8,ܶߐjce'"Ͼ._Oܛd@;\!)RKLPY5)&XxaB)+| +B0|h` .QH01d,/d Lÿ,Hb`qHd0匕dx¿ j 5v2QsK6xI_wٿWPQP`H S|p "ߍHP,,~Ʌ4XȐ hq"B!0u5!y 쭿 8y!l +.dK%" <t`ٞR`%/ =|- $:ν AHr I>P yU"y?v!'\r! TYp P:͔pN`1 bحX2W!(, yT*,*B^ȈG $,O+}% 090/6LN +W?$rESp8 ж+,δF%`Q^ȇP8L^Vk] 9 Xdh/!rH(\VB0hG%K lD *:N q?T.cv!PL=":@xK$"(e*VY:vÒx@=JʲY(hlqXXE?ׂfo$B#I(4`nrtcPhh]|"cU#%QubQRXpL, X+6 jyS|-Ƥ)jSM7]հcPVl &YWB&CXRVMlp߫&; RᥐQ~i ~8Q`# `!U9BO?}^0 p~NsrL ?dB`4;, DV2EBEMĬdΤ:\PCPO; thR}'ވ&C P|1 LRB_x _mȭS)k3g^ ]v` P& *PQt4S8\{XX+kWێ)s3Tlk Qἰ BH?~($ Pf .xLJ V}%$_Lg]1 R +m_ w "GX% R%∗9@QF@2X7˺h<,"k_"$ 'OZ65jv!X>dH.XVpH(4AW@ʰY\%| {%vtuH, ASmWRCL4y9 ~D |LܱGX&<^`6_6| ' X##qa^\*! ` ?r*)a Dx/TaKW'i^*RcT"ŠT} ˆDVӫ r? f8%c۱ yԿ2$Cr`B`!CD9d`a Eѫ(EOʃaU0 iY:`WO`Idqc#E/ Ȉ_1Cs`WK^j b rHx 9$t`GEc7$,MkB98:x1wyk)P׼y? IfyՌ3Ћܭz;(pIXhO'ղj\ʐeЎJ{MPudhm0م޲=/C~#h`0`;bS$FYAk [uS6{, Bh'rF^R&6 Ƶ84VS>Vs+(DS60Zzh/}2!=qPB` CG-dZ ReMea?Ȕ& 9 y9<K/G:L1pW,1WLLLl_@q=R [hH$ZU~hsdA"$)Cflmp)ON 3)0_,ӆV0shlN6B`]ȑB&iJCoLMO& G \W!B 8qzE)X5S3BƣSu'hԄXvFMPPnuh;2[h!sM tsmg`b?hR9 sKC<|hm@VuFPڅԃynCdw^RZu@W܀r ECrDv3esWh0%Oݒ}u*h$uh\AmO! W^^|\ȴ+s^^M UbouG3q[߯hJR@YV!y AhY4Ka+)ӪN.h\I+oYz1 s@f,؎b h94#C8BAUv^|?ExGR[a0p /RŦrQH y/A r ZW5P; D/PPI "5̀:NfPRڀa4ho!K}Vx=KZNê P ƗC\2$+h@x<@N4R*_CK;!qOh8' XOChw%SxXLtrk.Yba1ONjJ[d=T|9H9h%q9XG^PJTԪ.҉ʘP4qsobzکh1olhkjIV?iS9p P7?M (3}x>q ‚/|.[b%/I?hDƠ8.y&HLBv9D9;imA^8k}G$u[93bP(]Ŵ_0  17Fe5H6<9Ār[dG.;tGe1 ;kƇDj_q PPt&!`PhbX A yH514 TG2tG"eRdj 8Bd.~33-Gt \B@CȀP|Us!%G Ղ K{hf!%6dd DrBtw)tDd@&BddH})}@&HhdL@{ad{P@z(dzqTrp:a%. &u$  ;C𖅞 M^Oi11p0CJ #480siYhPW_s \XF^rhh҉c'FJ.V`ݔ\L`v@&y vdCȀ̿ws*%GGbr ?h'U%q,LAqlCȀ7x1AU@h31 %SIM@ <&u?,0jy-!Op2MV^F"ÿDSDQLD t _MA K0u0 E 4+A$qu<ڜMxV& \6t8$'4!@H&@+VAԀ /4x~SP? (c!YR;. R)]oL][m'3 W_ĩ t&SwE,V$ kVRU-/| `$le`Gp%kwmR(SBmWt8P!|BV,1'KbB,9 jbL-AxAkǾHqdv'3øeG!:J H ̮'l ǩkoֲ_y[$vA[7&Xcl;Z QYPyu+CGaSAܠ;i"mUK+z[>;S 2tsoUys_sNQR F {r(U_8Cj1OG@FF;0r5x HXbax~۱F#/ 3Hip"PX`U-$bJI\0h-ږC MtmhUP?I4CWUn;I* ^)Ŋ)"6jq km.X ?\ku S& ˆ!^5]5[YYMY?"J)3a_T i ;"ifU,-YfhUv$AJ(FHyj c GQVghÓBצ>R* BpL.jc I ݖN87F=jmY^r KIӚyK 2i$ ACEmᰔwBk! e ˄,$ Ʉ01u^A<l%Ӥek1JO1p xS ~u`+ux4&0hIVtUKh1AHmB9!1N(e<jAHZ.;; $tf)(Q K{CX >]} cpC$d/^hM6h@(hh{'y htAho*`%>pF~հޅ$,Q _#`h50}.X/CSd>[)Uj?B NM h,W0R1AunV4R7/+QHdbdHd $T@QF)@qFPַjfj\/L jỴE_dXh7kjj/,l,gڑ&#Dk fY !" VkVQa0Ud@VY L$uFJ5896>=U/j6\tW,6 _h%]>ShLRD$@%:<*TГ/<V A+zyfjqv FKTSҕD_qfPOH=t!tCCNHO3?҈NH%ˍcELÕ%hO]*/V4^_`>; }2m5Lh\[PCKc+#anɗ v} Tg LӢ~rH|S\ 7AHy}oI?#uUOAAwkY,"~Tca, ~: S@Jq|h=au!$qP&)0:%1%XW*x k@c/v}Lh[Zo.hDBk Vk[ITR!cRN+j@ _nmcrHdQc=ijwS'+ 򰖀E!CxRti PjJ@j&DQ[|K1xɸyMOjHD94?ͨ.# WV@$=ŀFN6],4}B^!7>ȊB?"ÈInVY`mGd}k< iC与jy~T/0=K /FT FSM Pc@`3C2 PdU>A>PhG3jX T($h#k*-\K+V ih)@)Fl  &wJ#ŗ5Ee:gH|Q#qu19F|(yKZ×v· "Ftk$^Dm8b ?8XI D;=At7gAHi\IOx,}^b?m x%%^s 4.cz@t[ .E?4 'F.=>rF%#=t?St { XԖXs4\1V,u][ӗk]a!> fCFN`UOtHu?')ťŤFL:Ght2!\[oQ??iDžnhĽс2W%$ux; {T,ꑴs7MwiWW8~_~ 97Af"|o%/khjn/_B?)) gu~L^u&ЩCxK RTet *uq[e!Vj`hN^"Ƭ'p:#SD11uw_} N\5oSa6omWHCwb&2!Bߨ0XtVWZ`5u:PS&WFLviYLYa4va!S"}@ʓ(NY>W &[Rx?VhY_@``\Ƹ8Zr Y)XH H*CC޲*W*a-@ܚD;w DײW! IFQyĖy8Sz QAqUΙʡRH's$^ʶh9= W \4YKQh<0RUP3we0jLM c % -:tOH2CZNVX 3iV :ShVhE CjN%CUJeEa$HpL!kjt8c8ZG8](zV{-J\PsIr*Sf] JHZM^i~EjCNFU|Kzyh(GK RqbZ8pLLA ) ?dV!HV{ -J<0Bj-WRhqbسFPcsD@iH8U?@,gjn?ih⃉h!b=Y 2KSQR$pPИFY~mS`ZH&RvRC @$|w0R S`!-2TyI 8mCH]ys".łqP6&i \5ZCnL-N?l|u7mUp@wUF }կ(Eev"jkU:lmtlKX>H x@NcFR0!12XLffh+: ky蛛 \CKPQRrrPL 5h b&I$&a!,K%gh@$ UVv Ce=EB)!?J(SWwIY 0 dP+.l%!tP4M/lJU*Uk87d6UBE'Qoӹl5= zOj#8TEc!!SSG ~ x#sS\Bd,h(C\X9rN$+C`.IMS^iEV(h y<Z6F)Z߃H[WFh0i%\0߿fmh`[#ɒYAsah¹I [C&/F9T3X7r|x4._$Pu@pjM>jS=jy J j߯!3\V$  NQ$VBE\??0:?L,w WDܿyBN[Pʺh?%6?_\҅j& Cb@8 ]p4ߩtƁ@ 5^'(q~ŀCӋr$tCMi{hP6?=XѢsS;LAtWx S,U$ m)($*p{x 6jAKuStBO! JO)J3JupuGt` @f^@U;~(nx$V0ĢUUU4b?8;MSF ޔ6aV1'[=|OH3-/ڡAݨWBW'8:#J/pa [_r{r &W}RÉ)jt9,Q 3ZhHd0e(*66ӿ>6Ju0ÌZ hX ˙M଍A (F &W!`"1:58}U p H) WE?:,BMz>8ppOIu~C > u| J[?^cHUV$ RC#c m ziWN6s΀'_QAGgGY<\$#$l#o K|1;HT}1v,_H(t}qm;1EЍp 'L IX'P dABHF}eH$xp9!+|O4 9w$rJ$}0Z fʍ[\KN}A<|-SuוVuW wA9=\={fWZ}o>Z@NI(ݰ^"  |%T͕^0;^/ Z)ࣄ28 JtMq8GIxL+"{Z;?0߰)A@߅)Ju}+8u۾:5A|Q14~t9?'9%ݫlbc^]\H%MW+hH;<tPZw_|uVҋ2!bFpލOw%{&!+e'7  `WWe45AVFva[ncv 8BxSV|-m'^fG n[ &0y?ij`?1,8 ae_B[?P :څUQ <^DP`qP80HIpw5C+.$!ePZ%,W@!t&F߳&N룄`t\(}v iPtK- "S8FOD3ۣ!xŽJ!:IT9/\I\(X54p3u9),C$kx_ ğ;n` ]Q_ zAJht&GKDj (h h_#8èx1? w ??|2C/lj `vE~ `Gƨq1!1*݆Ħd~O~Ih@DPL#Qh\ /T&\ kGդhj|[x]PloBfDT7,yv3Z !~f Z* [/ 2'oi`bBHщ/]u'U4 `ugA7pX;uBc@!Tk wrG@D#Y9s)ƵDL-1 + ~HTWCXP I'h$$Y uxh}L4 >lGڦ W?2c(h@>2u=x/MM,^0EH1B2! ]lRN[_VA.РW84@Mb*GJsCo&%l98jv1u֤ jw$b#P9@:*(X 0&㰕oJ!5- S(E {xXGz(Uy$\ڋGR'g+[PTPтt #);h2cpT_KuT:,U$ hh*)Z7T3ÉT)D`;t` Zh GĶp ;|r#L>Qd %u[fCjK⥑K_EUSM%B)dC2dSx]%_~j>@׾Au\X30* ,? afA$F~_ NAE@3 D4dSSFC S(0V gtUO+50CCdy8.M91AhJOWRWp1P :½l@ U Cs 2݅tQЋz1L*b_u"Co ~j:4 WW\ : xdd5xFtnC-@k1`,~/U9,@YP)oC[؃ECs]t X @E)[u 3XP p & IރjQ_Sp0V.sHm;xL+XI{CK}uYG 9^kf?BsA  6% Is8%)pyWP K#G"CU z]ſhb ^8]u!HqHxXu_H*/=Nx3TLhrG==/ ͉J-3N}ި2WzGZV4&l*nh}D_51_]h֪;ᕍaKkư78 6J#%ڲ/@. #9FjPUn4!B'.pL}5W\=M1T,FA081P"p%\:pw VDdoILD>J k~8}‹08&o_Up!2p!P1O ? ||$_ P | X0 )10r@)WQǤ~PFyW]00f^#' N^LS|&  !V!HA℗_ / b|`X9th_X`Sp ohbLr&"0ijXCXDt3=Ej|&DHćH; ,'DV/(D^< Xȕ/~-.jm %+#CJ~D@HNH)XȀDAHSr\< Q_4_jQ_y-~lM8!'Tbb-BNbj8(k`BB^VW --s&VY:ȓC jShbi ??mhU-fT?e>L"(PW d)Ho( _nl~0_6`.41uӪ,Wk[Y+^b@vFdV{QlDlC1H|تD8t|Q8K 0d@B8CCLV7Ehl 4{zPV"CyLQTDmP@2MK&@!d=+V:Cl!4&{#etFtM8jжUpQ? @ p 0046hvolIoXITeT53l#9D30gKoM@΋-\xg @ҜW2> T}.C ne NCn[^a6 e|C#.(^nv “uǓ|~n)8i)x4l>x cV7,ϋs0!Ȁ4Wؓ)X{_LRqPT(+ 09$8 !$QtP<ɀNA3ņ+˙iUb|IH,Dˎ 6.+TVӦ)ɼLH+H4P`0xK$:` G\;34Z(z4 Ŭy,׀X~D {-V3V{ Q#MJa8HP >kl2#\#-w0#+ܼ  H@D&WsL| # 8 98PHi$l8 !i42@L(, F0ao5(R\0ToPg遘ϩ}9ȸ.L-]T f8\/:l~ S(G`` P@߾p83 #FL\)Ph"yY$,H 4~@lRbA>1մ.NI($*%=Q/^GK Gٽ!#R%T V#127"cDi 34$"i`| fvIW<@.Tp,7S&bk| \ۉ!}D6P# 4iil2!플HL2 <rOn‘| &*D\D$OvaD*`'0MӦ`C4Hɓi:lv,{8|(nQ<k l8\2@0@`B>{0(sk82 $o8 2@(L6@<ǦPRTc0s"zyֶ0bNNk`L8<+GQL3|*.sU@=M\NN^v\ll#M݉P dHl r`a:.GL( $3Nk"Ghi 8\0Bx,$gup$OaEz|Nf8\S`H $bА  i,c pfd44A 4CL,E<<q <|ui\|(D,f*NDD[r0I4H 44l4Hl`!f(w O( H320D0L08E H$8Q2!89d@(,@99@a~lxmP'7.fA_V.3|NXWHF/(Vx˲مT֋1lP pre`ʪ gn0 sVh)YK$-}Z˺%pJ)Ov#},M%H(׬" ׬'׬׬G BM`hV,NF\2bUwWjYhcKR@It=D `j ذR#> V1 h|@ Jx`p`-"tj?EU4P".0PvRQ,)9xxJe}NRx*R)”_{ẍ́|m_x3ZzىL+p6m$mӴۅ-uLmc?0puˋ eB#砈xhB}$R'YR6(i-B]Dn+›An}(}MBW+ʍ<`* f<]2p e[ޢ.Iզ?L (@̀j;BE2TT ۟?9"1?]G:$ St ^I<b% svhC x l(>~;,;rT sH}0]Npu@l{+Jic6\?@!P#_ʟ&B"TK2l@khu;T@t| %jR= )[)VS K` r4d p7}nQ /5:cq$0[H $qnlqoYVK0QWěT/ ҃_ -C`ؤ3` EL)`һZKX+B@tXUi6Ha 9+`LkйKmX Q!1QPRX0&uOuw+DCvH _,$4UhKn 0dAA8-KX8@ߤZJK Ol.a e EtgUeP[jD}9hPɥ>]kh&\eZe_ #ՈPudyu}z;oĂ@Dxe-Ke) TpX M L>)W0eLrg{Fh%IMDR}n2h/~)s>6'ϰ7׷UHSWPl Te0ZHU!%@@u=hrjv۶.g`d-C9LWO-8œ V{ŜUe/ ܼ'BNHLG4pVYQ @DKPH*t5 wKCt5(#gΖA|ǮX m)u )TcAB#OUY>X205ԵJd84qZ`~%^W`,A. 4Q%H|7L~!bPLAGĆdTT|f\_t,MQ k48<4&(PXa`VrIE.=1iZXLQH`z8TV0BQ$Bkud;@Khiw-d CEFeeHduѴ1=ZT'dR >2Ȉ Ci灣ϋT2ͮ?< "1Ժ6Sl Le.TC hC!<`"0G:  ~؍֛++ߊ 2AMh uSC%0“O! *ˠ?}HG} >֊VA` (}:CI""uWYig,p&el4dlن+9@rq vmމisYiߠ;(ZDhAhL,p$8,{[/5qW( hHUav-A2T7=t,"î }[ D$3`-H@5`(\_HRk3D ݡ "D9Ulak ӎ8u, si! 1]~(FdXًS*cLk^X$ 5SH ,f*JAB\ GJ:, X/:t#*܎7Ebԉ3h%$llqRy݃Ɉ[c[$x;'BJt,}C^4 청6'nlX3J,҈͌rlSHG#P=tou*lw)oP3"{2,<*% %\1p|}Kc3w|<ƆHК8<`Ӕ͜Fp PU1M(ynG0Ҵ0Xوb͞3quVE4p!Ф֠TF)թqډ?Tf߁@!F?2%WOO9$GPOTdOavEHx q0H~H]$aN/93UHU-(I?x1 |P( ]#H SP @zWiO-lh'vUMLHNLIa|וYRj߱&150XµׂJ?l@#ƥ`PpE%P 0o6kD=FXQAY{ZU@re֍KB{ D,3QƏVNI13 2 |2tb<- kˬs w.VpeI8dd%g}޾N I#+# +]!~ vO +; E IÃO -5v)+(#i4pm(i·+# M<ܶZMJ˫^##W‹ +4+{<* <'VP *// j%9_qh0`$a:| < +cCSih&Z'C}C;0CsI TCVIel؉_F<B/$k_uBgwG6r}|WGoI G@kcZJG`f`@QG& TĈ2<6w[JC=F?FLgd@FCFC- 3O}jO|be@Օ6q)dL F}_:zJ BIh{Jb%(2j&q3AJBAmP[3 BN[VTJ6G27O&v[R!u3Q#VBŸF"nL@E<( 3KR#&6 _C^6s]N3!%lr,7?teEMQ[tEU E^8Em-8ʎJ|eEiSLtO}:5 .rt9B_N=LzZ*SC IIi#ͮ1 ;AT42(APAC9B}%m@AeIZQhEQYHQ_bM"%`t#1A+ց ZXK ՈU.BMu]T+3^v;g00@|ކ"QŎ&V`Hz#it^\O3H-7n|wF~, !S[eea߬`NI'| ۛ89uJUC gE]E<iEMWּV̦iYL4Mb<\P *|<\ZU<\< (@ ,X!8 |*[SG*("r $rPr*> )>iNP z 'NF] )ݝA2'")@AqB z ayr/ WR)Sȁho} 6[P1Q&F c]KYlcv.gTeg}5niH݅ˆ{yo^0X[a,Noxk, BI/ʰ/ +K+'@+bPUfGJ;Ej8$^.$tI~yG@JIO٘%( WXcWw H. m+EeE0I22*S%anI%L1A+Ae l~ B;bOl(P@dKTz\{2 K=igei9##99=PJ JLdHdž@`/9N_ٍA^N@ QZ(z $U`h<ZuXmFYZ\YvЮSQrHN <_bV`ri pa HPOhGP΃J^tw R#ݠX}QfY^  0L Lq|.3\@彄T`f`U4Ý4:0ap x g*i@<84 wwIsc%ck$#&'A5i)<($-HET< OMEt@FB0G{%yg0n`0d9nݒ+N,,FFN^F07F!;;w:F,(1r2!4-"aEѢA8'7`I,ԤRHLO <1 9SoM\p"'/-.8'&؊A0,8(4I@c4ot)ȫ+,b"DT B,'(Fu@q\>C}HQX&HX<_ Pr P+: s3"ƒ3 -uwG$oNNV=0\N\ !WvdF>NR6 4Lo?3k ׿wwᚤJP^̐\{LdHJ o%@$sp2 u [# ώZՋ)'(|,S "+K{i-6/"/!e10h$2 3X.K>s4z U@ 5P687m~` Ga}W_X;*$+f-8 C;)I*)*)iFF*+*+*i&+,+,d+,-,ff-,-.I-.-./hiFF./.UJXB ӈx)i 6* X+c᠗0-:/K(3*_NFO9&Q,_@*A>PMwTR+Ϥ( :ħ4$]hL6EwYoy {4lSFL68 u $^B<^dѥ3(5t(\ػdT( 0O8PcєDN(!EǷXHH@|^ %\}`;E;vBɞ¨!M9Ӵ[(,ia%Y6M hiM4ͬtd4i.Slue4MjcYK+o˦i#n"V4? "y,i-$'"(9e!,"#A$' @"k%'CⰈq9b,Q`!< =0[%=ԉ:v"KAL$M%lg<@*p@. .Y/ S &HE\s@ fPUDm0`T=d@MSwH?X2'H4+ֆqn yOOWOO'% G>Oخ27 ?g(0"ֿԏLyLLiKHnLo@dpL$T`yYTf (%f#hPMxLjp{Qyƥ8 5L 4=Z\5fa/6/52V7k36& 8c768iH989:ӆ9.;;7;&L:<38TT^>rFx'bUZk40Jk: !N.i/ j>]e_>3İ!38Qd^lA3X, F£u_400dV 4 wja>!:~CFf~Tf")D:PB ;y.|j@lo!$BIL/GB7PSXv@c Fӻ5B+SB$jP0^čEkLGCBݪHR &,DW` }9 mrt(>'%N,`&Xeż8 D$ 3טHqЛ4TA]J*rUɋ)I8$19FO/Q cdZHf_[0d\'2Md?;+aOUoiJ4w PFoA*CG~( kaz46P*MAGԿlU9蕉%@ԟJ,UASQ楳/2U$OȪU|u|R0Hc@ΨV-@%l>1s&DQ! YKCuZF"N ًFDam&_Lg9hoSQx0pSLp!t8W" oLkn HQٿLtz4p!#(.Q4Fɘah3s w 8 RWa,9Yz@;uKi(o?dh4U$;,'H 5"V:Ȗ㳥Ft0PZ #YtOUt@LQ%-:ª8HRQL$0]UEt 2f Y})Q@hFHu1*c a3pPx)[2&V}* ^eSAC{g Yp UW(,ǐ4f<8U4StM`14U@'Jwnoi_VԠܤ Lu *]P +e` ;!- W QH^USQZ߅*ظvj-% Dr,G|;~hEd}!_+t T_QuHFGe9\`p2%p';a#:Wh6! h h$_ZhHÌΧQ6FC (_qt\d_d`cpmX gYT\P4MD4$_4MH<8`]ht-PehO/R\yt|uQQUGfK!OAS=@=),uXC#Fp9 _\+?6W rPxxD-;Xu6qՁc[%C eSxq Qmft;p@t{9}lc(RH{tVx* a2H I`EoeyvP!%rIM;gEDjlhif:E4V 903]lvZ9Ғ0҅o)|+?L8,|$h#<\ NSxsA1PUR;r[0= :#f"=,}J%F}2:1^:578^s n0,>,1UN IdNM24xmavkL(P-h`)i85IC_i B;*.-B ?$>Am9D~ x9k@?Pb}BB{ސv w,01 r㚗U B:2@_s$<s8mvGBjNNA;O|f /h ^ 3-8=4=lDwځ ~L@yX*P4P0{"b L()]%T,0lv._Ü HG:1TP4hVHfIQLuohQ罓h&K 94A7pRh>uLlSTR M-rvfRUh4]p ?IZ-5mv)pQU#aMvy;rr ɢ#dDPP[ Ԋ`L_QO+$+d+  h;OuskGh_W<3voh.pDUn56 3I v;kcv㹋HtU|Ew4G=rEAJs>\vILpKӫtH! JH7۾.JDpau0X"+t}0t,9 (QH_Q4ġ0ܴ ޺Ht5 $H B]HHhJ?܏=t M:gk4 a)aQ&Yn28Jֲ\[C.CtJp&>W3,opPst% ij dde$˓V\V5`I ym tB[T V"tޅN9J_Lq$_ dSD(C?-;.DD|@hlj])L))]K^4҄$Ym>B=iOt.NѹINuhS2],3Aj,MG 0֥PhX4"62kL<Q:I($S28\4V<=-0JAtЂ{Z ӟHo[J}p4 ;s+κr B W(TVT$Vp$h* CAБ5 VD lzB远 _\ &SU -YV$@rh ӭAl9b{Ll m.b\I,68[ZRtD'K)VGl2Z|d LMTSuXx$t:UrH3.&v%1P->4RB\H+jkfa[i{SUuU[WM&X,B$` Deqc(@@SyX #~Lsʹ6uS0p5fkKa G'~@#,;gUǢ"Wy fEs&|\"g `yI[&K1[_pWP]Z t:VTf;yWx 3< #Ԓ,:W8<^ 0FPVE&s,HSKnIR4$eN$=Ng-(X0Z[L<_Rt#U(Cix6]_Olhu6 Dq)`\Jd\\M@ A dh/e6^{@?H$.\{cζ3W\7K^-`V¸^߄FSt6 @ C!9wi_ѕW;Rs~h) Z1ZQ%deSW画65wS#R ڮUjLifVM^ `'JO,Hh.4DD#hk>a-eG6"'0"+bLa;ێ{Sjd\Sڌ|0O hޮ1ijxG<5 S}&G@j W@(OPR'˘c&xjlW&NaΧi:~$T @&hԧ2vqAÁ) 6VZLх(([?k0?zW jioX/%\PFec= Cµ% _ 1C0 <Ή9^PSyԗ;]<Ź }^;uJHU.h()m qT%,[Tth5LI_7ό"5_`(#(hґ'y,@^qCjFlKPIhE?[r 00R ȀHhT P7F AHNdVykWrU,'U8UkID|RIhj+\PU$zǽ n"q'\ItkM"5h~Zcvjf0 SH>_xm,$%a|WujWW71@,0_ h%TFExYqURIuD㄰(ɋQnKĭ|cP 0WNK4OJ $(4 ,aQA*K}4pAE80 '0@ TiDm H;ʸD-FhVURG ɍF@$Y( bRWPu7FR3} NK lup3a8?BK \uȡ%Q#@,->;rX-od kcThm5-A,LsRU8XDCS{$CCu9_4H Ր AUaWdid$eB@,A|wH Glje:bBLL`^4ZB^#I[ sdFdd䑄048dd<@tw&kxNQHQVRzXq,Q@405jPUF!?QPTI(NBKùNi%!`!Bwqc //lpPS?TlL5{2`'Pg|nd!tMbmOa{}RhP&2r2L3vHd@e +d44e\5LNldgrv{eUj5.V Ը9$c䑅K.]([OJGW;ƫVX./( 5S?r%U B+R@8 Kҳ?#2d5n] tSesDM "S4 utD/hdgo2%έBa%j6h2 rh3Ac F*TE[8ʱ0t _ZW0@#$ XF/d$H0S0 P=TJXI)$.0l)0:`$|d $(,@40MA: ?XPn)t4WUM yEaWH{6XN@yQA |7 Wu=!uU,,+DAU NH'NDVSUSe*I[]ddyF(\`d^&ddhl\l%H/7WRQQP0dINɅ NFI@$ptqNNx|#ċ pqN$DsdI*(BتQ}P: 3n0dFյGVuY`( NQ =`ҌWSK& ʃβsX03L!_o#90 pgX3dB9(ix^A*^JH qQcJzeyaS8fYCUOjTt2rE#errrr $(,Y>,J@I.9Ut丗W,4 ݈9V_< n(@a vH ;D_djK 1!UBdh TRk,tDMp=!!!QOR9\+B`[̬p>¥">k`:@?'A)LVh$c.C$nm & CW,P%%t,vW' LoxW(d' HB2f &uLL$*2op:&',v+-bJ8?t/US64ɵHq& (uZ5khR`AC[s Q\2l!qOK0-ܱubbd]qAqGE0U%LQjsM 9;9TgCg0G'bS8 ?3Yb?ݼHibN_ۙ$8-uhoD|b2D "sui5t@aSTs A eSt( Qf !| C5e>DH|I;WS6 \@7i7>8={.]@) *9<ՐTF1 AMdOHNᦆ \6Y2m*ypIFp{ 0ItdO,W0PS^S/VVJf P; Fh!#{rNGLnN.¬ k³oW0!`P K4S?9R|UɈUQ'-lgdgpcxJP,}\UWU T0M=c9D= \€%?WU}0֩EP4a!uL(Cj6HϗslhaCq- S(P3ɞO]B8SA4a8AC  AZ/-2&h4rٳ <0drG#1Q@vK$Q[4J 12 F@qPVnWcWěq) 0i^ø.B9" ]O1a(i"!VPSu]C~>A 4rdQ̴"g"݋wϠta#$[p_ #HRfE@^;eUU}[ v"kM MuP>X\ .UVWh.V,%43  Gٵfu'i W{{m[RG]jVbE ,vU ݣ$J:~wWr򭹿S }+jUֶbVUt8n1Z0 <*:Ϗf '@0^B\nunAuCp;-dDKukI|,?H&PW9%L8 81SW<“NN)5guSw ,!|P$bR£T1Sx H$UlBLu"w XBRJ.ɤn2{T--hq n,0 c.\$OM a,QRv<4QtUAs;}ǂ8ZO9;f >kPU&FTbۈ<+DuxMS\_.r؁?wQA6!Ho4šC~vW}Z;~Y82=;UR}~70ןj XC{lPKIc$-z[10nS U+!X Qq9xS2"V0E88eQk1D{Ƅs@m Mx]XR>CG[:"J~  t*0F60`}QǕҥϢ+u|ut ulN  ͅH V 9 KZ\:`Rdi)` @H[E8t8NqU5vxY&G+nR3[fH.s/xg5P=4=td/?շEs i)@t!GH 2ȺL!10 ,}++((C \F.F%2̼8}}ZxeLa%XUd+CթtK#$8KXIȓބQ^RVL+\6D\&_MRPUSH\SjR4rHpD α;{yL.v-yV Qy3kIA,8$yQP瀍24\uu '~=N n:Sdk8zq[ W"@q ;/6 XWPeQb4F URpӦ 8#WP^PZU;2@ʴ[(X%,+SLO +F 4k ciז{~6qT;Me ltn҂!`` ! ߈} r$ٖ=zb#|48tjtf)}&SyXsDDb }\|2KyuFFuul/[~Si؏.PWQR16@:tH -Z#)Os OuA[ǐ [Ip*ȭ?(%k_FP/w;_c#V0cB+VNdPeꉽ t9*iV !t*_FA +HZ!uCSF3|iH 2W^+P ֭\Ď?4"˧ ZӃC %H@9&X[XD^#p IQ ;H<h;Izu?R~8\ /N~b-m-$A+U -r̵Ɂ`\x9;~0;Mt[TۧNtUS:&G4Zü PI(!z*^%l) bM @JO($wP[}JyerXU﷥+s!V< 7'6ώlt#%4T*'QXMv PLn&?UORj)dMuQ[S_Ge5KŋT@QͅyhdjsZ+G c +@ +wX=-c2]`-8wc t"Bk+]fOpuŒtVz9NuŬ%t:B6N Nb*YŒ}Ie9 l:2tGmFPNAJr p4 \@hIϤUN#B06@.3yS܏tV+.@j0S-]qvfuqJY=*H?O^ 3ÎQtd7p t#o$S#_Ǚ`A;(Cy P(#08_trTHƻI B 8X, 8ZtzY5u u`p#iʼ0Iީ=y+ G4@٦%oij Q6E-yL!.u2DP#5 L8@0}; ssu%vdQH1G@HY 6 |J Bp#|5!<~y˷;j| N{@y|ՀK$O,jnИh!OH <"_&X?sQh +) 3ApMHf)G_J0=*h(w~R@ 1Y S)Æm[܋c d\rByr%(dH2OTEUr"@`+#?H;@@3"?89 %dh$CR(iz1 Iiz_.PRj,8^-_GZl4„0=D: t[!xnSu;Cj`iDk,$6AS@l)U1v?I8u)O!ЀrB3>7V ㄇoVO udZr yK4lEa x/hmjl7WjAB:>Fd|20uMk1hg4=S@< mhFljmFK+5鐍wf!rOP:kh"_ ?1$n iKW1b i ֞`=Mt!~~,i 9<^"4^tw.aL>ڣ"@Q@A?(톉K@!Vj:`d L(rљa6Wy;#4iu %7t0 e)È@׿~U DHG]3K=;i+6jZUed":B+"6.܌SC,+mW.΍ bDٙ2 ufݓ:OV<2E.X]]XWå_hCD@~+,A٥~AxICAAT!) .{5Dg99jtF6 c#fs 0?=LAM\H7`]e)X\Lç쌴 IMj_ȋ=驂<I^ _?p _L`S_V]XV Eh$1v4$XL!$ 3 0ŀ._s^Xp?BI mԈ4WY"Ei˰}"{ `Ol]C@EZGkX tVs o@O8XT.fh9( VMA`-0bDP@&9nL8LQu!'"5P˰<қ5|E! f5 'N'Db}щ-W0-A&k? Jy_s1ZڨuMixMuV:u38Pɖ -o< !Xr-2u@U J`}MFf[JF嵇C7T'F5x-  <)2!\R6!'%`7 %-IHGF7] 9S oL`Sr!S9x!p%%VrdM_$FL8J ]' -I AαGs'AÃ/ P%" 5ݔu"$kԞP>W©ϔzF΋^$W EPS+ K/:>W.}pK~GM{Yda(!bJ"|x>@b*d/`aJ:l({A2[PbtQiIn/v20P1 Y0,&h\G)Zd R)h R!=P8fj[$ yIyZU]rL} -bPn݋G =+NJ0 aM uU销Y,`m+8 ՄC䣁u; le)x*WOJhܽ z'lhHHlzH`qWVu 7JP:8N=uTv%C=?Y)taZhR5rpZxxJX I8021yIGw BQhA0” yt/IT:yaUzx{zX{ɐ:+I!8DH7hd4ȡT)M;$ t5J{!Dj9AY gTRA }pW!;PyhpD8A`%\>άA*$P٢~=UKh[qUK"xK`eEW]CU%'Cp5 ,t) ~s^nW&H+&USHMP( /Y:!M{P)%vp89K;> U !sADTn. &wI( ~X;TVXGK7vjyB*-*iV,Jy]DLHVL,SdC뢤%t@ _0"XǷV,@B@e<.]U") |l[ bEBV!602!pN@4 ^7lzj\~Q e@HPO2p'\CE K٘[r%"ZW=N~4.J|u}># VR:Fh䨅=.U^Q46Q90ه0yyS4Gh!o[ i:TZBCC:%," s :[Ҍ6O%U;'ȢŨoA-CSAiWd!S#!0t)>/ z±x" lf}!SÎ+& <3r ~] l@,whVDU RYߦ:4RDe-j^Lc 'n|gj C& viWbaP_ &O+&!%9CM"WM(!VM{Õd*M)g'^W؊~3/xHT w(J8HLLXDWӠ Q-F֣s)d yfW1Wjm]21…AAd۫ KpEO\$ d pD)(:oW6‹Pf|;V0WwLUgYoV KjLv(l 4zY8Eo 9 .GI KQ _iT2$HKhd \D1n,d&׀T2ʈlX)MWG53 ؅r՘iY炀q~hKp!B?NPh4R #P's4om8Q{G? \$DZ ؐ86xs)|81!?&L8 Zd9vUaAbY}dI\ p$CPM-cl`჊>"oQs~HL`)[(cLw%o$(p9h9Z‡xRPS9 3F]eIzgG`_G-lOeWR.l aZ~ZhVj٬VQVWTIKE>BdnjLex Q;RNm{E c%Bmpv[^ 92Tv5Xh86#L*Vv 19$TF"߫k\._Hxx&EuӋ =jGBh|W^! wQU"*T%8|M勍A29H8J\ BLVyuWRS5qtlB,TUALzE].S9ĵ Mi@5,tƉI?@iTv#tBm3$ħWM joLQ6!3RCnprS0rQSU[VBtRi1F:C?{Fp!8/C$S*C! W6iU%bIETCVl75U8,aHaU[MڷD96 >RPP4,P)Z9_d rSmgPSKihW84qQq8:cɦPQt FRI;s,U76 Se}w2!GIV M wfvbt_ %vPbDG0;US&9d]IcxnF(Mu.W(o%y-hph8Hd'A"W۹5H4Ѿke,YT,{ M+$km=AbD٩,M!bU]y5U2;(C&828[HY,QBxJL!t/%?,u0nHc!m֌2y7J- t4KTf&i? {SAAb]4y$Q`Q-L)6q 0lOԯ[UWK2y8UWQT1oD<8qmN -jIRP疅tIt1l$`¤b/r>k8,&1U()M PKQ"q4C(ƔU%=_+N633KJ+YBGu[]"vMFX݀})w|M=$"hWI! U_1,ăգC?gw];u}480NX-vw=D _$")aD C$rD͑Lo3/VVVE3d@`ryS0  )RM%@W"QH`|4j!= 4ɇ+֑ĭ??8uGVVN;9.E"{Du}CFo8gPX|}5D`ŒP8g=‡\.\ #WKvHS5nmFUy0-R- 80[VFPMlp+^@4߆(.;%9fAN^bk͟r%WzKCUg9#$2 Z=2lY )FH 8 ,H )6DR+hJ,,h(G|jA+$/؟ٌPbVVI SSbp%EWq6T;& Qma F&+enoVQ%4l4prIVAdÕ!f;W$%_88cEl~rߙ6rXqd$Y|+xWB$tVW$0:8  KUWU70&΄TkP x wհ8A"Y rI^DPI=gkmZZD. Р k2/Q$X煘}A a% hxd( qޖUy@I $=Ms:$ bM˱62VUk9 .D[ ,@(r=`߯ .AE9EMZ_%?]d` @TKbN. 8 tQ% }\3P 4ZF y&t|}(Oh0(`CmƸ0QxAu ^7 lžlqC\4x w1uEa+=f3QZ?[ R{NQe3Y=MPhVXi[p)_ rEw9&v=\ O#2tMzY= y@\V[ywr&w2(4 &LRLap!t6 lGIk [EXI@%m{m3O<*Gm%81': N^@3 Ra.L CX p X)u)!<>3dR5q3W3S_Z V\ p+{fBp!k!M G!$djs uFUv ӺՁg^p+}6pp ,+v*X L`[hXw8|-$@hm#RY!H;y*9chU`WEH҈{HVL תbD+ΈTmAF( $LZ*ylD`@C.r ~q9 T23`pCi I!S!v؇ L&SH` e0XLĩ PHt,yWBj}{mt%fk2aXSSyL~oWx+ 9:jhE6wXFW=\~5=!.,O tå ~iHMNJx۱L|NIð~7iݴ@TSVw̵D ~Սi\CTjŐ"7 U-&@X uJ pfYVP[;RUUUwV+N"l ~?\'4jM~*C3U? G|FM"!yGu4 !!- f0P30̾tXFbwBQ#`bS.+ױ:c6vlI]׋HG |M*׎Ęm}C@PV~tPHƨm%}|; mRvC ߊ@f}Or򗟁H8E ?Zw 9UCfkE%q Sm6J6[z4P+2a%@ 4p,Ion! _,ZBDA#9R_Ģ2fj| vJ(u@"wJ oP HZ9 %%vm$fcU6] kHP!piL1#2Թ}kYuRkpMe9L-!htKHjjR,ct,?+.@\8wP™2'X@F^X #.p5j RF6FCR`~W24 O X?DtpJXkQĽ%y;!d~J`AB  8OO 8C+8ā-CLdX7-~OHǰ!VO«4`q U 3)@\2({\#VKݷ-t‚P> MYHS;4p}zGKv#Azt#GO ^('R Lt0`uTM | ʹ!0 !Zi&VIi)0!1I!U46 h_T(ۋet{Vt6F!EŐ'%ˆV9uH@ q[54+E=?@3LWbV .tQkȁb3ُvd@^!2B.kPRtxnLaH8!06cr8E HQ ״q$hm=DWtSVSR(@hf̒TƿЅƜ H;'!aEt9 紴Af#`r!G^D29sGY  }ֱ[UW*2U?$ZFr* 0NS+3w$/h SeWS97p7ki,"y4V w80]GmQ#o=9O\%~u@nt֜;SKP@w~;~U8 ,[Ą -SL`9|~|D3qWE@@>7䋸iW:WwY~3:@.ރF[u:U~.` O:8tuZ@k 2|ױ wMKѿ4RaDK44%4퐭K^6Z$J(r\OEmu)\[ESV~X0J"Q%ֶ~Iu*u#)޿+( ^ô@80mrm 0^(r,l>C _$X1$[M0BJk<"&rA]1\]sgD3vcPiM$zJʖV-/0/#L1t\F}|L:aa@=OcH~]E!  ?F8AXNGb}s |KMC%gu#"vuDizEIA6eW"Q;uȔV+ۋ? #%AM֐]^+),U $QmT CY h# [,$CGwGH$X+tbXx('҅AZy]y[#8r +] (q0Nu.]8*} %p?MNup$M8"I$JYDžD$DP$$hiA&.MR'\V,RSFD !Q񐑫:4 K,UbJLOgL/]#KjS. u;&JUCJ5&yW\,N7:h<I FL dP%CJ쀅@qq r;;Pd m"|/rl?PbH:-qEyV~jZ$mjoyˌ-%A7 &C;~EPnJ:&'+a{(ƩG%4X%Yj~#^IUq;~&tGa?^` MmOlG SO^[f }p'Qro7j$V]ـ94H0  "^aB+*|w|1u A]?V.AsYPZГMK  ~Sm#%%^]hiq Rr;jw3k@ƒiXM(3|QtLx1VE*[DFl||ILP(u TFMh.v, $w$а^F}L7#0䊾++ϖфI4Xgc9ФCDDw jXq ?(N\@F;aj-hhy4 u 'ݜ)}C3xRj7?@w::@NASJ0`Y~x9$[P%U6u)}IRܟ=s\A@(x:_[ 8PPdD2\3FIuc0X$){_P[+iF=(>f,?0@ 4 9k҇%:;2A ++IhqMt0 0X ( ,iFf  d`J#m?KuDC ?%-#%:ҧЅ).H\8LP_.yf3hy;~QI;CTu j|za0Ê Bai]@LKw<uCW]UV$W`B+L4֊G2ʖ52#36T3,<.,O4(< &5 ۠!:TZfsVKIyTOCgr"xa\8Pk` ,ycA;~<ԓdvw$m] :j8Hu2$W< [ṁgh8^ŏ)%+yT,DAy`GQ_h˪0yՂA.sـl KWzOK+uBBDB6V/lVizg,A;DP8p7 ( B$F ~u<\Xo!EpQJn%5Cf$>YP}CgA%rW@pRr{jdcj#hPr"ym1Br5 ĩA#]I_PFBK`P$q#Cɀq#&dq2dھik3{y%WKh=$C*4k~Uŀ05E2]/H͸iZFݚ-iq=0T99 Q'%0%kq?SugBNA.t u.L+V&)jhE7=t#ιXW#!#ro %r B_ 簮q SK``֦_~pPX``hTH<xj(l q{U!A)σ68?Pijv|heJW\Wb:-KlEM1WRU_&QPڅ,3)Sla!njy⼊ab)y?O܇ 0qi \ 6pHq,Ts )"7\Fzj;Q #4Kd!>SP6 9`lb.N#3b&KAWRVgMeHWj8t4arspbݜEh Ch40hw ؛KBٙ!RnxQEV""a)p8ؿp cdY_tSNn {oXH? {="Rb`oJZu1/LMUGWV$$ *'r̢v ?@BpF:j lUxuzA8 o;T}&'4{&{$Ǵ9GpLJaE A4I'wA؄EBnh _t I @d NhcX _J@*@1 rQFՂ2,PMӴa?r6GV5a°ҙv o YF>{aÉot }Mu+! )6^ 'AD%?VԢt_pU>D@xC .8W/Qry &&qdをk AxN. K/;uD> F !qƎA HKIFs5A~%JS(|y?HF\+ÅPux3h'C±DKc@$u/W_ qu<;4)iex½Z%9H<ƉEzE)!zAXIa4bsQAs(Ohb3֢hi#:&S[wHωVAG "LxvH'+BRs*toQQŅ;R X t# ׹Pp SVv+Iy b?hC=?JhԱ[RPDjJMILA  ñJ 7QY.< Hi_/X \8W$h}鳱HRh+c*ĿvBAʶӴ MB)953V?g HIt0hi4$t"ZƒX8\hڻ}\@&룹W c !)V\7 L1+E^S8 ֻv]gEi Pɲ - y0H1!xXb/h R'DZ&hn0g 98?`|(H3̀kSߛȀ!xUhb'L={NVPjRJFlsB%r(P uH*xY]V`I-?˂NپVn7C'|™7U{+{ ً2I*GUi OPvoiqmb/P!a6}P !<PxWU oCA=Mdv G %mh$Q.)Wy!!`!$D  hAvu  K@j$),(2 Ki[y䥂b]#)¿lL00 Cqzbix3jU-&.䖅BXUIo %4!Q}Oabgr[jnM2:G]@=(ύ8jdPy钁UVojE`!eM/a<ń_LjxK;A41"!c4j BhG9"|O! e~HkaLcAfveg8gL FC{6X"nc'+!l h@\atWT-&8`BS6 a- shJ0h䢬N ŖhAN+A=uƄhIX^C# iuKN{t$8Dp6ٰԍʯ\)#98|+2 _! x!?AIgDPQ-R{k+ Yț&.E셊ESih׏Bl7= ;Hh_?W5Bl[$uXhP/š;Ap8 fA(PJɀ"^1J_)c"u KU,<*_<1ɛuHwisp{RWhEj4_ =$atiz YXtDCd%c%', -gا6x|?&ȸMs㠗?EÝ\ DćɌ\Nm)A>#7x",L4qo& Y0I a ?ܷ!$|`4&8WP ( 9; )ߜZ$5~ PU0Rxē)a "1I7uq?4Xmh#)t&Xk3$l1JUn wY )8%_iሸa_1i@t0bP4 WV& =Sɤ]US6DQS'״x@s'4L 5PE0Ot3KU; rj {@F1e0_FoQ<'EHHU! %@~"[4u M~X<^/h,'H wscl}e ˅nm>`0u`A\LC{),bJ]i;-2 5BVc$å..ikwB0%际1 $! 5[<)2A♆3}JEieY n%J4#.; RyK}v^P- /VDB_TAw2N xPyLP>h$ e@;̻TRmAonjV @ lp_4.Yx*A4& HT S$&Mf$RL"&pXCp&kP:yXof!3SV34~  U L4y0 *AE*ViV| h,7P`B i0h{eq,X(Qk 3pXn$\&>M\z]RPفяPƚ!iuGCh{[ O!xjw)1lqc$BV(Ә<6;-ϛYl< "<`/in`XaznLo7T75 r@i3TAjRqٖ*ezOXnډw`KO[%F#$OP (E;<81G_A% 6|2W^`'C$W`p-`֘3^]kKLɜsRuPSյT6xbiKuAi:ȉP sI`ˋU8iiRlȍ0̲UDkj{\%UP_Wd+si !"dL_'S mSs&e"/qx{}9\$~,#%Wa)K@P˓%܆%tL Mi60UR|p;l ^lm ce,s ?DTi *W_55!Y;VڌQ} |Hr=> >ds?l C}-(6h9cы!bDVtp$"~TԠ46 Ei\@R CHd&HH_:]؁k]Nj@ n-;jixİh)|ju#v ) ӮaAJx]p[XJ" cu_b{&Ua i4()LˤSB2rךP!1 | "hh7ͱ>\f h$SwVY*~/^;( d$%0Lư {Lv1$\G@''q砕}1hD9iw(5Fɴaa"Lum{!n -mWWHnqYVAXbã .hLP"s*n^;lPi+4:x.uhB-K>SPQ.aI?f研 \?$`"h5@*?QAX 724Y 5EꐜLF?/RAaAu(q{m]KQ?tvBU$F)T)\l vY#ܾ\VhaOc`0j hK?931h4Z2lj h p{(nh? Z_4Q336V8?fv^xq#_X36s$BP]"JTA.} ($q'}^~|^J Y^ Iw t=i MD nt@Qxt7oEUHd(&KCj{QDO$5k8 Wo!,6R42?F J( \puVeph)Fc ţƴ0¶AM܉QRGK[X41|HWXX ZFU>O-K8?sXu 5-GA*QTlCBIyag#K⥊6x Aa $Fʱ!\0gwGr(kYJ G 3-jiPzcIV&lB: ) IF }c`"K /AIKW\C̟AtBͿF \lA+ ,M9t'Bx|+%'X580 Ty 8 -ݹ/$(u<^i oҎML,l uҬTŠe``Æ~3+!&QdSH.t6(aZ&N,>yghkj(-0rLWIhOd.lSR Y QE&@g|d|ˍ>0SoQ++)Bjz {;8aBtɦF@ Ny8VU/oh< MP(QE,ؐ3\&lNW.J#ܰ \@T)Q["j}tR%nV4hD%Pm $VS4vqMހ,)Y"(C/H$$}CSj?S 0)I,p ,08EpcɊ1ڭ%ϊ² P&?Z_0 W7" yK@>,a0t:1l0%8A1 T4?3srOuÔ\,1] %P'R:Q:;FWX ;LLeLԶY;RÖ%IhX9`,v#hhрg!a,hpOe"vsa:cע l ‡O?Qq\0P(35 Rփ/A ec#;rz@Od 6lshqw D+R-19t%i.ݬ$%%ۉ(1m*GԁXm5S0Z¥{hQU|MjL|VQ# NLZBḥߍKD9 iP1__ZX2\\Bk__uF?Oee%.T'V  Gݖ&.1 ZAO 8D"-|Gu聈y5; o nQea9k&(,We}|Bx XU\`8, ;>mpU?f֔6ZRq#H׀u'Ñ xJd|*jU#In 8 D%kW]R|dghФ?&%PAt#=]|T;(u@+o9Rj]o[}t`;2n8f1T3Æp9 7-tk1K U(k0{5Q?7UiNGMt"{IuPu/VAm$Rghȥ!&_U?0z'2HL .q2gp74LVoH$ot S#oWH HPUe1Ve@d|Hm(Uk."bK@p8"Q"dPZLM'i:Wou%shӱnh5?e/i0pykDq*. p~hm>$th8C[RQ$D!3'-Ti\|hV y_^ _$mh)[Et'  -;%h %|WA:,dPOUHa,n{jITu XQf/-4i G((c@r}kUHQB#ReR4QVSLFS C,^c; Sֈ5eEɔG*[<,>RSEprQzr Y kZ<aSP³;@LDekɁ4b EO\RCR ;?? @dg jCRzZBW86,qfVW3;liV3w H_磲9G(?+keDe92K!0{)%jAWv 7,ہT4RQ )`ht`^l<([{eë<*S(SX(4z8XHEA.(;h \ L 4[5GB܎ kSK& N< 3qHqܩ8F7(o ӀSUDE[Qkր @ZaEOPS5;aCHTzj4V2AB2Qr{_4fP;\@zH%1JD"VO%1 paVBynYT{k\Wr=Փ;n'HmW1{meL9[0v^Oɗ6HO `w""So004`40}9Ҟ$D7`4S4 $8iaѽ=` l-$ 8@Φ^[WT5 K ($u4,9: 4@+)VtWM@ M :TuPU຅.e o3wl`FUSc\#UPWuRUk>`10SI,8w;SZ%"x8@U]nWUU`OtD0-iHov ܧA j<$2-S <"x@[]4] O $$28u4減b9tktD|p84}.K,`iS1!`s+:Z,9U,$%G#y_EUGa"9]R8_Slf' ͧ^)RW\)(Jөf[-9[]!V?~`&%'t! ^Mi[B eAA 3DBd+U9weO~ ;;~!)3vRz wh% I3wLA8$"o("71S+ "v>7bfHop >`'u@  :~b{s x\+q5A88ʶ[8`ECKI>d$\l I6u%SI0uYф:鈕E MݏO'@xN`(\ԕxF<0x /vWBTU; 'C;]G[Pk4 <7"7mRPMPx0OU2WUKw" @5hDZUH(z ]%^7N  DMNK(1 _sSKH8H (]Mđ`!tަ72~2q*KMPid\XwB8IVt ,^H"9'*d=4a ,Vh%5NOI\UCB1~ 8o\m( B[3v?Νyq|Djxcd9:5{ypl_4JJU cn`NMShP0^ On HW@$R{l;h /Iz\WB "XdȈj Ɯ^Wh]pqV\ ~`qFM?Kj/6`@ԒL" fP[_=c6WI}ISt;WVZ't,!W/$ak-9tHANH^RoGH. ]Yq#b?/G a D06:{MX:8USV*Qbt ~'vJQNMo(E] H@uUpq4[I?4@ sԋ"AA Q jÙAEjE8 !<3Svr5 T4I}=B@,T"VMd< 0 t }aUQa*H'|WBfu*{Qw +9Ƃ'rRKSq^vQ9Bc@5L8jbnN3@@S+sQ~ 5;G ]@8Fo J6] ]ѫAC>M~*o;iv~\[AaL(вX`#ۍ(JU*{m<D|1MA1B`7Pg 9vQou0   PS'cŴ$+atZ7QhY3MboO;u J"nKt VЮI:F #' PK ZFFP'{X(0?_"&3g\&0e\V Áv7 ze1,Q)p?SV '{0ÿmVYB߸mwDq..V\@)t Hvx2*vB)t]ycJBA)1]tR'!TdvxLavBq.޶ 3;-]+ w W#ޓoXn<:D@ , U >@MU{1OHd=Fa ~h7DGoH1Jȿp:NqG ޖPuh|a6g c3h%Ђ.>XJA{o7,܉& $Oy^9EU\йTU]A!W&+ HH82s3[7P1Hڐ&wN}RKd!0jٝb$;Gt'fe9d}h ׁitb* "fG]W|HFDU1Mk\T SQ\LbsUԊsH^ J# *,.tFhV4!<ˏu5xP@%V`oEF魅Nyo&Ijle0ԋ̓e~6}h셭A8ةB%HH#!iruMk_jI$ P52( CRPB RU%%y 2|q-@X T-*Y8,˿9ȐH̅ Xɡ ɜ?tμC m,$_M$ :PHoV6f8]rh .<~<+$  . oP|õ1Sx-Hh!? !(3Ң&ukC@T׌2i|ZAs(QcR0>9KP; |Cp NgN/U|*+HN٥>DX U h WaxAv>O6K? M|*H J"@ <<;SPFC!ܸm@ӑith͵! e\(yHXI8F[x; F SHUEP'GI!$ C;"t)Eĵhm% hKt;nM[S]8t!G> t!҆~uj ?$4TE3 I,,Xuz8KJP9@8X@."OED@L`oVQ+j^l(vD!=H+3.@j `:j 2 [ Hc9TRC9Xc<倓 a&"atSOz s{R CiH1lmDY[{3.MQpQh|Iz,S: ޾\ -@@PtS0k,vR*~tRI? N",xP4 DD|[Z{DK|"ZTP-fLe DA8KY|! $%`=uwq&EJ?Ԡ,Gk8_ H>ohj QPᶄWGEFQ(ZXȗ_kghW6ĵ$D} _]@@ 9 xXL(6cgh U 2 ]HK4$p(VUq?e1]`NB]4ي$@* a,4G̩O*H-. φQ:Es: E4_R1N#st,H@x u?A7} \輣H/_%WRAͬӌFJ@'bAj { XAwW.B(pep̸tg2jBpMX'PkvHčn"aNxm3SW P?W89%'WW#1V%&_ږ .tRCH w1 M # Ʌo Ju0evHV) n+HN:_ Q6x85n5_9Mht0vÇ%W…yp27Cg - ,Td[6PKxsOvq0$"(8cQd,I}` BPym-tHq@cSCUquGCŶV`D-!nSA(#I9!{hwY϶v WRۡi&>p 4&o-vT.4bi;Xk(fRgA䵓e01?ȝ!95JZqL@k}K3BG j @rDThpVy%="`(04VQQ##E4O4[7Ia,EUSbl3;PYL`@$5=:q%~'h9pmA"}LǀS$ Pז0m<+M$cE4 qρ &U!HI$tMF$cU j[[VX]VEjl8ˈqp9Cu!9E 匤V( XkO%<8~b@$C;_yW}uƨ+7, acvoxtB@S븢 bB@+.K~,, }0H8}H: *}/141u8#$d)WxV-6oUZ/+M(4PxZJEo74S0X-M@dd&AzQ|Y}EOQuI %;9UAҸ} j^ \ 0= C f% d45פtU = J jsҌC?@UhdSx484[_u,hWgToe*e$>4ShWihi3A\d @h%iL X:L3fg}$LnLMϷ~FH%Ah}.&A2+hXpv ^R$.'hSkD )g6[4q4'Fi5{ w/![JZOHy'oJ&hur\IfUjpyhwJb9rvH.v %vv V:YobӴcu?(Kvh=KC3$Upؖ Xn(ԆQaV\p Wt *ރ M@2]O C|\@F ,muFj͉prwOmJlt|5J;/_F(xgf1A7F ?Uk`3 ::G@S+zCk +Q>7Z@&B Cv rZ+ؑ4/Pύhؠ. ]Gcl`tuF&@&~ o@)$HR_ /Q M!:[էJk: 2 uE I_`4 _8N43 R6+sNu[dh+"2@!61lpX@.z4&דAJ+ jyio'{kehquP' UFVM˻' %eYXw~\t 3H Xe-$ $$R?1L504_̫Ue vI]&)NAm>!X~J2ws##Hm|X BLT:h . aQd)M *E4!F> ЀV+Z#[$28*@apI|a ;õS93!Yk,p9O;e\cdCQc5UlbXhA+$shVn)cvE*F5ML?P|AH I  N{h]`=?ZxD0%sskp@0i`2SC*RH96 ЊP0'%h[ v)a Q k#%= JFI +5lo) ʼn ȅ|g)fxpA;Qa - =QB$%4A<d/8@HdADX\ALPTZSyn1Lщۓ1 Rk {RD4HkI#+4M3;CKSM4M[cks6iHIuYͥMD%LX.+A8ӍT!ymj"?ɇ6gp.& f_WtށR%4NHn_x,I\R~ S( @"1?Y@nVPtGՁ, ZRL=Es]:0қ:@˟R,LƦ_15͗o,@w d &Q$ c em*; j>Qx@l!l #(.r &E? - `n PIKE WHJHrlo?;C; B@HD;JD0B-H@LzH&G'hF`t1"?P3< 8 fbh6e*`mi9m(/%/!%jg |&!o/@:(Du3[:<܀U_l %2 t-lU lbt;P]]aUiO I*6}=t! o%#ZuB] R uD&a!xuDw.z JkX #^۽Nlg]mucT~]]H(G2CQYٖd6}R(oq$m5Iu3o(aB< Oa32 } PXɠ|pfP0Ȱn|/=7@ ׉ g29I63u*H  =di'ʎJ"F"wMҰ2õ < hX -NBBӺh$F6VGx6Baր\B`ZxϕP:e/k8 XC`KdSAhM a%l,d<)s)A;č"22rO.\2ܺ+p^[ƒW4K}8tE`),aʼnL`s]Sc Pb¾fqAS'P1h_AE_aaT!fAO=OS$B,PSMTM{?ӎFLtbE!pLB?y˜}VR!T/)Ī;<ȅ<5txv\ Z#FrQ-#NiDǿo$2Q4 pD0u m$41c/l\ sn !S/cW/h[)9 hkMIh]N&j?i3  Z!U`xy.$S(,0^} *~4s[`ȼ4U- NrdhdžHL.6 c@}L%0=LF в,lptx|M<,\RxR  , .v-U ̬:H ?׋$}!9N>lN4LB,ӱ'CPUC2$<ڈ$?hp\>t?R< *>y_gp@h+HlZ;_Aj %x-_=M/m*)un86ͭ]s/,3.`(L6J7XI8[i3G`/·uL)D3\#t3ҹ&6rJN4A .&> XiJ/h2?z$0L)Ԅ%8bP GN J>YoFFHVcvM,7?Q_*(_l tbPB^W̢(if 秃?OjJh*W`hRv+ @(HU[,hE; %|OR.HpSӸJ`s`tC^ ρb$ӮaN2mAmB!6ZK^ U3,u \q3%Vqؒ}*hgSêa/I,  T,8@ P1QUl['#n"M۔(t"`WaVŋŐE 7^UlGAmV%r,b" XMQ۴]킫@.=dv\ ۠9!,hmWF,Ƀ2nK\DKpSlW nkM+J, AdQ!hU3N)6ѵw ][d NhG|1}M[_jIYGjN3lo%>VLб;jKr+P rKj,puM9Pl-hܵ_-ePL%8VehRɭ?@%S_jP!p!#IE }4TEZ`KU:tlR0 E^x`uX+ (,fӾ!ojFE /$L` KɤCC8P(oc(,LDCGj&0~hyPt}DIDH ^IuyRLU:+;'#MAc(`})>( CyGlte΅?FP>ōJSVW,s@C|+K(4qE >[!Q2A+E4uD^ ]jT'1*"-0+N1@h!`t:ED 8A6Rz?X6S():ǀX R,ϻ 1KcO Krh8 `YWku x˸8Epw%X[ dE *@zh?0n䋃;p7DM΍xHh*~;Hh2 plo$lClzhnc[r/ڗnyAvgSʕd-UP4`1ΉrDFJ02OxMY}UYaO0?LJ/Nuȍ .h2] !34waRF^pڍ=KwD$0P8A> 4ra-ct2f UeuI'HQl+#0Sq1<yE wAet!D?7&q!!ta,K2Y6%D-JG/*wHfw3UOYJ&YTI#S 䦌5 MT=Rާ/tD`/μ̙Qҁ&~JhIMP!ЂPbC0P`SJ̺F-Kh6@ lyVJ2R).cItJd"%Wd*핅HR3{A@x,W D<>#` ľR t#:4I ,-CF@<t.OȆ쇑H6Fj VmbŔZs Xg@B$f+= a{-Q8PD0FIʹ5((Ci8hL 223Eh@!hqPXz:@}|5KkA  9: P (QAܛYPDgKVC ;< =[) ,HFD,\SO/tJj2UK%$L`,C`#{VvjN.F@np$fWk%a"k9;I嶛,B3P rꪓSٺ`Clb*0[b^_Ny`&)% u*%dWsS"ttu*t,{gej a! mhrPds F4z=pq u%oL3=9(}O7her#۴L3q~ $C `g,l|-}_x-=2|Ⱦ?uV9VOp5 pL!ǭFpjh-՟5} ħ1u7>u"HjĨ 5Aǁ8pr 6VX$sG6< HtL࿒DnHjVX͔?1WU,-UaG@XHJ{0G& *uρ"I@DžT@ vU0V¸@0SH=;DF۳b=`M,x}v=ʾ3R88-RT{uVfi"V1~&5& PR5Od"060!||3RL)[$F06"4ԍ VT9l+0!8&xNy,8P u|W܌\Bf@_I\g]VnM ~P8d%$?4r\<*`\< uh`@_NI\LV=԰c،9-pE)xrulTLȨ5RІ T'9|}bL}"O$U|hN.h P0tkajMosP+T0sVp+VCzic5j 6|,+hFq~*s> 9nlt+,n8#Tk,LLرd"{ZJЙ~itr=Тҫo~ =0 ᵜ(@8@hУ7A?jeC,,. {*>MM&+w9MM?%@Mׇo`n KT@d$„)Tje@WQawS1h %B/PHR _5?/C4{DC\ e? x4@u.$kH%] M/TKT4v hSP $ .H4A29i>@_( كiGWT%+͊+hL!?I(G4! _GaJi=: Sv$h~mBN(]o06 tXSKsOhQWUSG+`\.s 2$ >y![-$:umKJ VSȴkcڇhiv"X 4QPW]d`$@ob#W,e+A$<95wE]k?V}E;|;LpY+hKjWA%i2V/\W@wSZM&4\_U In`}S\A`S!7 XIvo.}ЍBu $) ahJ_Yf̀XuYz/IC < +d9aXZ%j]R+{dH5 sh0R#؅nQ ӧIu.s6!^fϤR[? WM EU`P<7LY;\V5JP5i Hƨ4js[~>ɋj!KENa,ECO0kW@JzaaS0/}ABZ!C!ƄBE[P  )oҊ}Jt429 #M9%Pl_B)VЈbf7C@2KC~JsGЉ5HL%VN3~+bKNQ9X0!X G AA41A5DAW;#_\Ix >L.N|1W'$0Nja%tqC@s- /9SS4=SD4?/PVxhN D=};U l-$f%"+&b[{pAc~|rb_,@-k/ ФFj! wsQk6PYi蔉xI^L 9$B `=ss-`/ yL?KA@_zy i@܄{&p;l]'VrfG\t pCcM ?pSk<;ǧ GA8 XۙkΨ}q~& 09W(s4`^NZmKcY^2VLȞD۽ۍ$+e(bJP 4Rpjq-Ω]ƒRμL-i)9JP pW`^nwq n4k<0|ԙ|#|01,-avjyݤ%˯FJ]4 W"0I+(!cS KG-L/i#yU*NO܈a$KL׮ AE>dhYdie3$K-M43aʄlKfhdaN!>\̢N$ Isg0شIs3|wLҜ9|LhlhHіp h:pRShE ;2hk Nh{ZI2"BtTVh!ye88-=%8E |@OK! ^jV53Kh7,1(%':J,a,%IF@, [MX6P4IS}Q ҷRSIMm%!=ԥ o~HwJt540Bh^lңiEٴawztGꝥ. &\7CaT>mbqgB>Wa@  y6 &9 -\Κz@tzlXG 9@TqZ{¥8 pv C5#At= IT1惤% @ݗjN`D FoNy40 ::uJ/@%tGu" gh|5"HxP ' dU" #<>7 ٠J ڶ]$GWSn Ah^ @m<(t:L8nO,hDD4BEqKY3 E!K<.w' K FzogaJXAnyK?>?_:-t~%tzdtv=*uh9tD5L"&YA'4DMiLT 7`EI>t6d@E+$$lU.Ձl32'dyS{9$qi(g\‹1Shp a2N=Q%+ha(N781yo|ZhR0e(%G]h#0A<opV6+WmA`S*jl+QKEL\12(c%Wఁ|qAi u$ he4pDLQ}[vi*6`I@!,Hڃ_;((OB3a z_ m ~t.ԒS&/KzT0sd5Z&6A?hMhH3CmR @(œ}hi=d`wבc Fhf?d`_Z@h i]%՞7`y^\3uPJo:t82:s}R)!hB(=P-X_mVhd`ϥ 2*^WD͔QT((M7SCO8DCl>!#C,SBO `BaPVڄ %|I!LUO)7 V6l;U`y@7NASJCO Ö<\`Uf'y-k?uXl^H@즊 V V֊$jt2G)9\20HGQlo农dž0ZY)pg=Yĥ 2J_X( q CjM~.C5l#h[ͪrgsu߸`Mb0u8;_8sxl?IKN٠od̳<`0PNHGj Q!$ L\+nĒ7%eS6% qI%''*;u%[,I;lo?7Qp_/W5u8$U3I.HJ) +M@= `7 q)1- p(Eq =Cl*S7@= ,5-MW B8Q ێv c* OSD_ABL}sHVU(jT~,hY S9]!u6M<Fs($ (HtG+%L4-#W )1sG 6h!}^P iK =%OmL&V1i !2Җ) sc!5v.ICbXD_oՀ* ~8BV;C립džklVSV Z?j:?J'@t\haj-2BJ^M&p a<̆E@hCЅ_Iaϯ qGxUhiřDBIZ˗8,1FO8*%">ЎGOJ\+W j1`;Q-,TIPpwCdjH lWĞWcmJhi{!T2$h15jpщ7~?+I7OAG|;W%u-Wd+_ Y_4gFQLVHR,ae\}8#q?uU k]I0W-C!t[ZP%(#1qmLcT_BItQ{N^VД!}tGluc0w> ø* 3-,P(+.MӴrL4LbH\=8WuLADE *=;h$tfH/Cd[ 4S8`Vu4W'Wh&ډQ$=)2#LHDhBn\k H wbQjHTK;~y!hEYhߊm b;)PZGSV6U2ESh=MSoWA,"!d >3)J"&YV1+%d'D&i>\K<9SSdI $IJ sKA!(B=!u?QR[0b 4V^9+ef we6Ƕh#H2PO*`ѤdDA32(1",#&gsj<~r M 8= VP0QcpXZpKڒtc21^kxStb0x>Pji©SXN%t /(7^(/P~~0u hZ@+x)x30 ǀ4XQՌByg|tH9t@8V* @B].v_ A(6&`=`>pӌjgItt2l lT&MRjvb@*]Ab~?VU7ZR,&F30ovr 8D Aއ`ǁXaȒj+@:5[I*N>^AFML$RI]X_g"3Լ!"?EutN 03tuݵa`hFu&h9A/ 6J j}5n+^stX_\$m~ ;~tt9|!^P)Ad49n`9< glma=+~;4~#%"U"|7Dh@L/(tjq3)}C~uutk+jh  _3S[k+AP 0S0hyPxqOn~.W7y,A7^(&.[CDy B}4IBm Vj"= _dWfpq;ɳ0wDh&u =d0j+Ր '(D~ ZE! ;tP()Cր/_DSy v (j_Bʡx17[(Q % p[J<s7ԉHr9 N*7% \;Po"̃0Hyix,:@ @S,07a] a.: R %:\F("* [ܳt, ]l'TKUhyt ňPK28([7 {Pw'𭍳JS *s8sL+-NYD<~NF‚Ƨ`sCBBڋL\= iMN;\@f!9BH١"SÍ$m7Ch"8P%[wLǕV.NԳg  q_w#%;+x|U+ ̬ܧJx}AQ>Аvr3u3aC +w&CXKzQj #΍}0NB6|$NrpD snk ^T $wJ9`Xyceb8ux#9mtI߂ `!(V'CZ-%2p  !xLpmhQSlL?h Xbt8*P~u 4t)$ H&ٸ}9 vrqXb~-?K]\v/#;{ZBNHG-cZHwA' >iF;rǦ_{u6So(f|S [xiMH0}?kXD|cS {adYlG2C, CZ1'¼C0GQ0SisXz|-pޖU}2GJIU;Lup9eK,%8Y$O09-F=oCVpރ0;4ްu hzY``Z R[gdD†jPj YUSwC-y.:k}]V\ "kF,Ä yߏK$2d3[sjj 3c]kYT[\QK^ Q$Tt[JQjR3߃-ʿ:Q$ EtST.[UL04NXZv? Ãuk9u 8@=39Jt(F >RCP[+ _Q{粔0`SzW#r`[e4+ uP,buwK4skPEFcCir| Bg;#@Thauv{@&^8k Cqk)`[8|=w dyR WWJd?uHC@D uKZvS~% t#!3!mqԈ'#i>6 Ief'FX!xJX*|\QV݉KC?N#5kQi$\9i~X\ul7$3bgNW|xLJ&E;ĹTD4@M,sđx8@VF8i+`_%-ffya̹qw6'wQ{L2)oUa^Y-(0o*>y(0jd9,Tʼn~K*pghQV=J#|?@ˀ:9La6hxLƁZR90AQ,,l^-jhFY‘k@f (Y+EY`=rK;?YjN8UUB&7'hDf{ 1wIW+ށv Qf|pmzӬ-)iXƿW4EeŋxCOU5) 0ƕ/("o g0=zMX&uȣM9nu2p{UłM {B*M 8V Ciz@C0$ *_3wAze\},8( D|@:@?`ЃLANHhP8e#*U9|QUGƉ1$?9Oӡ!,B@fKLq\Dt@x }9iNu4uj'uXQU @ZW_ B{ vluk4+X^o҄- h?8+[)BA5& 0\VWA3O%$Pŀv-a0}:'5}CHv& p|`6"9<_J5IوI4!PLiҌ@YD2" 'LE+)UuDqdK%iypm|H$0ɻnOh]rdaJ֌ ($jB@H@J$00YSMh`gt5a]P舒P 'W MS&9lEU\FHnҪwD/ <~=4,c$NK+q?D9GuAh%j`hV-h` Iw _$H 7 LIe\ :@Hpag$]Kg 4F?]%䔥} $p&* Q5& v6j1I8+_@X͗Sy4ES9R!!6B rp;h=O˕q3΀ޠs!xCid rq pqi7VhMU 8z,;Ns i^ VC~(h$DBJ8'M0t.DITO-lԒX\ņrכ)H t X4TTv/'ցpQI ڀ^NJWF"N(SZŬRr-8S6TDm@Pu4b[|-|[:pPW?G!L#p0K8lUVs@MĶ ,ژ{wsUHB؉q,nYVe}-Hy ß,dB-$P4j-IJT¿7gi] uZGGT?VZ0j4\I1H#B c,LcE$`P81#lo`3@ v0j(2; l`,z#,8cQW$ QV0tIH,n\2z[ɍ4+E\")iՁW荣^NT  ;&Lb^A>W; J)||h@t?4,]H ^#(5+h¸zPdR_h9<{}6ҼQx5B@+HSbAWإr xd 7*O`B@hkJ>9H^ H iQbU>p7> dž.~ F,X Wϰ=5V <} uLd+P5B i2@y.j4uQ@A [IƃrW ?/:l@9c7/0_f@=4u-3DDits9GpT6FcQ+iB`OPǀ%t;Q,6KT(AV~gCP$#QKQ,SL)A([TU,^] K9S`x?B ;vbx ʅ$؋ݦ[> ^!bsyDJGŵ V nʸP4:KwSB( *zt}G5МMjKNWPxbQAJ0`mk}B||~E8ҽ 06~+j(=+B#kpCf(_i(OJ <:PGPȼBPT#C׈OH;UW񕙠aqɃ a Y_PML>"FTh.  8Ml MƒT;AF< hQH ŠOsM|"| gVGPWm[(AYN`HP1(j#f,5`Rb[KQ0R jM럨ePòfm) ' ?;jJhl@%*E|VO dh*'|~Sk瘨| hh$X{:N:j]iuWEs:2 G駵6SDX-XiZGK`)0e A`[y y~ej.ɰW#!:IX{g]M28I#_0<ppR/Hvdܡi/7aV`] q"@H>Ę=H|@V1Q^u !I[uhL_r6kW_߁XyYLiTIJ!\DPrX$%v\R"*ta+ØUVW,74U!T`*R ``<Bjh1:cغV4,-|L_=`nfz+(!</jRk`hLl0 L~(XU+N$h'v[2c#`iڎD"u@ȣx @g ,pާ'Hf؆\L^&5! G(3MY rG38/  M *vxlb\8oсf3V:ӹXEvp$#I;mJg4#@080>?7~$+Fq+eJ6 wM WVѼ#L?W2LI!5=po6QQ"ZIjM:K2z5e[&0X@>EWŋD.ъ'"1Ҩ ڄrPL,M%S`D< D9'"&%=gHMUtTKg?t G>cx1"3ς AjA5a}i5*&aE"V @9`,$B(J9G/*'9d(WOSUN$#^ # W۳R vh1BA 9`0? t;܆%a4:HW=kF|pfe;SxPmJ2ͰY3}M"tm+#k-M1"hTx`( рJRXt&A} *E|" ~$qB(^4heq|D$,P" JBZn[Z9`IXm(bUBA5LAA9p A`1nNuJAJ;//KB捞K ;OM0k+_Q6R 5 CSꙓX`iS]u_[?NC!_J,1ZKc4\:/[!n}_0FpQpxW23$$4$x,&%eoHJS}(M:H@\ jVABaT˧h?C5ef.f 3`7fu[J/VjPcUP|7K@ C+$3+`hV,$e .d/{+N'@H1O]^d䒩/piNuȣ$ R:,U.?Qf+FsC2dkWj"%-!4U/9ikht\\txJ[S q+q ,@@H6!=fJI" &BWfk2-&nP?+$kUajɛv. R"<">,HHpX ķ,jA,&N8\Lh!NEltMB\p^xS1P.PќTX:B/](c3}qdd&Ӟrstpza:,fT0]RbM-"%4M>cLFڗ@8MDiiNF Bj6}@%hE. XoNAZil ;60fJIFHL  tC-rr$ $wMm \ ,iWĹDohrl~rw]FH[ԐQsĈ ][]!:->MO ܋O/v<,XpʞXXz|)s2u 5I!bc,h LL5`MC-#E߁0I;97S@P.-xYY$QH<.6v&!_gjEX1V`WVA\} p} WLWk?D>3B<\7W@z<;sBI)u+ڃ#v2s*j1X, ֏WXضS;fsG\aw Բm+8V)(jgB!i1ES1>P0!ba3hŊ'j ]_w0iT$WXUAMk Km=T_7vي4;iv kD1"XJrĒEȰNhK+p"1mtJjYg\d,':  ^[Ý+} E;]rBQ~ul}ot Plu+}v+R31+)IUSk>Sp-t%E@KFC I 6`E[sqlֻ } -MCmi7JYe)i .x/kkK5KP8Ek-duV1/VGkj!8qc9MHm y`{Nx- "V+d 0".,@rWH0`"DS B8O]qAjJtS}BUdj %v$Ğ1ac a$\`.& eCsF4ckWYv  t4qP*~9)&2JumfY < C&] pOBm01yjVmA~]h!KRAbyp%Pdૐ0}@3 B3VYn M .GH(,0myX4Â?Ԧ) XGtܨ;sA2@%²#?,;/ؠ߷*uĉ=nCtB+ <+Q$ 8tϷ)uWU!V/ ~q3˕qtu% tӸ~8=LuĦlB8t6o{R8t't$4M[g4{Bn !aW?"};v`ʏ!i$uv"~!r)/ \DGX8ArG/֞| <AO`#ѳg *lyǹYY.WKy䦐GƇy 7M4DiDi*orE$8<`_Ƀ 6B#a0#W%Ct1|9$ F(|8'־+EX}ߣ%GWRRqkOHg[>Vi< DLT\dM3ŦlF74M44M nXHG bF7[ے'(wS8]ϓ!J^7 1ԉQ7*B #;ȋ6SCU+s_ K;Mr.|5ny=Sˬ$LPǀA!IVeht[t" C"vU!nC?]m_*y3X!68w͕S'bcO4?,3:Gw /De8 lpwju ^»S 6d]RЗ[4&(sc#n3,98)F4Hk;HIyIN 9"ךּ\_ 9`?Β;K=,KB Cu4C.8 13CU(xt[kQ1 !c)q>:Ys"VhOxeS!tyl\LW:H$uw |c.jIؘm4WͰcp;$2 ` XrdF#j?HONjʹ쁡/hDw\_[C#a`vQ!p" Ȼll!}|1S$ >=ɱi4 GGQD_9utM;ƍt"xHSWwIp*Կ\};'Bfv!Fh@?39}tixxŵ=E8(a(hou%_!561jX2pN( jB| !~uhE;4@yucx"34 A юS.=\w6 ;ӄP6ݩ=qpw+yÛW L]} =ZhbBE!<lE^M :JKgR0o'zGt+vo/SuoNuatMRu\ KNstkI;*t9lepdm柺H6‹ީA=&%,!cA}zk7]wy$c .LGE^kri]|8ˁ @ 8@UC5juQ08l] -#ϳj!/FUz֕؄B]d2aCtL5=u52pp3@B+B/ lBpF#BQ^xNJ:oq#28teQ  ۓ %u~at(8uAjif tcl2Jp'u _E=K.W&:a% bi+| :A(do5z`K}/ÇL^;5h/4~f00`A\눈M2O5E5;|r(iJA;T ~!Sj [ }W { Ib@X ^M䢍3ށ  <BG\!'Wڜ4||qE} v Wq)4DB ;IuQŶƯ >Q|y cAk+`7PcK`bN ,q{ffF0n,l]tO-F @tY.l9=h83~?}3N; r \@OQVPYY 0ےAt=/9UT,cYz9}+>( 5u E4[ 4dðBF,q' n^P;* gY$*|r?S$`\z=XzȄD`rǥQ!95L2QU)NE>"^mH)6Sm$%P%`OO]\A=W@ۉ3O[~oX8`#yAAS7d;j S#E!(\\E2tr]2rC:A' _ytccs@uV 3> G3,|c}tJZ#2tFᦽ #,0! ^PI)GMn6^(/(Ke1~-lA2 u!@h>IOr;Nwr VqvNIOu0XUG Ԓ#]% ׮S465%0€kAZT OyN;X80a l|[Pv+5 q@0@pn|xƿrȶ5f DŁ)@UA0#GE`%(i}GE N+0SdM;Әȉ]=m1.=, 1Fr*cb>IExMDX>j^"Ve߄>!;vZ4)CwN>?7v0;9- n{(3P+wnA8ҕ2G҂i7 #X e toBpC@ =H|JXS!yw<0WUqƓWԢL% vT M`ڥS 2P#$HcދL!W;r#vsC}C3w"?>wH_+/{X`cVwwB(`[bAخmK ((7 @I ,SOawASY< str-LB v28!+k|-;s5!cK|A;)&@XQ)iY\y(Y!" K0h|;l0 )|7 '* C#Vt$x͚S h r'xyY`й ݩaꏕsv ur EG`/eZ9 zkisZ9*<h5GF95d/0^Ij75`.t9 Xe79=`=. \ ;(삿r th0$ỐZYh84 #H\Wg8+$/t i}O< [Sd ݅FFKyI ?l+W9K@YF.x8x㵩t5c7(d Ը+r] ]CwCwh7N1N^.;1s(N isvEN8@*YۙOIuV/}ٔZtbK9`+MutiVX%tV tBʒ_#TSj Zl**X,_ݓz3l8jgqV h0Fчa% jS k1SH^{eP+dZjkd|؟Z\YSWVoY_E@oXxPB#Z6Ys(9N`j^sP^J7@C>3m|n}atx Ef'El]J\@jx^  {TK/t}OX`H`;OD >n ҥod8F@pt\ tIHv$ nV `?u@oOdұ?4+" S, O ʹcUzB7ux5&'\ȿ .8h$)u+H{=q (f<JMr@Al @ ysP  l]X~4CSfӞ=Upfq!BiZ _[ uVB d!)ԓ$^_u̽~Ue },܂Ë#*V&\uw1tcm }0WEPVXgUH$M$vɗ܊5EktP ̺W!eU)QZ:A}8'EaB@B8t/:ud V'At Ht[Mt"aXW |d*Sqx3eIt#I~yU,6cby!0mfЖ 9Hhi>p,U!ԨM9aT<'tcA$[HDSrtЛM1zA!1Ct>OL1s!@%dwd# yJAa}dh ,m .ʍ)lg(I;"YyF{ANb uqvlE,?2@ A"ʯ=X@{r8oam;u$܉1 9S,L%-"M I/I'ZqAU]EC `CŊht`I&AM/&{ G \uML]R6$(#/ e<%GuW3]J}B!|F\۴kmn[[F'S,@FKQ;]WM XtFw =ނ"+E&K -h@d; üs*Ld5F%076h~h7 X|QwPbK! t2ex;iU@4˭?< uBKޝe)Ɩ_#\iC(~(Þ&.. %`0,$%̚ w #^f] C~`dhhs$3:!_:ύF24Vn`<C M~]9XP'`~I80&̦X8%/ ݠV-$lz(Ġ* 80,yi%=:x#ћuM] GVB! ey($ g5^_Pkpp6k8CUM[{o~fľ톼͇P2ׁCfFW=I; $!≄ `隄K뜑$| P2=Tۄ.ӷEyP¾(lg9]u~ tPŔe"䶹 Kx 'ÙB0J(uJ8MpX!}D C=8F鍁$F_uWKOw!8t!0P=ʡj.| 3 [Tb'"I^Vu.舳%5`Xx= xMu.;5 w&j^jb60PԱ}Fwꃩ&5"UC7Bעa]дnw"!1i9{9'BJwkYu:jpjSNr g%uWcm lK1$ *#0Bl(^:@1L/:ņ@8[[GH(3W3EeBbK<J[#1#; ḻiLu"Wdu`9X$4Ex}Ӂ B  i%qu X@%t@9: ofYY amd)UV /nE V%+0Y ʋ$,`a *PsNcx/[{xVFkdo)bn+ 0~2-,S_, +EeiTTWsX] 5A$0(:0:z ڂ}#kn\3J3[[.*YH'~""Fh.pGv$ |޸@1V ^(Y'Ao~Z8-! b2YIrҀ'L1#WJ~>VYNʋG$0Vk4v c -|W(~ !£,`$3~f8MZ%H<ȁ9PEXA= 2o 7'+Jvc<Hyt!hk}x:bfFY!d !KNц1}!Y+EHTYߣ=Km2 gZY*HHfȎ< vܴ9 k\8+Q C)~YP2-aY'GvPƍe%G]s ʵ-~3G Ǽs ~ t< FX#6qZ8˻R5] E X[ E|LJj "h%*S؍S:1`$He;d8 `-A| Zk8yCðCQ@dPŸ`fq*Cx(~#K,PnQHدH%:JF}w\P.@rse#D1 %p+ MPE *~qV~:iVBdl- +u(:d1($W)&.c2PuGwCc5G8!ˬ-Rś@ftCwaam| z1G';s&r^m2 ;uu5%_5dAO`ғ=Do8}KK1ukd'> *MJw 9{v'#P?$GD8Gci: -z!s@jf9ptG3ٯdft9+[ t't++u AAo|tGGG@@JuLDfp_rr! 3ۺs uF!ϳ<<  G ^u @s s4&lK%IC + G 3V89 b>4! @[) ˜A Zt(;rslM#64>#D05=RLS'zD}.,v;\'+ 5%xס MIWK % f_j&D&b!]o̰OYyhrl"~߶k:ĔH[Wv\ I(J!`( TUxኯyd~S]v%{TP_v=ȑYtkdWS n!EF85t{4Da $8П3_?Oƙixyo3X+B G}mB5rC} Q*述Aic𔶊 & 9 ZV|Jo+s/0%j_j;J^^{BQ_}gg1 k< a a*pE10ÀS bUI TTOa! ^sx(GI 5s/]؉=Ѓ T>@ HhtmS7ni ;f!"NLsX3BXV%i[=GO}25(Hۡ?EᙯYݪ0+ϊ:?MCc:GF) &=N (:Q8*A 3i8zf9=n|,` {Fؐ}D?H.@ lˣ’D;0 CQ;Dj@-vPԉDWU-VVWVV@02~Lz-stWlҌ 2xv%pNr$nxol:7VUO>>i{YuXM';;j)V vX;K} AW~Ź|׀+|Zv~Jo1C :/uCj/)=\Gn <0׻ u% .2ހI ]~ ,;{,*`Xj`NU+1;&ДyCIn("-VQMe^FT(!//NS#AM&/Iv(( $ȄU,4LȄL&i0ʃ1Љ8/ֆ@-u q)ĆN|b #Pc9!mh)M B;p^K)|h 9p); {3hTg h<\d"RVY 9CXOa"Ѽ0Ma )R56rPd !S"1+l`% -AֲZm v)wEIy$~I$Z uEN~!@U8-PeLDRVStIIe9n496.LI!{^Q s -\%G \"6a=t)8SIRXP^MһHZ8t)/? *i=X*mfW5!$ %x`NN[E` y&A2_P$͇;H${?n!C0sWA& l=>#/9iy젼  ǖ<fOѮH1)4CaCT4'qfo܊q)Qj6 !oj @ok; p1l#jHiO@hݨ.ޫ%5N.O2Z|f "[Et k SV A22Y Gtd2Lǣ{+I DYoPf_3H!TD ,EN, Tn6PM# r4_ӄ88b%p  `B   _9ą }z3֋ 1 B VБeK* H0Pp_MWL7ƈ||3ɋE/(*+(E;Ls'UKAm \{?  QыljzPWPz/40 ]/E ;;{r EL?dᓔtZ5j^9uuGK hUQ`w {O묽I *Efoi8d8ltbp%+w:_;NŠɄ)Er$xXX92TS iq!DZ_ǙBdY 9eYeYHey)ddY#H,˲,,ˤ~h4hP楦+`EHEI!d\ Y0QVC20XC00m4~Ug4@ԝe[%TCCs{YĢ6uF5}AY,ko/ ]^5f2?xHwJV BE~jσ3 ֋ =Cgx4댸P#3[HfӾj]-]\RP U)R PPI Ǟ tr W( ^$ŅuMSW56pρ_q S KuZ+CXFF5d'?>2QOH j@_@= t"Sj @7Pf f&f} A @yUIx |H@Iz _ mQP=ʁ! [xҨ4^]GB @ͪiCjZlZ/,T6Ш >o23 SSҌK,&Gc@p20 | x|9"𷧔7jY;.ِ,fOGeY^M!Ĥ" t;-.]ҲsO59d#'I @z~]W(˒oBepd$Ra2L{It. ht lw$7M DI6u64uP 9<352eytqdq {HD#; XLjj M.G>q-&Ea7Wt+XF @ᆀ?P,0rgu@w7E߳J9~T` ]B\c8Cp'8SC*N] 7qp\VP3P%}l秱xBcм5,Y+Vy $LF \YC褠\睵 t^7uޣG^@(>՘'EIf lD@69`+_m`L yJG\*^PMHΊQE0{dؓQ(r38z*Z@ t fc ;d ^]AG}@*3 "S 6Գ|3 }ҧZ՜uE0l} q W [ktJ 8@~D p$=S3]& CYC,~-G/wP:u,Yx tMc]eY `|my~[G4Mj*X6t rPtnSVm>>kW ň2@r;$!ob 8Hf`\TWzpRv i(R'c}{X"_ \d;jAHh||[Q?JD+ YO!Yh-"0ySW ܆mےJy-96pgS-Q p5YP.1R'-Όap*YGKNJ .Y"VPh+sW<<p:j- ?;YNW?Ѵ  s?/:ڋIKD WW#Yzf.J.hH:PL-nX_/ "uhC)~?o"C9o8M$x#Q:]?--E:AؔHyDa| gQ/G- A E. ,GVfԨ_Mp0MĤud] ,H}Ԙ-SuQNL͕n#֐"JBW;H0u7>0:] M| ~<)@ eC &u >|BWQWj0SΦ۠!1 '[k $0H,plBdmVpVW[E !4NdXgJSWH;2|"}. uG! Zq+Z1C 3U2 Et,s5f@gO[KGb+^%Q6h_0ZfQ#8]0EuMɫ}m[H?Au2h\.Y_h@. tȨA"M] đx[NLDm SNY,vb r:mM+UX‚iw%Gko=<<fTOQ_ ~agaRh< ([ HQђ^8 |BeZae_m9Ll<a8a) ?3q8Ht"x 0WD0p&S{( )~3Rc|@59\U Q€~ 4+Q D1`/;Sw+B ב81ۤKg<AY< wC'«IFsB@` l;KYxnBN Pǥ GMt@޵RW&? @A#2rBC22!(ev$#)UL' &hT-a2 ˵+"8d  v26 $2 (,0 48 {8%@A DHLdPTXAd\`ddhlptdAx|K^<K.䌐.䒘ҐKH^"ZQV[6Y5"G5%G0(HQR@$8EMBag7A8G57p5lKV?ͻ` WuOuG`h?[,tB205f 5bev2;1j0#[&`25jw# %Pѽ #nXi=zL0/p-T_[V޺FHG5He!d2@k{ C! {Wj~&0 't!S71"YƋX$Se. 0 >i4#;uJ›T…6\ +fP-$.\( t=0.(aQx 4YcpI 8) br!ϱ9!r!sȅJ <\$$c䢕I)|+u!Hǀb$i:a\(ȏ'7x'5KAYax nr Ks ]@D; P$Q,() y%*Td9+U,VyC-eW.RӒ@/S> Q*QU7; }+1/*Xt>9v.%?Ng@MVOh?ai/>$Ƌ=1}rYu#|Vu#cyhhԂ@db#r$ܠM ;ܠ%MT+ǰ:83ɉ;/n8+%@|2dDѼZTчO ER~/}C [k |Ej |5AS@>xڔ+MS.B.9 '=A~;5,$?ANfʸc%ABB;^JzhvaȟӼp&I8D=@&A W䝡0# E 50rx/Lp}wQE+2Psa0 ,`,$ڷ0~@r1F +ѩ_FD: ;sk t| OI-l0\FÀ=!rZ/<72Qą S[?5 9}NGƫ7^#~77[f]L* A `.8t1p_6,hAL'C-Nh!u( ` meF uI!o)f;9t VsSr@VBV5dT]I|~7km9M#s4p~S0P4ĒnSt[I[x/t1`ۿuk,<w1&>y`xo#pPQCPK.}u !@VaRܡ j _"#/bkkX 'zJkPS2UReIt)`|F#C5'K7H;^f彘\ @^ Oal2l, # }QMm.uj@PqDO)# y9;AO!uw mvavr#ȨA̾,pq%fى 3G㷾?/ :9=uUPp+R[O09 )OB;t/9"Wg=6w0_[=ycGfb!tu+}u * ̃H }J#Ή dã$8t0uh7w3ufCˉ&$tS8tOhvHXw`Qz9?}K@hp;vbٓq6&G%āWk ] +Hj r|+X~ I 2tfaшPVCtVna`O8Qm%hTXTR-҈ *P JoX qt%8-:uXЀgEzF3!8uEvNaW;39cd.㷂 B+v J8- 0,I$ ^68u8uj[B ;q(JX^hAqĦ5`A6!h=>щ($ޡ@ 'jˀ վԇ9uz$WVVF0ޞ-qx%VI0d`%{{(|?%CX@` <HC$#J&gsW$jB}kۺig҃]; ,d_#IU98ʩj`/MH c0P {S`,,6Ǎe4瘢hς2]PAĸHw|٨=h$d* % p?.; B_E(4v!OK|Wu[NiTd]"p'd[WfP 9QQŠ|<  yEY[k"@$"z\"`E kkr 7$#t@jhH%azCQa*QQ<< (w}ATV^`jqyHwCYw{U;E3q ԃ|PqQW1#E1[%Y9/!u8t)@$?8P'ꖰͳW Ͳ6 !Wͯ\r2,!2rL- ؚxLH>YAvc <̃FK֏㦋X)<Yw}PXHȍO72G9+ bouxPRF 3Y%FU_UN.iplDŽ $xY3Mk<Q  U|x:Mt*wtEPs@lA8#;A*Gǀx+Znw,LZX-3dMe^yp`+ru+DZ7("1j"mU={>: 02QDo65䍽j ^!Prt `ٵ,H~4xbF6Pb{H0yq4XmYXxT Ҟ :Wr FVNO=oxȷ؃@nHd^5"7]U W`xX`NV.P2MtvIɈ]DtEpD݀gKN$@p  YU>m7X2'C>5^iy70Zq yKA7:e:Q89-kb)g[0Au_'JQb|!T$e% HS1Cg '@DsT zNx`@ L%;w>UVi8|fFjX8}^8)HX(c|9=}NؾD +yV#擁|ljeT |LPe -=IK<%{B4snK rP%.oGHCE;|/ {zo_5su jXޣyHPh)x?W40%^->w*H|W *e'3@ OHGDCr8t5 !xU ?HnXA7gk__;=DUl}ɸ&BQt10 @36ə(KuHѰ>G4J8H8AUFmx%1SA[:U kJEZ9Կ 1`>.J ; |; DJ8MR,\X]Iuca5x[b')*OtZPiIR#LLPw!7D1Vh}9t=o ؼuGi;7jJx \&( Ryi!;h̪BcQD>jyPlk| m 3HiK; oceYLdYw0չAuȻI4V!!<u>%|'|Q `yƅhd L'Ft1_ ir''''j{s jm8F) óxmC'W׻-N\O.*/FItLuv}mc6u _84u8 @nt3 cRZ{$:#UlɼUyoo6;ɷ}/d#xg7g~_ <-(!s. U[zjFocO4ia-vpAu -j%+it'pصltXx]V:Dž.Q)"0)Wo#Su84BubRo0vV׶#SӃ թe:E-!yeaAq s/6Fou!!F 4SSo)Kq5 Y} ΅3H!ʱ"su]FOlF0HjܭA],T $*; h;5OVt˙k,<$h;~aG}W#0n?^QGT#]! X5 {܉3A9I-IF (ݖ]7?i`_=<{uw]ur]GC oGkKi!]G:sEŠ:X=*,o18z02JӲ݋OK0CZWv)#H3dp<}@u `)tMEtU:7]#yG}tM su | ~ u9E4TTf&!tw__D 9zd3υѫY9l:/K$j0ȃdVj0[6сc }xa-F LkP!*::ŽG'~Qw`h]X+M)FșDЖ0)/ήٝFNxr8`Cu>V4uH9FQ8Ut'g7(`Dz 8%u xnGh<u6xHh8um ~?"j :yX!wyH!XxxH[7o2+<ϱPPP v eI,<*s턮Q5`8sz 2πLJRAzk&(L5aU0v, wJ>@\Dg;ߗD GI'Q & [kSC>0hHLj nG@4`)H=#)lFfj H!,p #x[p(^ S{Z")$R@B+8 +7%j$gL=: ]G!pl8nVagDk`w0sx  `Ixg-4ӭW{~ 3! bW ΝrJjXIS9|}}hN#0?Mhu =QыYZI^ ZN N`(Ms:ʧk DOa )IK iꍄo <0ckѡ^(5,;H \֩{X?e P729+HCHyC/`#xciSjIhwf$(Eɋ{Z(WQ8+ȁQHUXE ^;Dmvm:B,|.=L[Xm¼ ug>IPKtPIxnWojİуcV= TXA[p3p2xCOAUh@W;LHY ЃNeD问 ^HٺnqqGYiMT0EZM9@0Juy h>5pwc3wC66? AHDzC`gvAPǀ VIuˇ"02J̲4=@ˁ-AdDŧlpFC^r|pNC#x7ǫ6!ߏ'` SH=+Q $ʁOI; |p#U.)GER;`'D?GvrY__C< O&9IԐO{xy!+ L-|׽O?1%_"[ ,uљYKYY4ͲW<ᒮg# 6O%i, Em2W="B!)`] 3/k3)NClKm\3Ra3&^F=t`C18;O.t tN=wwO{C8%ۉ O y{E0gKgi<#ο9i39yNZGE`E+SG2V~E]W< x1# ֋ @l37[(69dtN]UkL=#um˞,| j _^2 :W5& 3sxI(}7js"t4Y I#Kmsv?GəTӼ= ++k~τzPhJ'/GCJ\}DWN~=8X>#\DWu3섛_-! ,Mv`[IbvHT!β,__zyJz%aAQ /^adXNr }# pnJ# ;w |+j. QD o To  7xk Eu /[$I^ m>w;u;Zr$N(_ 2mWXI(k1PV`I"r/: !Ż+q-vQ8: .TS[QuC˹IVT099@5 ; fMs4[SN ai\sI!/%uQm_ ࡤxQ}'R Sd8==)>B| }Q\l,\d'!SYCB19dy i#@ ֧ ]̰ yMdPA5~!J>c0[1G u+dPgo=$߾XU*qE>=kU9[t7N8umX+"Ynɫ2:IDR?d}WMV?E2!GjY*Rd_[k"- &8GSn@c;=3G#-ϰt21Q-+ uTG+։A@Hpd5@K a o?@BE\t8&uQ9*@%|S>HalQȌ^0YM'}G |Hnu =t8.LWp[@eN~m1`n*"MHPO"NKk Ci'rǏD8oȾvNTHh 5TDF4a$C-TC ,1`,,cܳo~w%^ >da#H1J;Y8<=,M@=x }]u=!DT)hdߋCţ.&Q6}vF0:vgZGrN܍<ә 3_FWWvAAyvTIɟ9@=3;<u NI>=1 9t @64; Eg'PG"/=u!+-asu"][hGj]h9>h `V(.e/uo>#vA> EfH3=9yx} ЈL010NJA;! w0 e5hpCjBYds1#=N@uNV__u3u A^OE3#S+h Yd`D 0!)C@«ӡ=LC<~CԸhCh+Bqp%Q@ H-U9-9v%!]<jdSShI{D0 @`FiW8öS 1|V@'mV<Uj0&I d#A6Df"]0$h!\eAa`0RۅUhWb4AfR )XE|! oA@`/c2^S1Rُd&qb; r ;X`sc\( ӆ$~OcʅAMx˕ԇB^v87y"FU&-69<$ 7 vPSs.pomyS-|$tV?|qf9MZ'?<8 >7 x `+fKx1H cz[rоA'uwX Ѕ e&Ѱ] HO98GJƁ-j[;?6|K0B;8H~gF>?AN  kɴ{M4Qj ,<Ӆz St.H}^|)NyNFf@CȁRtvA; B[KYCM;L:9pɷlfw,f@@3Vp(I69<4𸤓f*]Xˠ bxXҋ0 y f*HEz,K@dAp$% [# HwOk'ߞ@,>t@ t20f/IZ {!sRyߺW#¹Okj=WB/t(D*=0t7J})+JAod3cS3?FZN;};qE |!K2#EUYuId6;CSv 8Ah@ / ]ǐ I # M|uhMNѽ0+Q՟^/%:lv?$yPSAZ-&~>ӯ~V,tw0j0ZQ޿lOO_ ~x95| 709tɀ>1~@WO WKQKa(QVXB'!Av%q%?*% Cs<q}\ -;0 Zclf MMHG j Zw Ju]O pt!)&HX@ᐇWAI`\U9I_f4* =!YqQK Eb+oH1Y5,\swBy0Xygykg j iA)Opʩ C!hh V v^mwt ;Շ&n9 θx"`@/J0Y E?[GV[i #u78 TFg֛yOY Zu ]H¬=^3 w M f¢*0 3#0c *Tm+0IP':yjLKR 4|{svQP ΣEЬW#3% U9m|t8e( B`>WWZ ȋXx3iDW0"BsieQho4M "M@?t CS 0 Sֳ5{3!^WAyC7XR2HPM'æGԃM}G ˆLD]SPZ]fiV%|p`;5RVx7^9~~S0 :x|hAD2tMu$ `n\#kTԍeI*a t=1%0VKREz}Q9U10 w53 O tITYE=f_t7yJ[/`U@PANe.`St$)@=w5eWc jꆘ(2l۱lH~)"[ Q&nDo2M4rZPR @I+jd&m5 +;P%#*=u2VVQ lLl}~u  2c]~ P y'Icb0ީ;1V u )7I Fg)'xSuu)N)3 < E+9]r=ր}-(t_r:vf7+>_~>=g2o<%whpp3|NaJe g ;(\̸e{FP3ِ uSPNVW)J+BZ}`c2Rˆ;<x=nt@v ٙp }(0zĤ<ǫN, RH5%00}wxIwVSQ=L50.Jmg+oQ֖_)oM#z{XLXRhC`=ACM؇sb^28$nrp,|8bS) -u}߲$/mqf~!0G*bSWatSj=V =t/!|t>cXDN!y1ԣP2OU99Ɂt?*>stމ/iu5LË}m8C+Ճ\|?te4)YuIANXgxC=qGQm) 9^BZtC$  MF1%@C8.=PZ0?13ۛCZ\ *.c!=$4qKVtA$OIٺ2.f Gq:(a '2@/`O+t 68x9w.k 0A#GVJcK$u r$3>e7M:a#pX9*CbK8Vֆ<="|іjC;Q 3C;Yr(*bgt#l뗤 Pn_ lH V"46D $C@X[+! mµH)ei+sf)B=6A91bW#{N2@{miv;s4:@zWPAxz 8u ]i6[H}Ff =PPkh8Nuӓu r vϒzbT8Ma@sp ^!%c7(0's,wҒf/@F(0/Q_? 񐠪%$$ ʊ6ujI pbq r[CXX13Ҭkw9NHF%2]vOz}SXك:S F? 1A@;Iu/ GS{RJYu(]X5s)'WxmjYstFj3C o \XAuES8ôpa x~ WGX&J s 9H1| U4^$Bx^(k:I X+t"w%: O:)`slwi뚼2wi|~'-5 -t00~1CE~cIeڙsOj f KHxK\B)`m&-c7cWs 4~Ȁ098eh+u SFth{gu$Mbt0K2 63o@+H-?cH-W nD?kOn+!,kI'DO` #C9}v}<|ENǦ)$<XO9XW t&7e6qt;uX[ } 8x`Jp(&&)Yx&ByGZAЁPp$}=Q2o.1%>? \-ȬN %̄Ƞga ڽ9[O(;MOB}=.=s >^x2EU{G O|O*W,XdI#0l"Nq q^ YYA @wD6;Y6#7^c80M,Ȱ< x0{H/2O #fMӼ{4M4pp?uԘ{C- RcҝyG&~ԔAux@;flu I0vEhEF t$^B.2ou#!h&p~_,bh9L  MMIFNkM `91^j}H}?rV2((1 ͇Xfn&/W}؁9z X%.kGcQ 7u']_VS9=܁k"s; l^0E($x.VVV!Wr`_=xx|˃qAo*30 ;GVV.5kMҨE[oY.6򯷌5J/0VVVWVP #$ceunRP` M^@AZ n& B"#N8r8w85@8u 't wrH/h0V1Ft "0yxv2G~ /0A;'}q9Ulj"") Al+,juțR+F.e.^3F&4(<1 |fK HLhQ'F պ+rB#"NT>lf}Gr?wƃ.:8M'VסB^(N @xT&4>r ')A!p P%l`8+Þl$iB! G>o-oE >Xz0 ୋW3ШG7H 4ٟP^bltw;V} @ ]A'xet`S(KFS{=qBSN(K$uVajĐ,L D>"W#d%`)|^yH|' ?-te|P|D+@DHAI I,jWLX;Q* P,f z@S)Z D#y!Q"(JXPx kk*y7'{9y89x5au y [ liQF PpE|uIH3&H!DA}J:MU))j$ p۵ ŕ@X>H= p_wtCnGHF P6 Gz8cGwmZӊ C{p<KKpHH)i=a(g耦.JO/lqx XWP($6OH&(jB(YaY(=]#p!!8Xj(gI_4;3' WV$_ҖbjC!WQR $sT)I_53&Ec?^ZJkp@`6y! ;A`HjIU: uNtN`\-DffgR.r6)l$Ld@EQ_0hHH@, 𼩡! Ma3DI @0R0`<ǃ<?j,Dl ۇ) }7&Bo:55DJAdn%'"iAWZL^zihIHWMSg@L${U܆W1Ѐ8o8 \%&ֻ; $RYCrʼnjE{WLaPC^Sq;3t/nvB#;;; @W.AA%u;)m\H sI;Ɩ ;B 23$&  ͵o g 1@h7-4h(ڒ<3hHp1Uao Ѝn8+&;}C!#%L+uPyi#e`J J>-VYu*[ [+[&w\QɜXh$ aPFiSMTr"a?D"YpOh%Ѹ3m-fxAV(0?:ٸ<K WdSc/WeAKvPhk6Bf!r)Y/AP}^8md<#+`AGLp]9*p( mR2Su (HApb_OЈW&S?A ;0Y~q/WM! e%& VH5AM@bZ1njoV1{M#ȉrr % @ >Wa!_x F lc0kTlaQD kcʉ!RjН[ QGq_kTl,-? DQɋEC[U7`E˿dGVudt?_3G$xNoiF%>= K*TE {;sհa.&>+U-8=ł+G5q$PuNm03J#Xt eDGSbk"kX;rm4>0ΰ&$̄INBl/QЊ_\! 0!n\2ujC.s @0 [Z+qh` 6ji a~L;7~0hA턱F3RW#c ֑Ǚ%`Gh?`!V45Յer/\f_H+l2D2W9w ~!;/hcIP=j~Q'B1LXhG -;QhQ.r$;tS}/9k+KbE۪M4 LGhCMF>RL=l iҟ nahi hiO έ~HrLSdŵ܎s&OGS:N8$Q60NRt)[\)u*Beíhe~W˷iO˖YZk4X*. -!{   b5X $` e6 q?+f[/1p W Q2L8K$Ja~]NP!1~ E@ctŶ|Հ] Qg+xPC`4@6 уfB7CGQhSl|t0Kݿn٠Y2hEHqh :kXd`⠴8kA&2?IB߬+t[-ٞ PSu6҅pkLdkWjڭlyU_(K=3WvK u5xPhf( 8# Wa?>l-_"}C%J{q$W]O|mrr%tl(CN6s` Ne#MW$ܿZD0OKhrbW޿H'gpMj|SR&ϟm gh00vy@I0hg9 WG lCT0Lh=XDk(H?PȉDGLG DGLH :Du ld*hGi\t!2u!D"1 $a-]X4c= Py|=tSBG*uR`"H~ lhGCxh>(ɶ90 h%u}&>y}~hcDhs!w}`GwR@4 qy~[ ̳yl< g<Ϭ|LhH`!6$Va+iX@W9nHwg*L !V_b -G($ j| \"X~`JAmduY5Wr(KWEͬCI#,+ PV tE9v"<%l5*43Mt%!LJ j!8AAb6]RPѼdž4oA"e[J$V7 u1 I vt\&{P|o 63$);i&pp뉧FHEHm0bO)5 .?ŋFLn I/*^(OWةGaj@?" M~ }^fc>aTFXSPB QτV0MVPGg %"XFGFh4E=S'MT8,Fn[h϶hbE kSC<'5HR8ɬ|4/4kX_HLh2;cXq$Arj@U=x19S  ѫ6hIe&6W &. W_er$&PX7?O):0NThS/WIPFzJ;*ׁ(K "-~Z-%n#9>)h(+t$?nF`* LR40֗=^+1Pp tU6>7!ekZ/GCX(IP.|ًd2ג' Qy\k !LJ2}ϻYd645Bo@dG~ A%U&Ƣ(ㄿB@Pmc1aG@ 4r eRD!uhtY MJ L\Jy^~ [ )>cU 4?S }J AiN%)!L뎳thBV9jyDL4m.Z0,QQBF#pbO$h)5a^_F% ƒ~%Kk!bZt.Wc=-U q2_[\]=LXב0~Hc "lBG2·UU"#F"!$"MPMgyY@+ i(ܾl(@dH-$$P!?' cr0r s,,k$0>'0@o(44gC,;~88g&ʯNl֏PtT ĄBuCE\} RRH63 @y"4Hcghjz ?*+MQC.9 )QWW}qb`uunT-!іS&I!€ht3!1|SdLyLAFJbVQS$#0~W cuAAU.cKI8vA8i@je~u l! 0L ~#|nNHMI yUq|HC5ѭ!TRDq ?]WE}s{!A2S)6!%"I}";G:g{(LbH"E`0"iB@ Ԧ]eG 7$}$ 6paCڟi"o ǫ` $Sd{Pz,U53XR8-!8H|c5H  ,pM2r ?KFQ14mG Z ,o }X"doJ' ;dt(+E ]yO[KCߊ@?{@1IB`8#AAh A; @Aw*[Z@l;RAT֊R 4):F#KbhIB5a8 XB# V+ ' V[Zk-q]C@E `$ETDSQHa7'hR7w,M LB2[GTZ\ lhOhAD3qjd!F42 G߼ # u l6̼5(xn Oq00%b51, [II-M bd!V2 kjg%ps^Ac jAQ2h_Wx}*J nSPr2"j/_/\5PQCu(NwJ ,݅UTnq]Lf<ȱVQsUcC7sNgITC4(!-C,Km5@hhkd@0L+BfhP_= Th,A`ʋ S3Hi?hipQHUp }&Y>QA`MP6)^m,,Pjg&llGHwhᓡ%OgjfBm`GUO*%I)bܸ EW댢0'aVZ X b!Z@Lm,_b4P/ >;bFLVCgiBGu1~-Bt+]vFy6-ܧTYO job״K$h_$L y uRz^$rhwd2o 8hK"R?ƪ߇" [u!ڈI=3" _[`YGr tӿGSW|FrɿlnocIO$' ;F IO_EO`IK @"}m@^] taDF =APj_@- tJt7\X@o8-c`N J^vT93ilL49Q728̈́B#u49QP,7 (@럙dyF'}dh( j;}xRf4lghC%xZYZ=jv8S(}lF[܃<IBAT oH! wi|1@a ܺ]`q&l6{W+S Ub2h|A mQB,lu@nbdenmn< f/y3Vh!ǁkjkF <4 L i<,]IFhj71 3p u$;%3ej+@ܣ ̆3햻& * P S,~2 HU S Hߩ,_0"߇x_G;%/PHտHJ)9m_xLIxِ٠ Ȕ$HH8ݜdJ0$䔨y$S2%'HN%@rJN@WrG0+6%_Ipp9ɔ\I)HN@@]_LɕL¿00X$MS1%S_`䑜%#KF1gjA:_BDۆ֠G@Q[-EVf<ҭ6 UO!A|K "0\ ",tthB‹be;=&IxRwV[;S] Y"J.QW~Iy$`h,Ce*cMe$REB }{#enFM$8 [ S4hH X۴7* τ?I g;HHTYC00%S(R Уb,㲺-F2oKRZ륭c,vPif)Uk(fEP60I;+tFG1jVH7JmT=f( k%#ɐ{K [)6YZ~uӀ/&ХR }HKy֊@ZyCXANjgGEVCىP3ҵ:cT h|z+nR;ڢ\SN8:%kǐ McV1G Ƃ7hZXVT`7Oĸ)j;!Wup:`I!Dlʰ Fn|P#O mH&HmWy6PkaxS.B3$P @g&VtUGR*]pK$<"L xA" #gZj[CU~a1VXg Y]D޲@qcuej'\Al40]mYpDJ70>`A T~_\Ѵ= (Ӝ{g`,I!q $B8jH-A yם@(5WWڞ?cj]((HH4`?*z 5LZ05.<[vfy u)1Jolh{i#qQcIBH*NҨ,9])\0qy8 ح U Eh>IoUDh|]|OC@$H{KL06pVl~@* N5Hu$ th(0U2aDH XI$:q 4  tߘD'R'm ~ 9h@+qVc ]"a3e34 8@&.Q0J  F4 >Ib R`(2d"rR6[8;]LoqA@&եUd Xij% k#S% "GLY4cu$0PSVs48=uŦ:MN$vtT$ .(7" BWIc%tV H h&zQ 既̋2^@& }ڼoP,ΆLIB6ma$eaWT>5],IJ"82 hh{p%(&$?"̋h c@Hbс(❈S)Ryhp &i0Tz9etu pX(SxtV kk.@ƍ Xt6x,آ7-|2xQ- UX_&c}!c[vGNZpO  $0_Ս$Nuat3ca(d+K)oB5O@5\Ԁ^uSKCM9u@&L@hC PC(,j@P'K Ab`RN@Ļ UX\?.:UIYOKj8t_~>]$O1t2#&f>}6O( oD;( 9toܔSns=3^JA$F'lR}:%v:F'¾zxZ?xV@&NJC u\6HiBBB;e )ĶCƨ$[pq_HUlCq E f*=V߽Z4 $OE\0K!%r:Bbˈ,&{0B5mCBz{ ZPp 6gux,b`o=Xt6` hBqWG"Dm\C)A@+( R!=u  Q G9kYx$2F9ڀ ְZ/[_?.;p1)<=l'|)#G }yt|w/]>x|e"hDul~4J3Eo@8|T+׌f E!}>&Pmn)Rtjz *%f l ȋjL.2}^T\yP$ 2!@hޱD*vPdVhA_vc2jRW҃h0GDVB7_l r[ ZdXĤj,c9qژ}u rJP&W /KVZZ;>AS8han5$Ue|V)YS!n1dIvDh[9V oR2ɲA֍!+Q/퀝2RQ  VQh xi[9NbqW4oJ$umf:z: 4R((wvq4O~4́80KF :h]q-Nah(7&aJ)A*uYHjLR( &_ x6i)4PЌ I!X?P ]&p4K)qL`T WLIB XJvxG]otK%g*],a!= X:W t,] 4=5\oSJc7Y2H_ JٔL p_ph,E4y1"t:A ( xp|Bx tt뷘EcN $ F]0nuQF7PCpe|H`#-PW!czҺ+ ! a\GI^y'PvN YO 4XbT[\8Xp^;K@Ҋ\|B]l6"h]o+,?u) 547@xƈ*p]r1 8M⸃UTe 8R8=#P XrTgilWMƠ\]Y?h`7U@&' ,c,' е=`l"'+P(j R ܄)LQ#`}LAhQ)Le[8;+hx*nq+ h\RqSIFԥ~Y9Y&dLQT$ dRI|Cb;@oCP.$nS,2hj(Z(@< #5 y@t`=Sm4L=|)3kW0$P1l?.6=*R`$X?C9N0pv,jeG4aGh BB%cϨix M,h8YZ3Jz$"\Ie4/A]R𰀁{ol=nB`})*+h;3/C'1XnH<{<QjRj#̎Q, <0x_f <'*nt"Ob,}W ' G-nj/M,X_;a hH}<}! _ ,!B<ƪT3->\;qS\@uP ԇ)HJ MΌq6MD=^oE0uS!:UBi`n XԜ^=SKK jO|U=tAdgh=SRwpGc $lz*rRPj@_Ty(cm\2U Q|Rj\7Ѥضm`iQ!|jJl(I8._'BH#h&PKI_S6=g CdąV&"Q 1m:|]z)ZJig4Q,dI! ZHӜjI{4 }GaݨA7fHִ[MfA iZM )Kx,d|6ց]0h! t} t4ZxIM0Y:E K4jB/ U 9Ccq}*[γaMs*X[V-M†.VatrwIX(X}ҽ  \RUW+t9 7_bK\ 2wuBD--.G( WF>3'A@Wb8:G9.",7^đA}%nDstP[|g@%6 ` T2TZqiQtTRo"#&f9o uAxr~/St lC7m! =#Ks_QyHjBlv#{tlr-dprK=f[W|I@A =˸b ŀd '`f~Wg5<sI}ptbxx'ӇxV)7^29f 0}'%2t~+_4u&S?X8G@T80[N;jZP hDq3u%(Fu tABt<,0#^å$pt[ U%3ǘG3{cSFLkA-w3%3=-/U EFǍ-pJ҃!$o-Q^3%K0w/|Ga3 j[Cj~c.F"q gwG>W4#o  3t Ȁ\r2A$A$ $$A$(,A$A04A$8<@D$A$HLA$APTA$X\`d$A$hlA$Apt$x|H]ιHpt}9`d9X\99PTH,L@<;_9`tC}^a*ӈ؞hKg}Tsc#;ȽtN;8%? YwOz`dTdi+("iV e d, czP9* (jM-6 P-?a03 3,#ؤeQ36&z&@ Z37N 03!Zxy) ^-Y| LE4hRA&;H])`'F%P8 ?XXo2]+ap<%aEN<= ;؉4.](8 !(<\4f72)- 2:<E,35V$'d61(dd0(dd,4 dd ,0dd8$0dd4<gd(48 34 $1,#'8<N #0<$/ 4r2p3- 22$822r2(/,a!8DRQPUЪM_o ^m˖oJ!daR Z0 $,N>$ ;۟ʋסR#ԍ7Ԅi#D \F 9}n$8srgIs^' ǔϳ$gҾ<sų40iNdmRoy ư4+!d6 GxOm9f f8=ϥ"#ZmoLp Pfk>" *#i[tH  ?A2CBy )PƵ4uu" +e~ YC9QylqǦ=Էw} pZ(V\@ xt(P[ %@m Ė2. 0Zl%hhTa pX%̢SL 0'%RP%@H LL~z PP$@AݒJi%O8GՌƝew̡ $u+Yo,-ntJAܩ\SڈvfRQ>2-m1?!'Y= GoQcpn g))/F '&&\8!.*Zm,M߳ 8ScTs ew< jvG.;5,rdL0BKfpK0TQlReU$* qW5ѻ2pjҸSAQl7LwH'H 4cZų 9ˊAJNscwOʜ[o.h]t`/CocxrxȄ9dnj(c#齂%yƲ+SrxqƜa&>'!ǸW}xnO}org}c w?G5 q}#w(G ]{2 ˾L*~e)!:o*:_XGJDl,*ZLK33e{$qt647PJtw3t-}*2\5].dcKo>TT3TrTTI' V <=A-O  2m\#FCB?Cڂ^Uj◆G%Ѕ#\ӔL͏:Fѥcc||ww{{? kkooϟT`00PggV++}bMϟ?vvE@}}YYϟ?GG Ag_E#?Srr[uϷ=L&&j?l66Z~??AϟOh44\Q4qqsb11Sϟ?*? RF##e^0(7ϟ? / $6=&?N''iuu X,,t4.?6-nnZZ[ϟRRv;;Ma}R)){>^//qϟ?SShϟK&,@ `yȶ[[jjϟ?Fgr99KJJޘLL԰XXJ?k*OCCŚMMf33U?EEϟPPx<!KKa pp|>>Bϟ?qffHHaaϟ?j55_WWi熆X:''?8+"3iip?3-<"ϟ IUUP((xzYϟ?  e1BBhhAAϟ?)Z--w{簰˨TTm,:Db,r @<{6/a )3уoz]ۊ ,d?,/qʉ| 1L 3V2[H +7FXkYd*㉙bc !ߒ!(5 = ̵A/1 #r!כvX*!B90i[2r уۆedӕj5,#Ч} J{ QP?~AeS:'^;kϟEXK 0UvmvL%ϟ?O*&5DbޱZI%gEϟ?]/uLFk_?mzRYԾ-Xt!Ii)Du‰j?yxX>k'qݾOϟ f}:cJ1Q3`bSEϟ?dwk+pHhXElϟ?R{s#rKWfU*(/?{70(#ϥj\+?yNieϟ4bĦ4.SU2uϟ? 9@`^qnQ>!=>ϟ?MFTq]o`P$ֽ闟?@CgٞwBϋ[8yۡ| Gt|B6 瀆2+HplZrN?8V=6-9' dh\![T?$6.: gWϟOa ZwKi⓺ *ϟ?<"C ǭ-Wϟ?uLݻ`&\rDf;[~4?C)v#ܶhc1Bc"@? J$}һ=2ϟ)m/Kܲ0 Rw+lpϟ?HGd"?V},"3INϟ?8ʢ 6ϥz(ڷ&??,:Px j_̛T~Fbظ.9^?ï]iГ|o-ϟ%Ȭ;}cn;{&x nYϟ?욷One~!ϟ?Jo6 )|1礲*?#1ƥ05f?tN7ʦа3JAP?/vM֍CM̪MϟTߞѵLj,FeQ^5]ϟ?ts A.gZRV3mGaϟ?7 zY<'a5zG8$4ϟ,£@_r% (Ky xZݨ31Y'_`%J -zɜ;M*7_Q<YBŪ_{*>"a7hdJ r6o n; ǦkbE~ `[>0crPF& m(8u$n;/{:O,N `qN(X ۽GG]ؒf"]$אb_03th`n}& r sdvOwj DA8nȂL.#cN,4:Ew@t"*(DlXނ=wcXOnkJwxWfGn)#o6A$35Մ[3G mPDAY |GP 2 %rw=@ N># OStA(y ,a[H `P*S/rG@0uo /###$(,tb7؍A5ˬemʦ˳9^%04Xey 8< t>,<02[#Im0H4F_1dY <8/@ X_ }rSou=Ef IN*O.%D(\%YCT3-hd{Fd |} a I D"iUT6 0@w!3G ‹>æK!5 Zv'h`rLim+q3 3װr+3 r+F93+^ $3yY.J(,+d(S04d8<d@DHddLPTdX\EtZ e `dhl ptR%x|& tt0CuDb aUöJ헱XU $XAVUVnUϦŮUSSrU8<2204(2, $222`U #U?Q0rȱ t6e,DG0n>4 IŨ\J\ 5@sJ{c"QKq"0CDId'A&tV*7D |<˲,/,$ P,3F3]A pq3׊Wg gMDHH҂H3o.ڇ3*]f3| .J.J.J.J.J.J $.J.J(,.J.J04.J.J8%DV0VA3ʌOY6i jpF?v2ֈlqFgrWi< 2+d vla.k+YE-Yo{C"LTm2vCmrh`]q"4qaJB AJ  (Q$2cn© U;Ixn- ˖˻|c s𹼷\{ ;/_/eog~Sils t{;~O1[ 4؃69i# iNfZϿ x'CwqOWI@Q`7c gCNig)w+G,KNK KN NKNKNK@`ohц6u18 rI&1IV t2AVAe2 KVAV21A2YF+:OF*RzQAEqQ\1!\p1۹fxtÿ<|uy!Mti' /#W-#E3PB#39#!/?#EƟ > : PF(<,  ,ϲ$(,,048<o@ut]KtQ tCt56vt'$tWm,t T4מ4D-\t#|O04oz{ʃЄwiNt+KF-G,G ,G,,GF,G}<ˁT9L MM*PU2o2 2@ T2(JW #++m+W- hW-W-1Z(FW-BW-W-PWgW9WjHm3W3*RKEW3W`Z3VQW. eMGT2t}? %C]=D2a(@du m-&?P-y?ލ)m%]XO}ty-97y Y 3<<#p23p9uDdC F^o)')"5)Cnm)Q)š_HA='yXW5k׮ϭAt:eJ|*)L||)]6VPpI_tUCAS΃8oQ?.3#}fҶmmn!, 3#g6חCxan', Lg6!h]י1 F}MEmg1ǯ|O2 *ƇG 'F0IF $ؘi$D|([d@>,\0O2 "k4q'8Cy 0 ?<|eV.n0 V37 g4!̦oO7 hBN+7 c3ߐ糊Y[e   (}<@] y>O~o<|,C4N~S,5 :*$C0@ӆ;Q܋'7( }!Hq  x<$U [dKX[]_uD*ҘH^` rzGSlShHCBF&tihX4 4 $44 $(,(4,0404@48<8 g{%Zjbho, 3Ǿ t/3} _`G)''KKK_*ñ$I/3p~*I'ۚ kؾM+3]yvKv3 Ӯ< K$r;3 *(C2D, 2!#04LȐ8 :<ҽ. Ԉ[#/z?AvY+## mc +##I.Ϗż9<.("+#Տ(.8,04+,<#Ïnj;lx@+ck׏M0~F}  B4)dd, @F0(8V,*JtWh-Lg0FyG9ʁNO F,GT0F(QLGNkVŖNEd @&d0 B& Ӓ d4 dgd<@@&8 `J5<}׭NS+f92{=@A{摣Y?{$ j? y ?ŀTm W?p, ?| ?+0`y8kC?p>\H!}  ,L!#S 22<4 Ih Ih%`a ݄4`' 0% ,)y>拢P8R2p>  ?oϒ< $Rr >p!>>R2>ѥd4>NK>N<} BF #U@F 0@-r|$M\,G2!`% nFXGk˗Er eL  2!( 8Tg2! 2L0.L ) rgJɄL Cd|}pm >n$O#>n$O# >n$O# >n$O#8>n$O1F>n$O1F$>n$O1F,>n$O1F >BF~ 0dd (a) })dd 4{|HnevmzȑF eFH.Rz3 H[2 ,HE2H[<2#m 2992#m#02"҅F3dj84 $JdJ dJd (%dJ8NGcP0.@<y( @ y. y.B& 4T+d8D!' 0s $,N$ Bg# H BmaL BP B,{m@ D g_j 'A0h z~#3$ GV3x+_"CEr2N7US?63k0C*Ce Fӳok7},ZJ yfhvf- xf8 lrp(5X 7&i9Ly rr8$ +.aXB홐 E$B.r!72!HɃ\ 1\ȅnh \ 1\ȅHn$,B.F2r4Q(@. #9,r0d(C4'Y8}<®T\XR] j=[]e )L  7V;@{Wk TvPZVn}FOC2`F]g|_ g ^ ӀO#dbgv+ * ec.v)d+ p`_fQ+ddH `*39OjUTAlebo y/6\$\Cs[6*O&!i,u0iV_40Y8W?@abcdefghV[Ulmnopqvw+xyz[\'`?d_{|}~-?UABCDEFGHIJKLMNO 5TXY؂Z?@.V1t back up1s as : D.orig /inx.htmlf_il!= NULLconvert.c?d; URL=y?#%Somethg rgqigo ;k. P(Aտ@ate. TO_COM=PLETE/ toa }posikdf(.lnRELATIVP]GkippK?wbUn{ t`Y'[}a lks2ضA8xoضCQ 'ed6MmedSw-l68:udds3qw dJ8xt8NF.ACn  ;*>0necWCabb0]g6N]fad:C7;b:b/A0fG|7YB~hostmHۉ7us&#iLakGouIAccj#cwA0R8|8->ultU&N&b?'c;a0Bpm =ceI_ t@%u0x%ؠM0*lxOR6az+[Owfã;")N6kwn*1Jrq c XFw"ununFd0i_F__map%p)Tc3j=>&, l.tpbJQZRu8H3ܥyn> qu;lm6b #YTddg?AyxF_[]r@WF)> wriHTTP: / -'v2gO 7+=}cd&VS-_xzeuw6ttp/1.0 `InsH1bácmh-_@>Xd]P]npF@а^bPOmX$STD-NNǵs ?Osum/0.9/ӵKbys]KO|̀o(3EOFd]iBG <BW.*sfdy`Ex[إ!-1Z6FSDfqr1QP/R AC=e[;2sBḢsNjy" ="gȈr<%(,ѽs"?;wr/]iCsp1ms:,8H"i"wQn * ,%of!ruSTex?c;;W1 CM揵ifi]' #]ք)@,άɦC T- p*;pyxFeG; [.a7F;-/x6+xD>?xt/Ww?-R.vz'o+wg_c_jarLIIM/ G(iшn s9$)3@4'loqs R6K+gwN_a;*P[x%+i+ 1W~߅ݴ\ɵNTLI\}FGVc}oAmW-AXds7FxՊ_y eeJB0 fG8~/ Xg2deQ`-)+=ag[K GM 8d_ m8-U6]b] w/}w`;/}maFW,sd/Wcӹ~l  j, bvl5*g0s/܌de/y͕S!6 ͏$79m ӁNEh8BRROR%H!Ibv7k)!^a]{mrKd**R[SshJ,8#ƟZ XB㷳!nî ?bۨWQO)4XS))gk]OA?zo\TcIc ,,Id"Lm.jaX-mp U&l.0*Eotä!)b!@YڍnfflL?MT|(y:ݣ)piک{ȤsC`U n-0Stfandc/zdKsupMpg9V_T= || *-DJwJ4=t߶=4meUa7_w%TkE}e-fPX*8p4pq wUAaSN%')ZmȶhD"n⌏331coێEW_8p>PA ʱATPo]ګ7L> DRKDfG;2ai [SK7d,&\TI$0mygAF_INftp-BQP!W.ZUFV~ /^TYPE6ӹWDE~TRLIaOS/40AMAC{DOWS2'0_NTNݾIXVMKSYPSIZa0t=l;4==VۭD.\+ۏDZ[.s v,5  g׈]Jml,y+aV>yREFcs#5^(Mdjrث? d ] ay.ې"oUOv Q>,X+W`[yI56m BKGDG/0ִn'Z4t1ldoIFw1}? t5REN`THk ю.&4irkb Ogc U=x'as~kŽ({w»ByOiF*}5Fr'/' pwds-olqLP50 6=`2dMlwn= ȏ9k.1L 0wذW c'^jўcOeISb hGFf[[l]  16` / iX1ß/wBEpJ/6QAta8u1e`Km 6i ޑ>gg)jcvZCL;f8E^AgCӀ-&7;3n0*:Qs@Wym뫃~(cm{&DO_| (>tLOGIN))0~!(sq)%̺[p[->%f QXg=tZ  -ae;=_o nТ:l()W WO Mrw *gROyv`tU.-'tejwi,ZuJ/-IdC69f!lR`A算 8 yiLtHWκeN0x ,Ehb (mc?z3H?(Vf~u1n1A/VHE?VXxkmNcgsAc*(n6(7w0H~J&Ö7XX|C-x.-F8=`^w¶kmEX,4 [g3fCqjoWm#ML-&oD?mDECGOVOWSEPAUGJ NOYPRZ~FEB'ANVfvA-\ kyrna-go I.'Bw#;l5*'RYȵf/@ Fb//$YPFz@yu:t_LoU),&02d: ?yrDdImw#ˌev0:kOso )LAINFILEDIR5ORYSYfoC1KIUWN݀A}7lG,c2SoW T lY/MM/DHH:1d vM! ^>c ww]pK֑pn s H;6ˌ`KZ>v++.[y<e v+cXrmۅ6QXXh0%o K$b VSI)hg:0bmwdD8.xWT%lkPױ)G xW#"86b>(0U/4+dOQ( >)vN)fai#nw">Da h="a~+:/?HV/L?N<uG3[XM!l(L6h1;H`>/̑߻nYTI/t^}mwnLi.q!D%~ PUBMC "-IETF DT߷D32.0ENOoU S‹AE4IXLYVRXo%k cX7yg;7'`-W ΩfafVO 1um f _HmbiG1CDGU/ vs>ѥ DZ;n)#5Fu[mrro?8{?U? Iop@+ V05p <= LE-Ul^餧b-'5=O_G?o\''0x220l1~WKa6-\:vlna.*Bt>s`3pgr 68>GhB8`60񡱐Kyl۝ob>ۯ 6>pu<7gfr+P. 407t&$x@ rgs)Bj`gw 5p#e1;STH.oI/r,ClØEJO( U=B?[0s N, .[D{NaLs ?:sh;ctby)6XSPolr.3 B^wot7&sKg"avK3Fd%)!j;cӴG/MKB R2dd]>>.t_~ g %6s/$*s[UK-  Q ь/bHaqzs>g8\F#^Ʈ@3Ga?cs7 bfTERMyw7d hhmp9ms [o$@9A4.*f%T_ ףp#@HX@%3%Y@^Zrp .Gz-@.-8AYzdl(= 100%2Do&n?oZ:?GBMAaK s?e.2f"`#VAᅱ89 .=qwjc|*X/"?@@fId?s FJ'buft"- y;>AP?90@M61F>iGipt__bCw26i8SgAf,A83R(Tv_ЉaSsf-*M6rWsU65Yu508LM# OtYmy^zm]`Z? J_aw^Qcfc. ',i0GnqBAK6De$0 Ig}z/NOT7N@h?YaH[3.tx>rg MTifsPbb('d)%/_juOea>Vo]$Vwah.a[w#_Xo,ULgwY"It0R18lGKpKkhXT=8--c_A=793bcsd! At [->UĉG/(8 < B&Pe+{XQ"_0N).upP 1A; ֮fc00FL/$ar-aic1x.aӶsH["B7 ;fLU.ل"75x)@a~aj c_GmnQ`ؤ7FiOaDE8Bug|a!EOLx⪁)o#)wfh:4q+ݡ/0bQm4n; )&/Io^Cw[fWT ,*AjYɣ}\@ACm c? 9jbWIPv6 qtc>.ekHGXʼnwV11t\G5kL G[Z!>r!K]$】2'V/'H d.m@/?#;HLgH÷9_07p2"%U0 [{pi~b|7(ANY)x\+Dp^""ܴbl(и|plac) 0 1S^``f+ s_St&H:L%lfS :M+H876mM45432dm+ұFAo( TRUEςR!wDA֌G׵ma/]f `}.0fFALS ' # E>y3[sk. 7G^bN`,DA07.]# "XLw}V/$Dq>o'T faQs=, Zigbe|sm'>-GJ˦}^pAl4. mYfkަ`G$iA0l vF O3H|lȖMy_XHH 'g4 (`6^Nv.fw謩6vNGة!hN@Цi0.`Ͱ'6 'p5Mİ`Ta7HH^/?+NjK),Im?=V(gOKaPX܍ f%gh-i6?:0yE>-q=ؗҜguMzm> PP}np,iŏ/7 朶84`X, Q-WS=z`2fCE9XIinbC`1LFJ!Ả`~Hhc#-/,goz  EV)I-+m ҏ ElRg-XMn{6cB /O`E"ȉ_ul[cQG?D ڹeDR!UU՟R۝X?mcA6cR`8E/: B3a0]-҅(]&85 (SGU)ABy1e/pr]0-3vt!m6]c.JA)nU|m!7"){QvCN` nf +4-KĔq-s!ld%d 0Q'KؕvXzt\k- [k` Ra-tBpkKm%cz7Ac AamGOlB=NUMBER%4vߟ (019e)r ҹE#X%5-i/:v+Q-S/+4{C*-k@ BE7zr4B9-8"r FBAE43"?"KJBB'tffJ(KRb 1[ǰ5'HJR=Z}n42 F8tw3IEZR=$.w2n8o51sq-2=(%40SEGDTFlڶ/1Qjsde]4bPRNGq˅y=iaG91'Gbh#CbA'i:؟UX +HOEٙwK]--eH - \'+MD[OR ,oh 6i,[;`[i ƑFSJ5Sͭ-f0ooq; 4)n-,lv2, L3,TLSv1Ⱖ֞(4/&)GQ?Xflb2Z;!F`! |$ć;vRo=[k.nءLbXNb ҄|REXRIMENTAL)/%[X*2O4sbj=s땟`!6K+tk-$B!\-OqF =NbG[]o`c/d16F*4P_RgjhV?Jk`5(U#Ns)?8U=A{mGfߛ 2CBN-6o!< VSION׉m*I=@]=z `gF=?'w'**nhlpC FUw!vw`w0:q""TZo!af2$tc[әmo[M 0pk*4$"űb(E0q@"R0-`cG"kV`# uEdU ĥH?2Q1ڪwPwHT %!qPsŵ-}NmFPL;C-) _W1EX*-dw+/..S0e%9TFNlHMIH450Uc^!b-zx[m h1؏ofd&6 D!ԑmLhRFG8O$J/.@`w'/BbLD-=O/ +r`enJd$P*Ko!ªwxe|p02DNS\up "'34fRAT /I @FO8-8b;=ADDc4.h%()=IP㑃0_QE H.;fc KHEQO1P:exI@6" }QbЪ_0 Yb!0m2*WAIT " \ Oq±=vIDS1+K,6ahc_w,,Z4XU#-Sﲂ;y> DB ˅6? 6(iH.TV95@ySaSӂ I WJ#pԇSp w[Z "mvNVZB'un 9U= ňXLL'lteҏAgaug&!rcqLٺ Sr@N$-S`cV c48Lst )(0VhSLOq#-h,-EYغ-#3/uI n[f7:.LnSt xM smD <ەU(0$,D5nr/Ba)uXc0:-Fi[KF0 8dƸDPoiФ:).Us "?v[?30. nh,ej`v42VP8izy)qL:'!2;)daWhc0oO C"֨͒ae!m[K'VthWUϰ*iU:oe?R%=MANS D#`Ba-'-PbD 1g/ڥW.H>hWpo84Vߑ- /¯&;dqSM2a@7ȰWVmi2mOJ?-GE\*GK. .=&q+uHu _K օ%.]G= f__ZA7vBp^M'j[oFH-)M)E\%'{E!a .ej\ &mV]" V0B/Uت15hM%6d.b7ME W=6fX:p![؉ אjE%B"@%--1##=K"wmD vS.m *UcbFqQ'Ҕb[iP$\>]&8p %&E\ {=;R_)"08`->=&"aA*UgеOPTV][GNUabVERgHrE 6 kp[Q0r $U06`w*qlpq^!"<'`-no m@T D'mcAHYu? -(A1.1RL,4[_P0(v@j;yRhe+(:ULcrd4FA5]xY)%_ҽ{ _c{&-?O19 E/k7$G-VǷK4 LӹVM'ndk3[@:%KEEL32.DP?0E P ,kCvHMoT8(uw;0RdT*-Ԯ11[/;#lx] svX77VaYG1Hl XdzJ-7Bv`( ?lib0 8iF{cP?A--pV#T oRO@B͎oo@`SsPB#FF~6O[`p5 xG3K x+RQBV!X1'AHTƟi gnVeGshi96S#m5nk//7A]fCLvC`{myo G2 ƥG8un`ض#/^J}ǂm8A(@./`R%+4fsCPDҩhOp°Qhig1VXKW[i{h8z)t,A5q1ʛ /ou{n` `{P0 )w7 6Rg!, h(hp[:a2(BN1Pnԅ?z.;B(>%d #x)ZNl_fRz8tTc16 \O2 T@g 16,;af/@Tn%Vd'<=q;s#¼B ! Yw2B'Ix HH'z xf;nLnPwf_YxpǸ'&VlBT9yՐ`"f`"XX509 }xB[{Rz[a}'h`={1 MwInoIm "Gyp+uS B3f-*Y`U( i @tUM\#,q-'A!Apў\: qڠLppF:NqV".GCS!@u X o,74_^7msvF5,g;.\cryo\ 4_}oDIS-HEYd؍7/32N.K[FG ? qm[?PUmAAH[pvLAARmm7/1l)Sn5j;it1hTv x5rIo?R] Q4M ktN#X}swe"CBgah=ki6SB#vVa͚Pod2n a!e6'URGAc8Gi|0W2Lam ӹv 7YoFksDŽhainAmBuB@fXTcs8'~ETAPI#ADV.8rN:<ۼfB0 f6P  aU*f8vba6#D'S69K`vjDIB:h@-7QWR>o&l>b.:Àyas S܎D-. `6/vb7neOCO#nEY-oDSO?PKv`CS12V3.'v7IBIoaEC1CRYPT5vc?VFASN1aDAOBJBUFVmDHcR^>NdffX \hWW ťOal!3AUXa>bywУVMSpĎ2gP!3`#bqX-J$DcۊȐ6Uow-V '#.?>k 5c v7߀Ri.<72;\[+&ixBd7(`5|;mV*C/$Iog;b5^D-Hkk=3rǚb%fTZL?LcB!/ 3"GγU_v(7)'t-NAOi8lX s@`7'6-(QўbvR/AuB6ͅl&d`XplK P{i4D@Nn^L^>(?C'6CAU(D4&IaA*s)W$?vgd':V,;{[@+v8ς'Mps K [_QH˭N1M]4y@nUhpBOBGlasm-9A[_B.Y4ajE/cQ?֔nAo?¥#9B[ݙ-khG"‹ZGW.GvO?hA;_cmp7m]7酌',NA_k^  ##%%&&))** ,,//1122447788;;>@@CFFIIJJLLOOQQRRTTWWXX[[]]^^abddgghhkkmmnn ^ouvvyyzz||_폑 n;41r V ?[i! ak\Ӽ -M>i f ii>if MZf i5 >f iv ii>@fO3Ӵ >4M NA3m3$$Q N4M4>lL   4MӴ>33of Nii>fgevvf6c;i!Hi~igi iZ4 3Ӵ ~M4M4M4%-.`kTffg>ii  f3,>iiyLknif>imKM[y5>L4eg#D(i+iN u>iF!CKeiY>yio L4 R\H4ہ+/> L=4T"""4-L"> .4"""v#eA7Mcy@ڱwewl @' ϲ/'V@Yv[y/@Wefv377ڶv/VO'eiw[W.Ǎ۶'wvƇcwG6FL+n.(7ח.XVA4YDwmkGF`aYveoˎm[%G ? ,',X0W/# =FD'6@3.&f=HFvmcaن'َmǾeϗ`piAn3nF'_&[ g 67dz,.6G6Om,'Dwgn۶vfVlۏ۶-߷ ,77 Bf/!p2@+;m@ @.;36B^6V&Gn&o^FWv@7V&l&o˶ dc77ۅݥN7&UpB"M&eݝa{F&6ٍ݆fv<.vݦf'Km7'ml6\vdX'CXgX/؞)F C^v'f6w:;I.-fv/ o߇NOf'fN'oNj%X69.8ig 15pO.%SQMD4 $`O?vxjp\dP 7->m!WX~_MAXD_e;;]AIC? Jv/k-~d93?B Mt 40iP@piܢ@H`|4M[M4M|xl`4M4XL@0,4M {Mkf[4M44MӜ|kLtV-o+,ec_p_-bn s&uiҨyckRHo_Kk26h_ Bn/%~b'ahost.TBw,7*_育_]P?.,gn`` _l@`R?ɳ;&crl--YOМ_ݯ<<>>*׶ ZBOOPENa32]#-fxaJ?FA1vUoYHW:7q:bhNRTB 7 [ H_זZ@+ @(Yl ,{0k' u^T_v>EXTpwEi[7T@`.À/ 7dddtdhdd\ Ld4d$ddrr2212 6o& 6=ipP(dv%)Tߣb-oD7 47$0ˑ h}E_ET_N_NJ/FBOHnOLTZ3 TtWvP,TAB_SEQUENCEa}CYMPl@l)7m[AL+OVIWqwQUSo)DTITC{bkkOwIA5-HT61mF8%dl'MAj I+"wEw0tQDEG!ċpp6,MO& @Ӛg ^R|KEL%, _Dgor_ٍX\x_F>.cmBn0C'ǦPVF&[_ l6&/ ϸԇP{76!^v!,ƷE0}Bl\WkRN"Nr8Ru7Hb` 1 N7&"U\Y_Sr砈B^i&V'|BB>&@pH;G;SdX`_ms/NDkGkG  d+kUoiDdIXhC×t _.qÑTF`ۦ, #gen7newcB7hv3\pcy_F87^wPCشCN4u 9̉$?7U%THORY_"IDx /b6;LkoqDNP'[o&ۯHF>,5$0N6 'Ȋe&B >2ck'bsh Fzss_;E>Q.1ں66$ }\R8oro&4- 3K27$~"fWSaH0^!^/HR 3410-EP!<$ԣ-GvL;RY-N-ccb 594ӥX)ihf-˸٨("gG۪9g\(v`iF!28147-89G K K &3bBi/bl'aWa Z_'Z*?-XB}W֎@ACQ22OBADT ?%!C LOBAm0DmO C CBtH$CAj5xmP'RI3KU[WO ŚZ0_dvDOCddBAZB S18pN-4W@`IRf0DH$OTwZRd384| 2?Ρ-8fS'ڍv''2Ol&Fi/i^Re+ahf7b `{pZ28as#iTF.sm:p8ȿD^-:`$4oU٧ihLօTLRod .^B"MkKFP-l S(9"./0*4nef_ VSQFB/ oO6_BCec4ECkQKIS2>AL Ch\Jy@rֶD'_&$bubA PMfV97i5SUSB AtY9b-m75m0<b|6dCLLIA'/v=OO&O)y%2828Ydyc8C8h#O&OM^2828@111Ȁ 112 1 2 JecECWecECSecNbcBCOb`!O !28ipOakley2N-4/Lr33nhu #eAPf)&%`K_!Ma2@TضOapwS-wsg-m'Ό 2/10B.98!d76B5435"Nt571r ?k409r2k283r/2 3G33-X/2/-!266w%/y31311aړ 1p52GpM+J{k25Q//60/Gi28/12?l2tnb4p368wt5'{o/04w272o 739v54w 32vI08191732Xm76I^Xݒi2F'؂rbo4bronhjc-Ft?-b6_r#Ro!-Wp[SNOK -)>38Ml^56En%nZGϏb7aVjwIڬV}%hD CI:nWs@20,X%AHlkuiG]L+k.B iw/<,^"^wC*Kdo\_ 3a] ^2$C{V?11\nlu6m/10π1aܖJao>[B'? 28Hdh11dHd111b "`DT`? JJ!cipib?'SmsUPNWS t!n F'LKhF7SON7fL-oj_}uJOfۿw-ISOTU-T+EDOPOT|SETgdmfDMF bx CvusMO7.&(,COV"vĵJ A;;Ex7DI>I9-;vVjkVo)=?D7S/CC[Kn{UWRMT1DsW(=X\.`bO2Mm;.ei v%O5V'<1gL-Gp[L)'CGh'T2KOCVM-B0C/EMV'npS1otKBem~abiO+-[%#]ƊyVŮwPGaWY6L?,vCC{7zHl'2V.OI .m//7hQsf'2D lsGcRmq/ch--WT}D'qR L+w-ҪIG-)74q3:|fmhs )ZKm=~$ MHF]i?0lx[]y!1aPBssWP6IT*DVsZS:tgMC׷K/!9in4L()dSA builQ xHflP7O.jMA#`8VSB>ViC ry'T'phiwmoVse1TomCmpFPiIֿqXw868D;AbEnlsOA.MXmXot#27LvE CaBvaTLODH ۶o'妑SVMw??˱ p) C`v3 `)mfavcD rD Ffc822>.qnjEOR2V-I qLaƆ`!QR_Z-U9mptO:R)Gn_RM,`SnFC4.FPGaAs l1PqEaXe H+n#o nGRdži'cl|HI8#N/-+κ_CKheo:9V3 wHgZ*W$pj*%2-/oO%-,GecN9$:/oOiK-G_2 VW/oOX[Gbݦo g opuQW1 -62GKxG2PcEA1,oA}G X9.6i-P-Go[/{OAfc.W,SHqTUitXf P'AP.ri3pHiu4$ܱ%y.mdXiwLa57l#U9wPQ7-a-tCQB)Ca/C&HVco`B1V0seW`M'SNMPsnmAp[6pPgx+[ MeM 3Kmgmt؀'diV3iAd.|WOD^ORGWDi *dy0F qFJ5/T iF)԰)/e/ #=- X&O%#4,OA7C%W㴅mG lKcd NmcR7V6+IiwCrl ٱ K{b&$#h7_vcAD_DV5 DL*`pxF_bnKI'85?qwkixQCU&-<ʄcg*W a_gl4/l&+_%)]d-Ofj%t7C>;z7shipg(r^WSB64nK']%!x&-CemciH۵,E?2xprf/k;;/ok0P'a''geR  ,8׸VLlPOP= 8/A5:Xc'enlнHde/s)'#:t a qM'iCP `՗ /H6oJ\̯htO-/ Wu>M40Qb9''mf8Pa6A/Cl!7sF{nDgծ5s?MciG?`71 r w?RdnMMw.4^Wa/Q6 {C?/L쌫phr'&k# RX//q3"'bZm_7lk7#+x5sŵS&cL'a8!#q. iMmA/ 4K]W-X1  ``A n/T q77`pE BcvJ?$#\~Tsbgp-7erQ.6^b{t[/TBx#юastɷơqc ^P Biш2WbpcgT0ocspXKÇ4*R/Tbg/-97>88'v wIa⠀/_vxwcrmf-MM81ei /ex_*v_/n& gl_ϟp_?2cqtπf ԄiPQGApGSXh?KX|yH1ץe.?Cspq:sqtk?nylpD'z;cia/h/{ G3I0gm/-DH'WZmmv#f07v7B{&a/Pd76$W"8 G Fs3cirVؐ;{IRf?ݺ;@%  o6?Ö57wtkKm t*vD&7t-ofs5'uU Chw_RUeD|X"Aa'ZD8'TSVRsgB닽tHg[l{1s& v 7CKr9G!T.?q<7'6ԂO/TDWrT'Sp-//ڂxWqL5¢iS!D-97?88D]~?;"-'o KD'cyXX oK%6f/9z pkcs5Yf157 CM ?"2;1'-K ## M+L By'-7l1m-bUu#>౻CAaҖƞGYuoӇ"fۮdZ50~Gt -vj0K0msEvÕ 1A+cfPBE$O2LIO(-$64O"222 ٯؘ:aANmegZ# \X8vS_COc 1;Wq1aa@sd.Il@(W"a>safelVљ8Shgk &k *_40B Tg"5Wbk'YW4"nu-6rkPJ&-o\$S2(g33`4Ů44OwHSgrv[,'XNbwDN6YiRL&`) א[eta&pi#3d(@hC#jG2+>SG(Q?ڡVFFSR`Om8 ONCTLWAE +a^ 3>_vsul_>qB0Fo ,{2  n$Fh#1x& Web gA״V/W-چ{Ws/W\J&kcXcmMRK>i G&%zB ]aahD|ZLI[M5C@>kE5Fw5>cdC-?ECbc`%0[FG%Z'YĀݍ}OQnWāC5UL/c`ɀC_rEC0/`FNP %* ris sX#u(xG GN/g94040.4&np>QAˡ.aibfXrAPcCeca7yECϬt8Ck6..-0N0/D)'f#?-#'\ l1ye f,.a?a_mxUe#>Qm+0愆U O u9?sG S!UF09-!_?Bksl'%f Aޝaw-ORma=lKN!K/]b'YsHiSOplFT7o_pW@gK<DF2RC2 XAGm-; N'j~ZtVۇح?<74ocK.dHCcp4??#Dt1qUܻ /unys!vrp.?w")uđ de! `N5 l G+q)cM^`bug9>10'aE*V,9 bcpOrrrr2222srr222_9[ec8c-/gTg/a'dCcdh,PAR ;7='YJMe!O7CEa[-gOذdxG%JOU'+. 6r2cv5JqWLoCO*w(X.Ia)0䚅DES$G2G2 $F>22H)n1;!vFVfaQ({ n']O{x=V-zUdat[_BP_`@Re _ 1&P!|  S ewckG`?}Q!7ާlgl-,';v-./Bx'_"pLlgC*kpgF,tb_gkl iv)'jbm%_ h”$Ubxjkv@3]y045\BKMLHV]pv.nf `^V0N \F>.p6.`& \0 *P`@ނ T0P * `@ T0P~v@*nf `^V0N TF>*P6.`@& T0 &0`ނ L0`0 & `` L0 ~^512*afO{7\:1=X2?biq0Yl Oss6Pn('',)06br+aCTuwI;CIAO'p`FqgˋPVB_F.B\I)>*PJ`JH]XWrqp])O\4oMM`K/N0oNnwCIPHER_iv_1(ǻ 16W*5_wBy(t)ee aDt)02 7ɃV Up m5f2 2P C 7@T ddf dB Bf2@ 8w VgB 7 2Іg! 5_aAGl 'X`WnAf dHo 0XPpm7 d[\ZfH]/fY^f y\f@ld%J[n /]\ ' ]'7K!Hgp(rL [&7aCIϰl dbg(2CCrc2."@_`^h@N#W@2lg. $ $@.7~ a `N'M`!îag+r oba/ycCWA`  og`9 C0,@cd`"=gd P?LL!7p`29PpA7+db rنf`fd@fd d-AH 7 !/ge@2\ЪFPg舘TJOݴD'L(L7hmf8>_0wi607$ d /u\!h `v L@@̲lp<>``/A3 o/ЀoTcgUhGn 7 ~7>Ňf``@'oBNvB8)A H{&B'ވg4&|$ ːli0X_'D yN0 o+x$ `*w3m&7"o ECjV*N'THݸLLs?0wfPKPAR)kRSӸ.y 6(A'B'$d_?4nfa[r67i,#WgX9_62_CURV-w'FIELD4LVBW.FR'D_/c#"HCI}TWOjg^y+#tona+c"P^xNOMIXk3mD21c_.`3p@ o/Ԁ&CX '8J&hv>DWp3.,('!i$nH~'_U@$R _96`/oEmHFg'C̶405?g!!pp huG&0{xbWd2iK0EoB/dW(Ӂ !,]@UKTpApM<6q4GEj~SNMTRRAtR5jzjgszlͬs6Q@P_rPOО=)Sg92dX6NHY6M8L0v1. >ƶAPFKKpKihD5޳xĶ\Ym@*Wc.XF$JrJ;` uy`2}|V<Ini|F@EmhE8 SghuaQu)rx?~i6DظxDILD'W5S^ , Co_0̬C/6 { :Ds6yly`CBf`BB{41;BحiBBAA.V.nNtH@S,֖vVS;4Mk3E6pDo{?~#'v Q^hdX<\>W>xD[>WV==۴vl0P0N~8X[ӭ!:~4MkV`<lV$7miwZ~>fۦ\87d6|V6`6vV,$7ȡcfَo.\5b|P5([\"l`o擢h46ͮx4L4mwű0~637l|H3WPm2~WZ;@~">Pi1[;XV1^h(0o^t՟kA=Kl Pt>4/.mt/~%4/W...L.W.-jmS~-W,wsp*mն-4>H+X.J*xo)/l@cW֟y!= LKMBb! >(bm 'V'߼Cvް&&.%$*X:m3Hka:#(># "`!lsU~ҏT!'ߦiD  ? SL DuX i؟l>@ɼP\v짻j6^d8 ~,iZK.P  nrWNT'U/'Mld60Ȕ` ט8q/$۱S׾s>Қyh4~SQ-ƄPgxmi^d0ߒ~V6MP~mK.Oq >x68Z4x8քc·A*/Ŧy]&g''}PWoMw Av5k ~|X.Hpi(֯iWhx(o/.+5I ۞[3-P66͐0L. H 4˦( hpͼ@/ p hl @`'M5wlG~]'?d\XiVT,N|xtDb M4D„ĖM40iipǜȼy^ˮ^&>,YĜY^D>Y.84M,xѤiM$d6MӮ>iYiil4˦,Xe4MظiDp,iܿ0 A4?P /Oд > Lk .xiM`  /IKE/0N3#4 7?185 l#$bjJç #i `tEC^0)T0o!?FEDF97C44DB9F2420BAFCA75Ed18ee-9&99H2352AC7F3881BD0868FA оCc87b7338f84@pA4W%P13ZJ0DB16?!B4!1C2630Ep? O5CEB1>1߽6679AE52 D927eW61/qt43Lо10342;m3_B5058!;܇QD3 P0_1T5pAD9:10 ca%6i2o74{ !9x9B4E71{qw3É[E8DCBwB_uk47A7{ww˩B;O871m0]9N-Di+zwa2YE0F57xcx]6E7GYw9!3}#9 bpc qDC=79l3 `=+WwwAAɞCc4؅7$D18ؘ5``N ! ?ot7+ X 86Iw15]U6EI;GU;pc9+Y7m[VB6iÁ [0QCnχBp-pݽD#Ev1;J ޏ3680ۛp728ǵCR)2C EM_'ap廉yo;VUOs.6}eAwq5=w2|m9h8qR%8-ޱ8`1X,p}k5{x(n!8U oGEsN;=3 56)39~tG'^ BCE789WB#F0Xp oFM- :6Q'oN$O 27 /8598,GAhnmi7 CA7G}9 9o%DCppmM]DjNT1_6)X,?5Z]65/@gk32j=0zAkb;ѿ219FjO0D;@0 ft;8h D:;A2F|la9C0 ..72].v93EB6D#,7I2D8Sڥ 谆5 p]/LL0@?F8?52 3U4{'-6F5339 ADD0ڍ"3JFdw'sYF#"Կ8[ 104@`b~3,5oE#:A[u}`B7n݃=ߤCBWa: 5Ψ!02 3ADl`7Б=Wg4T] N8!o`=O48E5F7g0-FA%0hDOIB'@w:=saq7ĩe8I Tk20A;5`xI^0,ia8JafPE|q+CD 0aBJ' 3ȯ0t^f BXgnjw=s)9-9pC8`!D?;؟oFJ`D$2u8pg 1M}G]`FL0zS ,tD CZ߸ƠMO5FXEGq%FPy51p?3 !BD0Hs΁#)2mp/u%:FzP18W/Ł bdY2$ByvFFā7!A ]7:I6wx N5A`8h'q!Cz<55c;yrn)%RB8oAE -q2qV ¤{5WuCEh%xha1 A=S*< iC5˩u236Q 1_TE\81u9b 9W2`ے_A83jrFXwޗ)BE gd V263Tt4C=:q.C<\je23OjKh39i-ǭnp g[P# I @E&/He. FxBExgCCF,uQw<_Dѯaq ql+"&\O0y=:ב^y3+ ,7p/OXFN. /KGrO572 a3zX=7u[*q9Ghs,0od_:Kd1pV"`zmŠ\R t3741pS@/eqvG3p~/cUD1B 7BAp; 8QV>[wIjT]6FARNaJCC\ 4'g .3Z‑;uVoȌ3JBE+.~S57g>py7T8`3E)" @80 ez(ݴCE\/k[)V:V:/C6hkåa1 WGOઍf1r!5MPt;D#*6 Cռ{iDg*v{Zǽ}Ib}ώ! g\ B$D8A'Bz!D :9laO<09M' ->'0hD™&0giYa3qt9=5 K֯_Ū O s"-L*& Q-0VBƽߢFogC68#V?C; <5N;AcTb8#Z?G;b}551S1\>8Q Rw⦏ n0fAFJ/<-?kaw׍ѽB:kFcq)!>\@΄ gb3 LŽ?I2H!G8@]bDX9FN}ߚ`}ҽKi84aWC05B2*u+m9N5;M/$0֡^XC 5_XJgB^Zc0;~FS t魗8i_'p OQf'KMhPjDx30N:SɉjS.S@.?oDY'{Ɋxq^ IM0ZEYHc1Le;l!xyt 9 J8R OW4*N'oɞ*78{'5 {_ni1i5 Txw$/ZՄj uEwJtu9ʡC ynJN}8?`10n9B]sJ 7< : XqOD2c2&pͣ eR8uCv"g."4g 1"50zs8Ak37-=CʀW8Q^[]j0 FZ@l26G%rEOq\x 'BVw^-`/ ',XIu0+p#wr ]Ml,G(A:k9+u%oUb cEL/[ 238Xc0! 1!i%†F'RgF\/{jmqC0Z^4CCxyp4B73 #Mm89;Ւg, @XGN8afgϠ7TW 70M H89)_Ϟ:ow}d|mAYAep68IL/y/2[$KDz cQsUT65F'^7:a 4h=Dj Lh`Rp IGXE%2(ґ6. z8&6 2aDwwkQh6  7V ҝV[-] LFCgACX_J.0 0D2q2 D16CytKyf[xB8f ͌h88,%oRZ%j07wL)(LXI<R{aF sj8̞J NN8y ANbk%FV※PX8X=`' ;?2v'ADz`g0jDp\jᣫD. +tV7d!Gu?1x*w4D)LzE0A΍9ᄁkŸwK'C7No`qFjtg4s+]Ѽ;q9K2LB14^r Dk&8亡I8tDb0x1Ŵp~b nagGl[@#\~޸W?aPCIיzߺ> 0 27d,+G1B#K$=A0|7 pIaM6q>PJW4cz .eE8 77v >sun5'OJVg0J!GssQ24fj\0OXg5 P'0m5XUr121OJgN@wjw `Q0%1=H /;3ada "~a3c44fbfc0ze1&a8fd'ba}K9I7d1fG=d4b8OEFB2jA#@ o,'i7yV+B][hu5{h`qp%7efed7pq?cad6f1317bdoe.4ba91{aang;I0ʵ+^ɱJç!߀C+ao[47D+/81925kC5 F</&n9b2fG|c~ 4dbe4J0a8An5eO9.뫬`APc9XOA{@uzCz'"0(E37/{i7 w o 965887a=9,:) Nc<vïM|t FZ k8[N8aťW}= #%O\/u-gQp`8,oEhDA_2_4C8n3@j2= qiskhEdcc9:Zl+7a3^( O]FkLNxKk+:8W^8 au4GQqƺ\x1yp'7gW WWO03V{u0- ^up6bc6c |<c 0s9% ]IAhc@ EL G,AqAqDžP]3 qe03LMGbh%6ad'!65;f)[O4SYw ycJ3=J2ĨfT@q'px`%'+xω*s8yio!7Q W28EN01g 53&N7##w ag xBK Ŕ\OZs7Spzœ(858724E3e0ff2ohw4}!ZU* *hN*6uF!b7}"'0PI2?(qTB?/k2E!wFG[zaY J%5o'<0e1a7wb8|4IFx ''}xObecbǸZ[6 bfaױLU4@VEEc7m;SޟGaDĊ"׏}e*-cEqBSc&Kga!t ӅN{y IE"o?M)JCZՏ7JAJy5\ifm6PO'6cPf/Z-1d53? 'b9}eō\/ ig-/HTAsJ0p@bD89D(:0(0:{(E Y\XܩI>{tG|(cx2OFޣukL,/pRfc1 ۏpbdbeakctx:d xiaf <15?fpsrdc5PE~+l)N3((z'cX 6 E9Ptf C!O/G48t7a3\AQ-:xi#OE V}R<5E3HLAA e%a][cIpz picwj]W~R#DF}]3(4}TٕdC8 8UF.=9pvp0j'UPDԅN,Lo&mT5TwM]jOgZZ__4BFF‚^F  a3f__1߳6a6q`u aAad#aON2fT(*:p'wu5DCS^86<̺];d)2aMHүtvKC[Y!UI)Jm, N_]7A[=d1- V%Obb-i%}ZpA.`eb2 kI@r%$CF"X) #]8x4³<18r<]V+ S$z)4a4i YTMf9FcN/1gudKw2c9dz:=b78 `s1-GVyعd0IƒS=2 O@p I%ǘf8E$"=#S- T~/5Ex6 #Ng9W"0K,dFg@#:3NJ)ҁR3Z23p=\woDžZm?3\G.ACϞP#/22rA7R71Edq6%Un3DYCꋋSvX!U1xA'fe6Kp]~EdE|9 v=Dz|647l x„kC$,tkFkEH,%<:KqXpKJByO7`!uk/Y@1w"ҨR U5rL4nDvb9#q³GdwYw^dd^ $E-m:E[AI Cu -4ncT+ : 5 v F9pD,1X HFCT_gX.c@"AC;4GRrrOc(VKFJhcXc/$8R[5/l1utllYpCD{G +D68YK ?,m0&;W WKk^ 憤.:$M`XaCxd^d hC&Gij >^NrĆ xBXBf_\vvuL̐I#y swM(^>Wf_oPOL7YQUA NFONAZ"g.8S pd(ܶ-wol8d,ُTIF(md]*$cf:bEBn7 G.6L T$M@Ȗ; !i :,l/lN& ەS6Q:&.M?[/rPjN TCa5Lo:A]!o6? [& q[Zt]_xAd/SPR%]fk(Vg?.I_%c_R aA'C!kZ&Km^K| O<[K]Kr917]0xfHm'@]C&]?&Ad]{OAap{ TwHv'r8]O4r0\ (@sp_] M\>ql,˚@1NV-?Wr($+IDiP굃ڰW5M6_SIy7n wnC ؁hx?7F[U=K_EDI#8%Y?p⅌AsV>OTHQ_B;i mdHCBGnRL?:=?p=nIJ'mq$A G,:B%lu"NA7=dS`r`O_$`InC/PC]0`t>ROXYI do05:wpcQl:,d}mR ]+GW9 790\l?OtaārPxla8&aXBACZHJՖitzc~ 7bEh (7Q; s`QXN`dh7ƃ`b i'?,vg &oGjpWTBUD 5&5 M{n0f&%HVV^c c|E pPr(pH# yM;-AB G&LjMG\^ |Y#јr8S#/nqFnEV 9q +A|iCHy}B{BIZ !\ [ ~iC?9zaz _UQ吝5rNcZպ60??ę ֡{/6Y DYD̃Aѱ* ;{ B[A%zӤ0XޘN?wiy{$[ĵ5P_aT1bcKU !hgfsc=4·~!+g\ab06d/`:5F- 'zy㠌l0^7%oo;)j tE'4:NiOM>?Y58EfC3c%?N? (Υ'R¦UdpfM w&ۄgC!`XOTroSUGڿ]bVhk;n-Ӧ\= wL3{9+^S%odC x^c"&gI{ڷ"%-U^7rRyL H[kq0 cq/޹s E!5(T<)c)A|-nRPf4,0P1`sY&D\dwR3A+ٺ|o!SԜ?ek«dv&4/^% ;MM1$~I,;jx`]sVz\/1Co0TyXR^/2zj0>՚1B°I#ڸ(0?_`ɣaM/Ǚ."płNؼ40y;'ƸaiH?;(ZC/v7ܱӧßn>ƼB7Q(h?;eRwj-K'5.n\ )^XOX{iT̨g&H`K`}# lI `s5GƱVL>#8d^BFzk Od^AE#\;]>rC|m~ll9`qpsv#E@­]%=`GK6DήP%H<p}}d^(O= .yr?UUH?^!@WNFRWs3NɷdŸW1O g_?@k{CoKgcUȗkJ(JqoCCl< _-/~׿PZG.Q>pX.0_|rO *,]I鎸P'WIoyR}}Yr@EEt>uOiVA#. '`vteyvvwHNma}/ 4H<0(Ow Vܒ M"7)}V'9@|硴f^aÝ <є`AFv\;x,WGl"}NC~8?<=Q{h'فI]j~vh]9K9 ;#Im<Eub'z\aBΒ~Br/w ȡ[kb<51)BSjO[}m(Ki\j#MŌ?,-XRg[JI \EkӉ7 :SRqDIK @sg4|~q6U_J?/Т`?mPьGnU?墼38Wg} =3{r3O̫]ňv{uWB_dBc+ri/n+_zgaq%9̸L!gуb>ܷ8\ =Dmn`I:T`H'W+8$ ږ%Eh;}E `P/(b4 ٠m+1+dZ0RXBA\1>26F3S75 {s{OJWdCQz(~c5_ yCdcdJ$_(͸O@?C " 0O7-{$MgQLq_-_d !? AY^_'_aBW%rqK=;&o~~TLmDl߫I&Ǡ36~?Pa w8Pr.P-wWFgO{1 i5M\=fȦ[]oڑo/"FF9m?OCOCN!и ?X(>nH&p׋wt|% - y#;(8itb߷@!I{7@ YVv臣/{U__ MVi35'#WȯVeka˅nwU2?-ɿ[%;з$;mc fÀ2 Tɪס2Zb,gTzuw11&oE HjyZVL~CRv_/t,t* M|k .TA5B=!&|,a9e1i%& !/cr ^Iy_ӽ p1 d>>̶Ոî 0rlqn/kءDVX9/ű1(x⤣2o~X$Ū{s0a!-!)۳*)e\,0?Б\,ԩT _w:^VxV޾\?!uQųåw#)Ei/z毲[v F98ڟD)k)/Ifӛ/~ߡp%Q^$Sl㭫>!DYwS7yA+WN )zkS< ~U3rŅ?~  ɋ~tn,fy3jXDDU1Zs"*ˁc8:$zi HIĀ@8HL H_%A@N$A UeQr% 9jyMc@hV 틕Z Vqק)N-fcKw*7 5Ja"ɠBր[t?֙!Y!˓l @CwW~@PճMװx QV?$AV ʔѹna$ XK'aU{whkldMDfd~i/IO70j5,s@IvM;B(HDLns) _ɋyaOw.+rץ<H+FYYEEهTNoHm| ǥcs_DVj͈)prͳ]ny` ?E`7 ~xBN"r\ir /N2g@#x\n܃"ukMxnXO DH?{vw#Vu*F9( +8=6 JRfQZy䕄u eX&hJpFS(l\v0k)Hh76*g$ k%ֿMDUueI40" WIbuU~bڨv^FESGml,gHL|3Ch\SU2` ߝWc9^28aI37~^b<#NygCHKJf-ۄ? Ja)Yfc(` 0qt&@3/C~A^ l 7ؒ0~˜os*`ژ46EK-%#= %IH'=6Jo8C@TzWOpA:ZTU|5YŗEZ:G:%6~=eI&TwQ[vlDȨ!帊iX`[yY);L;]J5ULkD$5鰽bעT/I18T(q)9H/u@g+3-fVo*ɛ&~?;`( 'K)d?P˲,\26K_A !PNh+ذyg\CPIi8w?e0Rԋ@+>`x 7}02m-yyS"w?RXoxkcZ\3]ùzvByqj3ƚ`'PC=+mWN%ύHf6AN( aϩI=߹ _d: }+p?,APO+Zbbyj.H@,Z@"ғWES4n)olIIBr~V>olbfL1q*+9)XLVRf.S9v.i硦>iFt+UvuOx39]O#2]2=&K/~~<O^?vf)o=E4ӷ+4MrN=Uo"g`k=ü0}8QcÐӝXyTGָaYwSW-XVcNx.F~eyUڑ0@5㶼P!@=XI6QpӱڍyKoqK 0ݻ맕d5/$,q/ _tцB*v:-7ޚ, )p@ :$7ѴyN] h1 HZ޻Bf1畏?r 3uQB}\cmd!@ WS1zݨ]3CoFq"8ԚέiGb[UgfN G[oLĎnrWxzdD]Ջ` l_9 ͯc2pIPӻߘ)* mS~H~X.t;/RG'~[!_<8zvOB9`55'{ɸ6g {pqT3^-_+d, =4pBwbO&Ҹ$d%FN`7>͕xE_{ú۫v"{.1?%$r_q =mPO%os#(ĴyI%4aĘnzn|l6AT޾'VAJ렙mgB`u{ $;g9?T0q;Bd2̤E}JpB }z[Z?ՌM (ԤΤ0y43S;w7x泀hN~; |9O*C}/6"+7$Wx4oagaH^RA^e$.@{脠X[ݔVH۲8rWs1d[O~/J{` ,8I%vK$%Gv XY f 0NndQ& #_ꃢSB_?j?$.Dsp"8 1).5 mN!(Ew8fTl 4)P|ɵՄ? Gy 1Ѭr/~&jE|&,G$l NWqX~=tuXrX͋qJT{YZ90`*#`(yA8۸y:`l>w'K1/x`\`U%U攫UbHW@cjO9U*4\̴ATr|Y*oc]ũ+1t>\3֯\$lS2zw(;Kkē'f a!`|H2]u#&܈e>#ŬomD . #i^Bh!la gӫҠQjh/T(3Ql n;zP;*~ev9>YfC oEå}^(os D@jVbN%w?6r=B$7H /ۛIrSy%P;LylO`@ž\^c$johS9oR;Q?G+0DE^J3(fK.WtE9_ ӹyU 2`yr,@%g̣饎"2u<kaP/R=[#H{1S>W\o.ViB~(2gsUO'[iXʻ]=!lJG-ySeEIҐK3~ˤAb Lw6~д+MەqՓkю%ǯ/[{AI~-%^q' h"W6d$ c)CxSZ٢[} Źv&ϕbhAJsN-GJ{RQ)7?Wƛv`+toWk *!c.4dV]-SGOjnpzKD). uİn}ߧI`fqilR{ឱ¥6)LY@Y>:T?eB[ k?ҡ08-M]% L&pc^?kh >BAu8/?;21>WNmO Bo 1,y|$ryVwO.?rU$qk.?̈́Gt}K:zfC cdG27;C$CMQePP:qUN1w_V5kǣ;< $Y,npEㆱo ^*>ZC=Ne)׀%fRxL.jxS<- N=+6&9`y#RnfE{?7(2UZl!Xeh?;/I*/n[(!pa)uG$a0ac\s9pL ު˼,b`\ndi#PZe2Zh@*<1! T_~}=b7w-_h)5ǡޖXxWcr"ÃF T0.SHُ(1mX4a(Ws<|J]d]B> EꫪOlOBBǵj;Oe!AyMW†j;Pb=bF&[_$ti GV[ Htb#*BU >ap?#r3A~_;"lY7|`t˧@n2w΄PU5ai Z .zD4Egɞs͈Uy_g@Cge48>q(= m!>J=+hZ=@&L4)i A_.khq$j 3ԷCaP.9FE$tO!@M5O/f m' A9UG%ښ ʫ%=K)Sچ, m+iHפh'?Oz|Ϊ_7әxB*k@5 ٫9N;VmK1f_&tn:2C[Ah xNV@E'H::SU kKмgUXc)3VJ*%1?~^|1)p/'\a,(H"m?H܆AyG@n]Q_2Տd5A4x{%`*`lc´2Of#k>3b $ r(-Exb}doITH}'>AcG t.no:7`LknU{7,gm;e )̒9 i{f} ϑ^و/$[Qy{;v97yY̗&-1.Bh;+jLu.x7BjQ满PcKkؽ%=YBD n *ONgd_ڈ鿾dW{x`M``FѰ8Ew63kBqA_^;Z4ٷ,Q+:Ֆ}}>(-}|%ZLZq)GW;()f(.y_`uD^mm%adâW?ߋ'*:m?!cy3u4V<wQ( gQ̫_QM 8bX7 z{>d!Q2Ow~㶨F=)iSHd$m-if! FEdlX<[@XB̻k~jo:D 5>ʹ_dfGof,ҏ"'@W#?15VbuZ6ns҈bIPLVq z2E{Sb%5iq"Q˶+v>S@`8G% 8vFšw`/ N˅؍芰z~L\HjiԐ\-% ?2aN[wߏWrFb:RC7uHfQ%gbT)Doڑ\(6DK@'"<ڕ\ $v4nhgH(',VC'UiXJXĨ k#KiqMn7dmq1pE[M7=6ZLONG(f WplongkhOo0p,˃0Ёb|`Elkf`D'ܼ@EmN1E3pVT-5n2_smplc:\`=s\bj\mijn ALo\visst04ԠKKhZMhqF.c@_5Y/*#?\CWL'5hNp6/Ϟ/Kb鋇REQ!Q/*mJak'P%'ZsKG0x47@&>ח? E]F/꒵v` .vp['&TΕiͰ(؟Y!ԟO pXȟ 5.wbX2SVOKEI7D>Y^\`](|!@ ԠK&6lFgtE7S6[E_ScL;orpkSlGԵbg'jd%bfpJw6Жx/4Cͤ Ep4CC4Cth84>e g'`gfv?iiGvX5MLP@&<*?@ ?8& HP('(V0 PO^_57Oİ^ &vvvr&Oآ` >O5?ů7F ׌&ģ|Jlo c¤d8qH P@w  ǤD6!,whpOǣ"ߟO:&䢏7ǖ %R^%tަM^ OZfHV?E}K_%IFN'S=XaGD=Omd'ENG'g(L)GFjl_kREeb-iN`7mkOM(m%WIYz]S5ALOa . M_\/[lK7m݌K._X(D.I0>U,mssoظlVF6#.dڍ.GSp&;`uZEGc)yK^QOШ/w=Զ<="!hlJPH T=lkv$OTȫK'BNર> yuPw.Xw' ޠĀC(ozPGtn)lKi#3n]6F4 ONbWa9X156u+oJE5QU߷yF=gf2 ?cY0@ Zk@ Wkvo VZ^NܞWkfPZBC'P`pon`Ӗ^pǰPD^A_DE^FQ_nW^mo%]/lCyexp_u2.W$/ȯI_oaeppk1xX]eu[ѱEb[X6? Ƃo'=Srد[/t8įv<GE|?ǩ e&< 8YlE _D C8;Xp`M7լk7bRMATnBWSE>9;QOCIMP%DEXInfu֎#rHfRwEL[izk&5ueCml5oM*u&4nդnR[V0[3 @0E+M:CnRVMmao5xS6C(H]ȫ='gen.kHASILC~g=^=qϢ R( YS5bקMqo|EB0E`7> @G#RIi!& I7$)kktm%_'M.|$Nk (SVK}E)SUB{UlEin?)nǷ/ y:n;Xw/f:@vLEPb2u`򠇐kbp[k'_/VcᦀoF[LaڊTt{?h bLPi DoFcro%WwB&o\!Ȁn횷Fߠ!dKq k8W RwsX]T;X(7UrlfS Pw% ^~sE\^HpoB %dȷ>>urUSA(Jwkv /#VG_D` E c.FSX&idsz_vł<Z2,)C/E} x X)O3sx}` C`vp/7AMFJ%ElR "AV'tpj] KOf{Q.C 1 3U۬SafiI&A`a )?V;CA Ll!'K# LAUd5Xch +~?5a56KWvq7>Ɖ̻5/vD$f@l!G\DGR\G]ACdhp$vXWu kSBIF'Ȱa&R=Np忉C$O)䡘Z@B"Xaa;ȔUC]PpV 9o4 iX!וaA]URIDA9JWJJ5Iz殽ֈ҈`:H[#]H9mAhC:/-X'1?z7L=_`,Ozc'FHT'XFЉTB,.Ǧ_r:'iDhPO;OD3`-Wز݅/G{`AG%{o odOKe}uV }]ȋ?Enc/SYo:=m/?0 _!1Gƻ,)#oF]Y"NH{! D'4 )m#6 &օ&'R6r]!d{ـL-GwPS@9˜>R eT?s9~OH`w.+ I oJK LM NZQ:|?a5.c7BKu/ vs1DXY! P&6!ø>m0pC,OpvPįFTֿ$ /tÎ 3d,fHX.0$(X@!HV/@0 8.5m,`_ .@Bҙd<h%4Pӌ&O,Hfw!ƞOƒ.>_ > 7s_|SAFt&BAGS/m ib>[X5sh9-tC7jcWTjR;"?_Dd­K/`J8n+,bF*SpE6LO@ ho/jG&N^4Ҵ&4 ,iP  0 o#p`HUƅހl8qhV/-8c'.[J%Cj 7P8 32`3 /_rm[1 j\] Y$3=6; wapi h8W߫ .BN҇>4l&v.a ?3H׌RpF_&DhFY _DPXҾi/&מ 8H!_(6 o_ _d чn&U ̼FdFn`hG擃&N$io0͗t3 M3dpP H`t Ba&VmLor/Y/qn>GREbs-+ q?4@e9'e`s'duIԱOAt/d'a`GLEXb# !%B"lvSlTUWFcX7{{goowFc#go햴e'° ]Tv<ȯa}OONSE B6_BYTES{ WLl&^QU"1*oT_kkV1'cnIo(`EOB,KmRf,0'>m :H!IPAGcvLFp 6 Y_A jZB` ! e.YF :|GM~dK=\X6U3lXW8Q%wi,"T # +tH+> O c1e ):/b+5OjG V/}S (q]~$h𗓿GC %379=KQ[]agou{  #-39;AKQWY_eikwm)+57;=GUY[_mqswA?%_%8)N %'-?IOU]ci'.  ')/QW]ew #+/=AGIMSU[ey J'7EKOQUWamsy !#')3?AeY]_iq  # % + / 5 C I M O U Y _ k q   ! 1 9 = I WK a c g o{      # ) - ? G Q W ] e o {   % / 1 A [ _ a m s q q    ! + - = ? O U i y !'/5;KWY]kqu} %)1CGMOSY[gk!%+9=?Qisy{!K8'-9EGY_cio #)+17AGS_qsy}'-7CEIOW]gim{!/3 ;EMYkoqX%)+7=ACI_egk} %39=EOUiǔmo_#'3A]cw{57;CIMUgqw}13EIQ[y!#-/5?MQik{}{#%/17;AGOUYeks '+-3=EKOUsU!#59?AKS]ciqu{} %+/=IMOmqI9IKQgu{    ' @ 3 G M Q _ c _a w }  !!5!A!I!O!Y![!_!s!}!!!!!!!!!!!!!!!!!" """!"%"+"1"9"K"O"c"g"s"u"""""""""""""""# # #'#)#/#3#5#E#Q#S#Y#c#k#####cR## I$####$ $$$)$=$A$C$M$_$g$k$y$}$$$$$$$$$$$$$$$$$$%%%%'%1%=%C%K%Oc%%%%%%%%%%%%%%%& &&&'&)&5&;&?&K&S&Y&e&i&o&{&&&&&&&&9&&&&& '5'7'M'S'U'_'k'm's'w''''''''''''''(( ((((!(1(=(?(I(Q([(](a(g(u((((((((((((()))!)?)G)])e)i)o)u))))))))))))))))***%}O*U*_*e*k*m*s**************c+'+1+3+=+?+K+O+U+i+m+o+{++++++++++++++ ,,,#,/,5,9,A,W,Y,i,w,,,,,,,,,ϰ,,,,,,,---;#JI-M--q-----------... ...%.-.3.7?.W.[.o.y................/ / //'/)/A/E/K/M/Q/W/o/u/}///////////////0 0#0);0U0Y0[0g0q0y0}000000000000000001 11!1'&>l9E1K1]1a1g1m1s1111111111K111k2222)ZeY2]7k2o2u2w2{22222222222222223%e3/M3[3_3g3k3s3y3333O33Q33344444h'4U4W4c4i4m44444444444444 555-5;_5Q5e5o5q5w5{5}555555555555555666#H%6;6M6O6S6Y1k6m666666[6666667777?%I7O7]7a7u7777777777778 8!8G8K8S8W8_8e8o8q8}8888888888888899#9%9)9/9=M9[9k9y9}999999999999999999::::':+:1:K:Q:[:c:g:m:y::::::::::::;;;!;#;9;E;S;Y;_;q;{;;;;;;;;;;;;;;;;;;< <<<<)<5 >>>>#>)>/>3>A>W>c>e>w>>>>>>>>>>>>>ߋ>>> ? ]?;?A?Y?_?e?g?y?}????????????@!@%@+@1@?@C@E@]@a@g@m@@@@@@@@@[@@ A A1AA!;AYAeAkAwA{AAAAAAAAAAABBBB#B)B/eSBUB[BaBsB}BBBBBBBBBBBBBPgCCC%C'L?;OCWCiCCCCCCCCCCCCCCCCC D DD#D)D;D??KDQDSDYDeDoDDDDDDDDDDDDDDEEE+EI@EUEaETwE}EEEEEEEE-Ba/ysqr6Sthyb"[):'un)Xb2_3u6d "#29$RAPHICnÚV)O9-t?15>43[-/1 RE_6 O dakcN ঙE9-18P5()''?,32' \(a5j:?(_DdwymMAKVd*%zq+Ri`k7rsa%3_clnt2A;H->tKx=8Au4sC[99opd#l%#?ߦ8oN\ 1?OKFumO %O0 %(% %  %  % %wK䐁O䐋?9"9z"`JM$/̟20O J"9D(d(?Ĩ$'&ڴ OﰗKOh@60HO|r"|J0/ vEONO5r:`?$$O,v4XQ ثOdt@pd h@Hd `@X#D9-IG |ME8b A;Ӗ`mK40vZAmmKRB5voe@V^) k+bF~a?a&^0RS Vdr f+AHgkkXd8DHdrdkèOLUzAT'Aa2҈c w8pD"P3u[7GE_'W: #Wd$R LKCP -C `CP'128"P3+'H'}G! E-p/m.//[lmm'ݵF&&lmmm'ʹlm /-n/7[Klm'WF[m// K.'"t mA3B3݀&'`GM&M[ACװ['M׫l-'-M w AK,'$Pvv-'Ap$vG>F[//v ./ ,/6 (/wgm;IsAas16FyA(` l&6wo[.i%a`v&GNpktRal VFCCBB_5,-&5\o7 g2-]2;M >mGE!EKw,n!Y)s' l7^&."6_1!$.g UG7?lu7U6w?"-D?`GH1?)ë?m ?ؤ‡7A14o3!m71#A7jxJca*/G62ei6q0Xdg|K"Z*]OhUa6߮F(Wh$LR!N2Vw aE7 q37ئo" +nogmJY6'lDk'@| Me.X a/ #Y%*'-0/6 wObVl.Np"!2*i#Mep/+! `mOB/m7m-1/h'#֗#uacc 0p*ALi`\6lpN iZR}eP K X,/ɍne]¶&ճO++DF *@pT/N`F3& Y1@ /iB_X;wR/eV'.ji7"'W/6 g/saFiB6Z[Q/X^./,'lLW+'[v_c?=7F-k/-7 $SdX 6FU@d b/aUNB:|1}Akrb50(&Qkt E`z/ *!?A5/rd_($kbg?)wrvv-C7^qVB@ K6E.'Tj[?qFՙ>7с7c.: ՛ d7l3hP=j4\ev~bQ I -7[6}/G=v1ubM?ֆXO/S1Ϲ+ n XƧ)E'1TĦUSKZ:l#8 /Q€+x(,7(J#RO; OLa?=e:CQnebHX1lk65X\OnL E77f/&촍t'#uqϴ5/O'Xrڦdea`!)B.mpBE6W_'OKwWԭ;i&d'1c6dv7m#.I 9.Og#VcgG ]>Cs)14T/1֩m/(GXtnM@8uk\'vYaIT\ND%$O.vTUPB>IOK/KCwaEC 1E`K@ZHd@A/d_P25Q-#6 77-/VV/B#7,n7'C xVOI FC7-/-;?@/fd]H%m_f7LKr9OfTn[___v W'm[p/[  _9HTZ/A1.mGr>ttKNEELbCt_n%?6C?0'wkxoAe_WBu=O]UFFo=Ta%l'K [' W6 6.V/K3z-&_ &د6ZA??6Zh7k!v!7`M?jLPX/?/nal4_'д/16.>g'$U_Mgw.Gwofs_kV0c 8=—_ T/E脰OB_Upt_>FvyFąeb7=/l@RU73Cl K?Lk߲ /؊?$ӰEO7A$+viDBX8LSW#s=1DGJEǟ-&3_'MP'[/S'.Nc+6?%/UoUX/hRl?[1Y>jN5XprEKO\#CP/p5 IpvET/ n7/DeO.4=7tEDŶM.AGw,T6p.'`?k" 7h4p(/b]Ti/nme?0يe/W.B' ]C7RLWXU --sD16HM?Oט6{Q|.&tfZ52?20U.Nh,mŗ'?o2WMAfI{^W\"2/q۶-,ulh/iնm/Gtl9F(mV-m*o2d_U0B')sVp0~0д'D+ )1G@C7m?[[/?a4`?V)wSj ?bKP?SF KmB'Bچ3'M-@/qFQ/GEøMFR37[@/ր鑃!7_Tc/ G7a['MR5'_-U8`!?d2iFр(a@1wJ*7WIV ~`?MP"K't1 &. V hVC++ RunL%9fP08`3@bu@nBp =- J/m)~Fnhow @NQ@ \,pemDVSƚ-ms! a:ٽeF<(S,!P-iAzů!o[?9$ה#@$"zAC;9H h(<2 HN2`KXڂw"QM McoCMTARYCOߖa-/_.,_K;d/}S'./\?* ZGwaY6y!b[v!O(c NO-Wk7sC-?a/pm m^ pGpu\vy?)y: y czT{z!/|h}`~чw40&*I!nb;F•%isd_ ` >jXDMW֚dib`o`"6l`_BpnEC~-m@@ sZV7IWa%X,_<nI/O@)60!7T"3t ! kR >]6wY%,x㟷]@ agp锔2 d bp vu@(XE_?ԎW@1,/@H{6WX&5)JXQ+'yMOGbۈTՉG^lzkRWr=t yI:XZ/B^ґn}!ݓGFlslSGAB` ó ldBN,ϸ.Xy!/S3 iS. . @.}Un6 tALePk'pWBoxc 0cBGrײ>E ] (8H?PX0WPS`h`]i[58x*1ę4'lBa1r]o@OSS VUcmM$`-# 9- bj lB8%^i J*0.= vn] i'T »3Omk׌].MF$Re8[LOBs7nٷY`.Qqko6stdp5&_#tpaEGCOSi&"N-VE)m6-F'"GO Mgi 탎M1coqo$\.IcetnlgfmTT=߈:B x:O|=CZA0f־JDPT8#q1'=sEaaY:?7 vakZ--,pr- )-= nzǧ-ahZl'g΀وXg_/ci ~C/AdaKNlXLNOTwA>B|[CoZHH0 Z(A./e=o@?@T G@@ȳۗ@xBl##'^&ǁkdr`cr'i'GbivDaZ7vPiCedz*n/%=g#ysk'kOGq':ir{@g="Kl'g0ph.\~'a,f&µ'cgbh,Y+-,k%9 y7/vcj=ire Iib+\ڵ'n5a͸7 8Zq_tpt@Z'aCj`ͬ'6X[' O ,a*b7' 2@'t'-NB N_!9`_%-t`W_cmd/eO;Qߟ? G춹|b/$O{GOH -o H   ȋ='N^ AV@Ad Ha;p. ;b۹K[,uT=B[efaR !* B;5bCG)!_)ofD&2P  *RsS8bNFO4I,ǙCS)L AS-ࡎȿ;TbR'HV'^^++-/`#i1#QN5DS%.=X={>hC>Ra 7wa>Ki& FWvpm8%,=_2 h MCwf_..c{!"6 ؃EC96!RANY\# 0 /!I ?kd`,Ch/,[ &`GL^76F7Fh/7@<luN0`),ưcFX.OWfyn hOW_0UCS mU X7Lo@a!I=*Q 8WWby \RUc kBx.d d"8KFM*L$`[ kt3 E,ȁ p[$b /%` :ᵵK-}.|: SE*ǹ -Q  $-à0;'%5*)޵Զ97e/nL,' pپ "mqtCxPQ! I wnV)O.lSaM[CbuRZA1JPk·Tu aA@Em#oj(pu\WסּuO8!7]7K-vV(oH#4SBNP*D8:U1H^!/'1_k-7;,'Ot _^EbCHID'LIݶn&Og%v'DSCEGOH@' ${['%[uMW274pIC%k~#-Z31/"* p&L %Y8Ѡ~l '`SJ~ Gݚ)ca d'JE-BAl/GmRHe.F'vK+E'IQh5wl w'_' `-ΰYNjobxJrd0D].Co'-.KՆo7$Eov[M@\/GԦ 7siA GOd/dh.);`>)؍G0e_v^/#n)n#E oIX5agHJ1@G$xǡthDB` /6IG/ J6 i0Gz6UNbb)/A,b 0Wt _C5/8נ?- _LOA- gk:<%_+7_mMb//p#)e'7NćevyG\VWPFTZ{'hipt_i/z6X\_qP o1dZ m\Z삊ICxcЦF/;<GOH@pQ,J8p^+UK9GCHUif\M2_%4\JlA>v0ldz6` YNAuwm 7tȲ/ Ʋk"l=LJ$6 1c{6ɝigDloN'cm ڀBb_ ׮-vS[+T*Om oMG;:7B Tb AR TmK+K cKr7Cl GY_r-k/o+A9Da7^OV6/m@ _ڼEbrLXjU!&i4RkpGFCNmm/`k۶AD (eEAuAN98\x:C @"z6wK ]Op B/m#H;3gCaAؘvC6'6&_- 4/*L`mŸ`XOabX;F9iv`G'{oJ7B,#[yA:`] FZ;dٻT).a(@,lF!ANk6i'_p7/[@;/ZV܁J"pGkw!n_EH6'6$/M׶)'G_le1Ԯ.UL3K_1p/[;eVa/kH!,U='aKb''-EKg'Fm#aF!'B%Fde V " G`FFDL%3N85GNc'q])7c4/["OvZGK%lG+("H.Sˆ+Q@0GKXvPBfYVK//6+`pƯn1 \g"',QO B 27+TmA6BF/Gm7-u#Kf:;w60Geg wXl%mc1b ipI, 'Nm }rWq*?&MRǍFŖCH9bk1`c&K/w ӂY7*putsni0/`0q_^mڎ45N?[YAa/vpX{GpTܐ_w/u@ W0k፭)&B@nޚ'Pch4T[a[ ?.bso$,@/bPu!'[#( 0 Z36N%X'V,7 I4@"7- ̜'VAڭL?ټ$ @ VֶC O-C ԫsl (_ub54IyF;2ịЀŏu.yBB`!jP7#XXo0 Wom`iֈWWX;pa[1aA՟'?@/`]Aj"/T[g DCڥG& V1(OLX27 ʔR]NX[0Y|=aV)1֠&_G'toA*eaoZdec'KPW'#NwNAFj){`i/DZSEj *kmonb]6/VK d?vD /gZ%v!/7/*WKWgֱZ邥7)?SWoOMGb^C/YMxcI'NS,ܰ&<27`37!2{73oHm?/C&0_%'25624!q<192 [-0/_[8#V/Fmg&'UPgUؤ1sWAg,J}Ś ƅ¤(c0!i%$6KobE'R~'`-'gCR/l[O47ziJ<%v5.*[I!ЧZn[Jo};K3'c Q  qc?.53v8VmF6 &alj- ''k-2}s'wckdppHBRUN5B'!Znm1uM\]!s! BEpkE(Xدij߅5?iR矄b"JlbrMk㵴"Z˥m/'F]%مeh5SXY/lp XG$B7_$LB'ɷ*bGimVp4d d2 Be!w@_|Z0F)ghTB% K' Ka H"AN5 ]b%am?7U oX6mqD`ͳ$&bjpMR5p蕾 WϝbMf-wnXt %q Skk mѧ'rKW5A/ -5+WXvytnס--17F''mE'K$@#RD,"q6m8e7EĀaX['Ejg'Igzk v$5~HA|TAGGi07 O vC_lD[[72K/uDp _WR.>o䐦!o6/_2wO%Ov7nh2G؅&.tR'N'M',`&URB*焵GĔp FWZBWĭY~7!3 Ggc//F=ڍ&BNUbS')|l~lBBA_u_-7[4?jc{3t&v. 57'mm?EGBpxAVoO/PZUh'ף$/:Hh/ 2n?']c?rN'o6':)^阠VAR+HH%,oTY&>[F,YA1qohGW `aͨ^ G OQP#jPRNvbc3/) d3[/RIJNDAEL[kP'H,#1#WC[!.D DHw[)'de b(72- ia/$2D:JC7Ip'f;?MD @70&E].ջ (&DrdvM'eOCŪlFy?'-gCX?'# A  =M\bA(F&g׸b Sm5EX'=BUINfNRqSOũB'(pǹR7cm3wc%10B.ѶO bA 6N370Q/ U؍]q$pR[0_pq]D n2 )Cqj`v'7)}e 8 L%.#Tt7J:[D'A*A\QH `%F_фo;:%%gru\1vL1d.R-p'#S+[Hb7Wm]78@anTfX/02ݸ`/1Df 6&gxe7_ehRsRq_; Jd/hlUM?V{S7g0@u&ҎwXmb/{b3g j2?1SQ l15/ [ZS/S/VK?[1x7mj7{/#aB/DE[R _M^ɫ7DEMO-'$C,Qw&)g F+hu/P0GDEu`/`.P9zFp?VO ~tq by/>?@8J1 Z &UXm?%Ս7_x`Ic jm)uj g0)=BnX@HzSGol23 ~Vn#[qubqai7cKS_׆pmGlAf^)n'!-Zh+7; CL 'N`-pFXHm/Ԟ47x62!Gj)' &a5ar X7/``R2c()l2. d4q6&vHmk/^ 2pB_ vms'j3R.O672Y7oi/!%(g-NgxRND1U^UnZ e nikg V`-<#TA:( )H Rgҍ|pnodZ[I /fvq00~S ]&26Њ9T_xf^n@1VD 3@zcoHA? W56??GGHIIKKMMOOOouPPQQRRSS1!2Afx2y3#Bz4i`90;{%-+r|6}7&~8*?9(0)-_6o=+4 8qk*-}ҴW&jC6R Ty{"JUi6IsӐ P[{]0 5R3U4GAD>df`3!gS"hH#jJ$kmC TLw&;:''U(`~))G|zZF,XQd~-AC}V>/|T0N;)1bh|2,<.>4A%<&{5AJ*rA=(ZTDhU]=ځIjWk70!@)[APM< C)pp0<)M=G7wH8I9?-K@`eM6te<+O1uP2f,Q3vR0S.?RHj¸6IN$a-AI011H@BB*7=~.'zHELajw'IȸoiM-xNp<,4Ͳd`\XTM4MPLHD@<4M4840,(4M$ Z6M ~fBECTDriADGOID\MRLLPMM4YNADNT4YPESTRCL4EKM&53H&EUGfךVWKLm XFYG4M4HMNRTiYEDEG\NTYIBD4MGNTOBGiNOPWYUB4M4DGMNS4UY&CiyLMNPR4ͥiTWODGL4MNOPTWi6KYRUBE~U4ͳfDDMNiKRYEELN4SWIDEGi.MNPOEGifNTVDD)Xf>UUEnERvGGiKOLIKMY?Mm0VTCVAӼ4KEWYFADN4MRTYEDEM4WIBGNRTLsi.LOYOEG, .RNUG43DGLM4MPSYEE.E4o`1OIIi &NS *nYY43DLMNK4MPSTWYEiMNRWYL\IDMnI4LIBCE3MGP6vviEGHM7mޢ|CYFKEּLLNKN'OOgɚQRFIEEidEEHPEykN.LfDsiEPTWROiKYUBGN>U]QU7MiiNPTWY4MsEBDPTIBiDGMOP44OBDENO43OEGM9:>SDiGLMNPT4ͥiWYEACEi.MNTWHEY4MsINPRSTlKIYLOBK4MDNPWYPM\AYUBDEMJ3NUOiDGNPREAK4DENHEYL\ICEM^I43EGMN4MOPWYRUVBFUUW qyPSNyfTEW6G\RSYEB4MDETHOYi.INTOKNOɼW7R>YP2MsiWEASL;WYDL/7UCHCID,MRTASaMǍf?OdřEGwJF\{AECGAIy MSOYTI'Vs\SIDMOOK3oP;KNAET髕GABHG{MYTSS{E OUi %XUIDCÙKSONA^;3CB(KDyeyTK4MӴEIKLM\NDEGKRB4MDEKNRkSEHKSTT5WVK5MMNRT.UiCEFNRT.ͥiLTNDTRGiNNT)PafB-'f4m)iKL'0NDGR.asivOTEDWB4MCTWUEMRBOATCAK`\DEYGH6L[ONmiNADEGN4ͥYOKMNVR'i>RRS-[ּH7UWY4EGNYnRBOs|U7DDFFLBri.MKLNKTOYiRGLNRT.4YSHSSYTFEGIN-KFLM4NTRDEi.MLRTSEHaiKVEWLӊffDRi.MTWEFNWsi.ICNOUWUBLG?4MӆMNWY3ODGTUBWMsi*TCAKOi.DAEY;GI'KDg4TMAB.94iLNTRDE)0K&OOWqiGMǍ5O^'IOQS'^LLi.TNYRBDE<Ցi.RgDfLK{fMNAGKR,5RNTDVEVY7W4MS]YFLNNRgEDT\LM&FFo^DSGIoCE4yEDTMNGT3ͥRETSCHfs ESLELLLwOO&DRT3UG&vvZ4MGMWEU&U5`iUU.TTEEKUNEKS6.E@NSEptiT/E0'DGEkNAEGLBAQLvMT3[YyV ĘV~R>3\FFD'k״NRKLMM|ORMSTWi.MpGHTEDL^&N.tKSUIeSV&xLMFNKR(k>KT_TV4MֱKMTW|gEADQOCy2GFF`gg/Isi.KNDTODi.MLTRDEK.̲M>SSUFK[~FUYEDEŝiTgSX<LMEƶRYSGwFG4gILNTLÃELGiRBY?SHTU坙VKGG( 9&TՍ4gǝEFT{i.LDL?4RRSNri>EENIBOMu4WUEMW̴LS+lGG LӼOORfOkOvGGDͥiv/<WYIDM<4NWWU\LNK7x?WOYNHAAGSCKILRi.LEFLOT.M\NDGKSRDgiKM>%H,HULVWFi'HLR"+TBEHK'FLMRaiBDEO|`mNoYGHKfTkNDfIVI;nc^LDyf&6HN3KODF6RNw"YS^WOYUvU8| GEH3|KHHN0 vFUýM=M})wO'I; LY5y1? #OWVp5;^SV5 I!JKJJKN1JE6DRKSSTJf>LLVOFk>?SJELY'HI{fONO4MEOY?L3<3K6Rw$KALENSXRD/Yy+KYDIDK4NR7K\>.܌dvfL'UwW2YW.Le4NREiLNDS.97SEK{^E^}KE3fDN.EUF|"LALYMLS`fIIKe3>ONS)FMNKVΩ6"SISOO,ͥiNTRDES4S&UWUg4UKGRAEK)\SHwNNyO&DGIIDLN'Kͥi^LILTNAN4YRCEKSٙiT.&S)4_MMMOLNTvf\EKL.[FlmN~Ef6KLDEKyviLTfEҞKTRv7ATOOg6ڞELLsiTNAKALNRN<L3O4/VK;cKDDFFL+U7S4UUfX dk%Å@OʃHڤ1*AGY`pn9.F 杭?VRJWVnSMDGK2d0Gy9wRR?KNfN6RT0M3]VRLMfٶRF-6E*5 HK\AdDE*N.SS3gOnOnOι4MFKMTSAES/2U)/YDD^4NGSTSExHK&SS2g~FEGLiyLL.LTMNy3NG.{OUFVYRf(KTOMR4MsiTEDKMNZgSLFNBTSGM+JWYv3MsiNODET>pXU&PSS|GHNLKLO4f.~II^yTS"AK4WIDMN'δWML5MkLNLLLFKӴGTWUGM`.My'N'U&ۼSCDAd(FTMzNXNSd>U4M[GNRY3ͼEMWITg?DSfMyGMUUͳ0SWGMg5NTYIa&CiTVT,yLKLNs`k'T\.MMRCHEMN 36^T/R&FRTyfPMNKADTGTk.4TYEDR`L<MUTYR0NcT.33FGYOKNpiLT^6A&̥iMYEEgӮL{MhDT6{4>UCKL3oQNUgN W7ęN=IPZ/tD}L|HVVLE2ETRBOyS>?Nnq;Gh,DEGILiyLK&L\EGTRDh.MMNTSHT}TW-/LNRW-3]6WIlLTNRE˖&YN|3TOA/FE^0~IEv0dg0$A%Vq`&KMG6P,LH~&hkۼ`Xw&mJ?4(iN6$Wrh :/4MF ĠiMӀ`āidG*PE? nwPFa;f|G<&O {b'&(kNKwSc']&'K2 E Ȱǔv|dK|l 'X(vd9wH(c |&Ek`@ǔ4gd@ ad 2x'l 2XPO6Ȁ L@A'Dq,EglM w'i NXpvAD`'%eDdTwH'644xvFd<$' Ȕvধih£xAɁgh&E߭ O&XD@0%L?dؼ'<0؀ $' d|w 6p'CI\15ivCHOl ǼC<@ج'0.`gm@NnǰA'699pOo' do(wTu pL 2@Ǵn6 4O(' 9l`pOB2 .d'TpKH6B2, 'MۚYu'l'6 qY NQ0l@vx'ld@?O\ Ari-9&R kPLw2l@@', |lC0 X.9ALOA@A05iS 'H1? yƬ]T&NO.H3t2H& AYUvC21?'yAV ì 2Hw48ȠecMk;XL@֞i\6@ ?e4X>Tm>W=`$Ͳi<^;d(Y6:P9l,p 86@ie7h64ɀ6l,5Xm4?DMM3(24˦ih10lf0h/͓ox. ..-4f^,p0me+H*_imZt4*f)X4M)G(Fhi 6' '&&M3m;d&V%ii$x(#Xy""K֘~GwBe0py]J'O<ɓd T D#i_FK&w+x,Ow?mOH  .=ȱ!5UU,{ M Uy!C9E+? +#<ޥC'.#S;6l r!!†}y `B ; k  wm  ,}99C  U˲, 3,#mUMe-dc*+9Q^ S}B  8LTr5$ w)!a%   r,/AW71$ O^޻+e6dk I&%o y:\rrlM! fCIjlgSGC u[ذ7).0X7 (*+Ka| OڴTI&dvZK.K\rɴr%%\%\r\r.6  K K.K.K..K}KK.Rkׯ+۝K.9\  9999;999 A Add dA ɰA 2 2 n _ygA < 2 2 2 رG C9.,m{k   2 2 2 2  9y2 dAO r 2 dc0"9!!rBr rwvqI++tmtwwȾ4H:X &,dU)\73e?c?HUe$78.= 'c  212 ~b#e!2rr!)*+;,z8  LSp, ca$ҕ5 %ikiK_;[$L$L2I2&ddIdI& I& I&d&ddIdI&%I&&'(I&d)*+&d-./0dI123dI&456&78-ov %C,,Ag*g*4Mk"4MM4M 4M44MM4M4M4 !"#$4M%&'()M4M*+,-./4M4012344M56789M4M:;<=>?4M4@ABCD4MEFGHIM4MJKLMNOK4PQR\i4ͳM4M i5 _e# / 0 2 9Oo(7* f  bc݂ ) o rrr; a v!!E!#o'''#7##$$Nna' xDǓA /ƉgڧߚRxM.XiP0ii,(Ah$ 4 fA w /Y2ii !i *|`؆ 3/ M{g .44\P 6 ID9 6@&0.< 4,? 4B Eie3x|Hg /6T/d]dfdoppdx\\i`OTTH _DD6/<4ii,$fd. a& . o`3ȪMkmb0."^ H #!im&$m!h%ߺ^iڐ4&.'!i!(!h|x)/A6.X*`LN@+L 0,2H ( -I .Y/6J0/d1d2d3sr43 M53 M6x3 Mx7 X3 MX8)L4M,92nև 4:9/AY.;Amhh<.4͐4=>4͐p?l(Hh@Ig60.PAN mp^^BW/Af4 C\AfԏDa/AEj1 k.Fs&G/iHixId3 V.J83 M KdeL 2HM 2HӬN2H|O|!Y*.Ph^h MQP.0fiR$rASdTdUԘdxVddHW<d(X2ȲYYZ,[?O9\?.M3$M]^iZ3$x_îl`/4mTPa!iD.8b4(ڐhc/.Aid+vieC3gS3Oh^6/`i_a 2j/Af krl/Z6/&m IB.pnd IXo@piͰa4.q4m#(rAڐ$^sͰ*_ Ϗt/5a/~u_6vV^wA;&x5ͰPo/yCҴ.zi4{p|Ih.T44M} O@$ C~Z3i]/Q À?c/r΁.j 2Hr 2HӠz 2H|l 2H\P4M, AY6͇ 4Ј 4Ȩ 4͠5xX/lfL0/ M3$ 2r9̎ G Џֆi/ 4/| 4lH 48Y6˔i'˸ A 4/"dv.-d8dCdppNl(`/Y/ M3TTb6H DDk/d44ul,, M3$$/Af!zf /Aʤ rʸ]M3?&m Zo.X 4H0 4 9 46rɫ/ؠɰĬ_wF3ȰgV/fp=/4 {/tfXԱ?/lAl`T 4H8 4403H4$0 M dYȷ /6T&#/iԹ( g./ 2HĻ6 CӴ>/ g_G/ 2HӘQ 2Hӌ[| 2H|ep 2Hpo` 2H`yP 2HPÃ<6Tį/(d(ŘdƣaǮJ f/ 4Ġ 4π 4ll 4TT 4<< 4((4 AiJd/d'd2d=dHlldSTTd^88didtJiA/iAiAiAiAddAD/H 2((H 2 f2J/4 4 4 i lliALLiA,,$iA/dAJ/: Þ/E 4ͨP 4̈́[ 4hhf 4PPq 444| 4 4 2lJ/ 2H 2HӸ 2HӠ 2Hӌp 2HpP 2HP02_2Jin//i i r!|44M,pp M4hh 4;`` 4BXX 4IPP 4PHH 4W@@ 4^88 4 e00 4 l(( 4 s 4 z 4> J 2l/ 2H 2H 2H 2H 2Hxx 2Hll 2HPP 2H44 2H 2Hf2HJ4 /4 4 ȸi iA iA iA||!iA!hh"iA)PP#iA188$iA9,,%iAA&5AI'iA/Q(iAY)iAa*iAi+iAq,iAyhh-iAPP.iA< 4 ?4 @4 A'4 xxB0F hC 4/TTDA 4<dHdRd\dfldlp\d\zDdD4d4(d(=doJ4 /4 4 4 ʼ4 Ԩ4 ސ Mx3H4d 4MdT 2HT<4M< 4 i / 4 Y语MW_. 4 2H 2H 2Hx` 2HTT 2H!DD44M$444 ($$4 ,v 0.d 4J iA/8 iA<iA@iADiAHiALttiAP``iATPPiAX@@iA\,,iA`Ad/f2hJ/l4 p4 t4 x4 |4 4 pp4 `` 4 LL!4 88"4 $$# $/aJ%/Af&Af'Af(Af)Af*Af||+Afhh,AfTT-Af<<.Af$$/ĐAf 06{J1/i2i3Ըi4ؤi5ܐi6i7hih8Tg9di:di;di<di=Jf>/ܚAi?ĚAi@AiA AiBAiCttMsiD`` 4EPP 4F << 4G$(( 4H( 4I, 4J0J 2lK/4 2HL8 2HM< 2HN@ 2HOD 2HPHhh 2HQLTT 2HRP@@ 2HST,Tfa/XU6{A\JV/i`WidXihYilxZipdd[itTT\ixDD]i|8 ^g_fJ`/4 a4 b4 c4 d4 e4 f hg_2!6/2H <M3 pxx?M3 wPP@M3 ~((AM3 B JCiA/DiAEiA``FiA@@GiAHAJI/dJdĜKdppLd\\MdDDNd00OdPdQ, /ԍR4 SiNl`N4(ap94M/@4MXlk0.P$h|ͷh'HA<>f5xVW~i86 fPֶfWW.h&!N=\ּ%'`x 6f#Xjc^V`lk(+FVvf6bopx2kmkV>?@ m<^*&+n=5;0`6)Gm '> ^(km 'FV^3[`&&o4M66p%6M4(i^P?V0kf6 v$Y^X,Yc8bNڡ5V060HN^`f+)wlEF8=fڎNG5h?V~fkk[pf(@`^[o(I*"Xh644s|ǀHZ[eӴPh([eй&i֚@&X>p֚x*cnC6(/YkZkb"f@/8?h`&.Vؾٶ&NenIFDOH5_kB.>P'$lkFXF^pkZ@nH(ND̷eXd0AipV&fk۩]0޾p&=E6y6 Hf(f84Ӱi~fPӴf[x)~0HAlBNȶGgF4km3C.cg&wZӸfٚXi y8P@j/fih`x֚h^~mlf(eA c3;i?;iFd@2V8f 6MP3f<mֶf!YV97:k5vkZZFpXh5iM(@PV8,v@IƦY 67Pii@7^6h(ٴ8c0&5YkF4&3FȸZӚ@X>l2:0;H۴*G`iZkhF@Xޠi8&nxL0775 A0ך`&H8JF,/X.4l0~/ZӴ&h x&ZӴP8`iZn@p(]ӴF0H&@kM1(0lZH>p-Vi6Mhc^Px,2~1ּw+? -855`6ˠ1YE`f#4kFV'N5@"fkVVH(!F h50G6hƹ|MfN+>pIilG&0 *fV WgHGXnJ|B5E`D9`>_֚mf=`Gx^`Mքv)^\>`x4M4lf] 8P(MӚFhȚe4^(@iiXpZk_>?$9hH&TxkZJVVUfHӚyD`0>H`ZkUSwPX^MZ@(hpӚi&AkM8S iH0`m֚.LPOKkZӚXp&HF֚mZMxfVR_NQӴ֚X&@^0vͲ]H~Pִnƥmm@NQm,RO( &8QͲiMPQh55n 8.XOl;KKJF3vZPVhLKm`ApKF4mNS.RиGA>Hx֚=Xn"Hb?v!Bh6&&5v$X[J&fB_ZL`_`xi^Ixw) Xb%v%~>׈5PffkFLooV8&ÈwfnN1х@P`O`h?_`V Rd@ ~@ &op0hZ tu&<Bg7`g $&vvv㵟Xn<>C' g 8o"-h7/ID<@* dPk?7)N?FK7//6URK/ΦAҎdVעnx0hfG@ Z=AЀAg4AkO?j7uWN[g&T r>.FbANNG^fvo#rk~^ 2H 6hGηr뎮ޞZ fv &ڭ[-ϾWAO?jШA7QPX%% ğ%t4$A)AWA?W اxY0H\'`Y <#>hv0A nl%(qVv@vFnP XaA!zƦp?wX168nVo..vc7@pào݆xb8v㍁ꍁ>ƟCVg灮O0H>A~&8t#F`'NQ:&=NVN7Vj:>F>.5-׿?5-'Fj~6:6v^^kvg]תgnWVkUoW>uU׎(ڟ?pIӸЦPXN'hdY0H`x<`g &0.$@gV:(6^gzhZ6ΰ?G&F#wYN&Wj]fֆ'8|"h$V$>\TN(_@X7i 6ސ&twi99999dyi9'dҎMӦIߠ)H~`^zi'x6PinL;p*F5˷8Pc@O4Xpc8bAB g n^S/)h(@׉]jԱZ'P*BOֶ(Z&&Vpjҵ7*#8hט=X=AAZ_`W. 8'hBXN`>|^.PR8& fEC Y&nFkaXIF"-..0X6~ &,Lv6kT2^f&HpsHZ5(ICy#dDi0H>DDif6D4no+,,|Hn^!‡)* j'gVVw*/`֮Z5P2jζQ&w@ԝ:XWJ95gVNM>x&t^ 8SSPN9>0S;e/G*upGoV_(JM3p(ZY&?BnZ7A6ࠔN ߀t4o'6pdX4̀ D440(]i VLkndkdp6&Gp$\W~:]o"48J{7(^CH0EF`0 -Me 6Ÿ=).aW|o1q=T6I Φ$G8n6psɲ,ד+ټ4MÂ&,-4M 04MHM4M^*Vj0CP >&F&YK ?vektb)&Epd;D'pr`i:-$/`rm\i?iFaiA4@Gcݖe7Q:NeY\κ d, in( iAiiMRj7l,&$iv{Jx[h)7 M4;i9iifX䦦iwruiK 1DPiiϟ׃xݵ(yJ؝~7+vSbLdDYOaEm }2@{ !"\kNTe`sVu;`B=ԏ&oFiW'C>/fހRr5Mj*qZItK^AnQ$Pp9|:#z6[%U1-])glឨ,c?X≩ 843H _.G奜w h ۡ0 y!GC&`{PDK^W0@t^.>w0_͞p S[c ݤ ;&ypG.(Y@xӶm 7p`F|.r6`DVPfGX&PF/(iYsȮ>۬Zwbʼ_0Eݦ.E7!4ߐ"?"#qv\Iwo'.FiwA6 x t_ildwiiF`PMHamI>F>. v46( fav v^G iA f Mi^4Afxp/HӴd`\ Xb4^XL_H/8(5FlifЭ &ĞvvU0^dPu֔.x6چh;F<=0,L ͐JeoлK WOFJF&NN-O@&`kVZsP.^Fl{N0@b ;kHwN"X^ٖユ0ӚYM4M4M4ieǙʯ4LEN]MNFNN4mxhzEhN?I\NOm"H8N& &$]#_NnHRNDא?/G`rߞE0OH1_4-2O3#ˀ/p,ϋ\L,@(Жgi.Y?PtY `0L@,_ `pYYЀ˳#(YwYlyٔ/ t?d0T@@ygyP0`pҾlYYܠаyV?y|h/PD8?$i.e 0"g@P p`y/H0gi.o=˳?KFX- ?$ /[ O0N?@P<˳`pt=ˀT/{8gyиञ?tp P=e[,.?,ݗ?Ė` 0yd?Hpe,o,>@ P?? y~ﳴN| ygh H0.P^d<  l P4 ,Y0@{P. `?,ϘplTL@" ,oiN,ϴ𑿗-xd> Xdy{HN08 ,<^? @uw 0.-˖P?`lYpP4Y ,,мࠖ |`xgy T0<@FO,o[e4MfghM4Mjpk\l4M4Lm4n$lMop 0iZ12iZ4qriisttXiu@v0w˦i x y z4M4{|4M}~M4Mx\4M4T<,Y6MӅ ỉ4M|he4ML83Mn ؐ444> 4MӒxdiZ@. 54e6Ж.CӴ4M\D MӴniּ~i<ixd\ii8 , !"i]#$%i&`'H=ڎ.G(4MȤM4M|`4M4H,hgԫ^7iihPii8$,M4MĸYV4=~iiXD4iM4æi4ľńi)n.L|*hgyMPخ5Ͳii4^۸ܞ>ݶhp+TN;?j,KY6o4MӴdD4M 4f~4mDjM(-.~^M4/lfx\;A<$nY8LiM.dm4LB0㚦Y6jipT9ihNӴk~LM4M(YV4횦i4M4xdP4M4 ,MM4M;4M4It`4MH4f4M 4  Pem4îM4M   6 7 Qxwv/H]'.!d 5ACqPgR.aÆ]WYl/mp r_2lg?4 )d ߧȰ!??&F8OA6,Xh|#|L,Jyus-BGWACĊѧ$M-J'M6~@@"L%JGAFnMmǴr .Ũ:ȠN[W@k$iڗ|xtpl4Mkd6\TH<8M4(4M  &4MӖ#̴|ISk .ưvhNX&'ϦipT@.i,QJ&PR [D 4MkĴLZ0>tPV@ͲiZ(%k6%G|5M`L4/++l6GpJ4PST͉'PDT#6Mfx N@<*i- h4˦ ,M4MtP$Y6+kiT,e*xydzGNǼ vD"Hl%Wz1Lf/gA?_ -jW. *' n6FZxe4MӮm0Nmg:YM4Mwi/Ml-4ܚ"H3 2 22 3%{ 9 f0bM`yߑ@~÷^ڣ d6@_AϢ[~Q^ڿ_j2@s1~ո5/@ kV}@pga@%@ CIP$򀖘 4N@ p+ŝi@]%O@qוC)@D@<զIxy@oGAkU'9p6ݎ~QCv)/&D(DJzEeǑF e uuvHMXB䧓9;5SM]=];Z] T7aZ%]g']݀nLɛ R`C%u?qo`h?Zd;On?,eX?#GGŧ?@il7?3=BzՔ?aw̫?/L[Mľ?S;uD?g9Eϔ?$#⼺;1az?aUY~S|_?/DG?9'*?}d|FU>c{#Tw=:zc%C1p˖XD0&4gy@$pw#oT^?p &&YX-&H 8> ; ^Sy & &дvSO&l4MӆXDe4M,gwRihiiii|dH5MjkQvMlmnӴkM4Mp`uP4M4pDx04M$}iMtP~qiȍNP%\ZL`@ZO%0.%pgyY-oi0_Y.[И>Yg%th/y^T<0@˖g$Y}X 0ȟ@P%%/<`p?xϋ< -O-O|˳.l` TYg? H0<@e0o$_>Pp\ Lp? ief|ighiixiPj,lk}Qlkeo{mn]opqiirtdisTtDuޙ6MvwnZӊ .y~Dizn+-X+r/+d4ero*s<`ps,yb* xsf4MlgXj@4Mh i{n<˳< 0@<˳xP``HY 4 [NYЮ\0 H${. /[ x?L<@ P`~>@-ϟ |p\ D0.,~[g~}?y^P/dp gL4}ݗ/o|?|?X/,<[޻{Yދ?,O `UD?8 z r_  ٴN{GhP8>gy$ 0py _[~(`, pYܐ0"˳>P`oyop>Y-\.H4˳( =kZ,deM4Mopxm4M4\fLiD4Mj$krekedol gDiqhH0, {o?[ [N _|<, L <0<˳,@PY`p Ē?y<l`yٍp\>ߏ8-ϞP$\ڗ/ؑ{ ? 0yh.P 8@,o ^P oy^ ` poy, t dT>@H^Y0.yϏN ,{ᜏp^< \0L@ gi`< p B 0?x^dyNp`{A~?8/$<y*cūPnMӚd.e4M4fghiMӄiT jlY6˦kvllmY\nH\oLiMӴ.kٚ4ԊDaMӚf|i5^hTMlXk,4<$j?ekii̓4M\iMPi8i5(vkit4MӴ@0iM iĤZavMkdľDD8hn x3h X`/Lp8  -/> ygy|g`DN,0gi_ ?{@ON ˳;h HlyN0( o,P`pϟYĀ Y-p\4 ^ywy Ж6/М=(qy_ t5v`rLe0iif q wiͲ{xsM4tgh5i^jkӮiTl4u>mgyLyxo4Mpz_? \L[?P8 ,.gyp <˳4б<˳|pϏ MӺ .eXgg> 0Y _<; `p˳<ˀ@^dy^hnPD8"/[(?/ޜ?{/ YY 0q\@PloMkZ; XeLfЀTt\aiP4gi{ /˳<0|@lX,oyPL>`0p$Zډef,igh jMkZӄkllPme4@nxs$Y6Mkozpi|}i{piiXHi8~ x iM4qy4M4rx4MlL0Ͳ5Msțvuvw)rB.)_P`,,p|x@l-`PH/ދ,4 (_ wyY>0YyP`˳#H". A'1"AcCI\SLAej{ESt=K hig{'Hj SKz[ČKm+2GƖCfqrTnA-!YFwS'%= H`%EGav+ eRJ!` N K%)UhU1LTKwo+\n1GfB&`'b|,Flush-9$\l!QUC#Mp.'s lXN1UI|$ViewOf,Unm;m-@Isiۙ!CPagPӣaIWpepwelJD-V\+u B:ZyyivRk 0mO-𷰀/G$I`HPWFGurus urHu1ɃrFtx uuu Ausu s/vBGIuOw8^6G,<w?!u_f)ٍ tE_0PxGt܉yGPGWHU| tax$ KERNEL32.DLLADVAPI32.dllGDI32.dllUSER32.dllWSOCK32.dllLoadLibraryAGetProcAddressExitProcessReportEventABitBltMessageBoxAipfw3-2012/binary/netipfw.inf000644 000423 000000 00000004334 12012006125 016355 0ustar00luigiwheel000000 000000 ; version section [Version] Signature = "$Windows NT$" Class = NetService ClassGUID = {4D36E974-E325-11CE-BFC1-08002BE10318} Provider = %Unipi% DriverVer = 26/02/2010,3.0.0.1 ; manufacturer section [Manufacturer] %Unipi% = UNIPI,NTx86,NTamd64 ; control flags section ; optional, unused in netipfw.inf inf, used in netipfw_m.inf [ControlFlags] ; models section [UNIPI] ; Win2k %Desc% = Ipfw.ndi, unipi_ipfw [UNIPI.NTx86] ;For WinXP and later %Desc% = Ipfw.ndi, unipi_ipfw [UNIPI.NTamd64] ;For x64 %Desc% = Ipfw.ndi, unipi_ipfw ; ddinstall section [Ipfw.ndi] AddReg = Ipfw.ndi.AddReg, Ipfw.AddReg Characteristics = 0x4410 ; NCF_FILTER | NCF_NDIS_PROTOCOL !--Filter Specific--!! CopyFiles = Ipfw.Files.Sys CopyInf = netipfw_m.inf ; remove section [Ipfw.ndi.Remove] DelFiles = Ipfw.Files.Sys ;ddinstall.services section [Ipfw.ndi.Services] AddService = Ipfw,,Ipfw.AddService [Ipfw.AddService] DisplayName = %ServiceDesc% ServiceType = 1 ;SERVICE_KERNEL_DRIVER StartType = 3 ;SERVICE_DEMAND_START ErrorControl = 1 ;SERVICE_ERROR_NORMAL ServiceBinary = %12%\ipfw.sys AddReg = Ipfw.AddService.AddReg [Ipfw.AddService.AddReg] ;file copy related sections [SourceDisksNames] 1=%DiskDescription%,"",, [SourceDisksFiles] ipfw.sys=1 [DestinationDirs] DefaultDestDir = 12 Ipfw.Files.Sys = 12 ; %windir%\System32\drivers ; ddinstall->copyfiles points here [Ipfw.Files.Sys] ipfw.sys,,,2 ; ddinstall->addreg points here [Ipfw.ndi.AddReg] HKR, Ndi, HelpText, , %HELP% ; this is displayed at the bottom of the General page of the Connection Properties dialog box HKR, Ndi, FilterClass, , failover HKR, Ndi, FilterDeviceInfId, , unipi_ipfwmp HKR, Ndi, Service, , Ipfw HKR, Ndi\Interfaces, UpperRange, , noupper HKR, Ndi\Interfaces, LowerRange, , nolower HKR, Ndi\Interfaces, FilterMediaTypes, , "ethernet, tokenring, fddi, wan" ;strings section [Strings] Unipi = "Unipi" DiskDescription = "Ipfw Driver Disk" Desc = "ipfw+dummynet" HELP = "This is ipfw and dummynet network emulator, developed by unipi.it" ServiceDesc = "ipfw service" ipfw3-2012/binary/README.txt000644 000423 000000 00000002027 12006744007 015711 0ustar00luigiwheel000000 000000 This directory contains the binaries to install and use IPFW and DUMMYNET on a Windows Machine. The kernel part is an NDIS module, whereas the user interface is a command line program. 1. INSTALL THE NDIS DRIVER - open the configuration panel for the network card in use (either right click on the icon on the SYSTRAY, or go to Control Panel -> Network and select one card) - click on Properties->Install->Service->Add - click on 'Driver Disk' and select 'netipfw.inf' in this folder - select 'ipfw+dummynet' which is the only service you should see - click accept on the warnings for the installation of an unknown driver (roughly twice per existing network card) Now you are ready to use the emulator. To configure it, open a 'cmd' window and you can use the ipfw command from the command line. Otherwise click on the 'TESTME.bat' which is a batch program that runs various tests. 2. UNINSTALL THE DRIVER - select a network card as above. - click on Properties - select 'ipfw+dummynet' - click on 'Remove' ipfw3-2012/binary/cygwin1.dll000644 000423 000000 00012711432 12011754122 016276 0ustar00luigiwheel000000 000000 MZ@ !L!This program cannot be run in DOS mode. $PEL P#F! "paH , #J&($$X.text```/4 @.data@`.rdata @`@.bssp0 `.edataJ# @0@.rsrc$ @0.relocX$ @0B/19@&T"@`/38&"@0B.idata(&*"@0.cygheap '0US$EED$ D$D$$/x ؋]É$.$(؋]Ð&UWVS\E] UċMu}E1EE rEtpAtEAEԍE܉E؋E\$|$t$D$ T$$[.xЍe[^_]$0.$'1띍t&USTED$ED$EED$ D$$-.}tXED$ D$D$$-ËE$-؋]t&E U1EEErEE܍ED$EED$D$ T$D$ $-xdED$ D$$EED$,ËEt $,:$,$&$,$m&1]USDED$ED$$D$ D$D$D$D$ D$D$$O,(x؋]$,$%؋]UXD$]]uu}}D$D$D$ LaD$D$@$at%$h%E \$D$a|$D$ t$$af  aE \$ D$a|$D$t$D$ aD$aD$@$ ajՅ t&4$訌9aT$3D$E $\$|$D$ t$D$$aUK UD$  D$$T$P E D$aD$a|$D$ t$$ae  atNjE D$ aD$a|$D$t$D$ aD$aD$@$ ai낍&at&UED$D$ E D$E$ffffffffcouldn't dynamically determine load address for '%s' (handle %p), %EZBtHZ%)PP"XpBPhaO$P@@P#uZ)Ѓ BPt&'UWVS\u{C@u%{v>S CHEbae[^_]øH_@uEȿ$"SD$4"a$ T$$$"tCC "=Z u {vhUȉ$#9(_ uېCtӡl&a@t!=uD$D$$! tu #F~C=ej$J!tCS{tl&a@t-!=uD$D$$! z밍D$$@aLt&UVS0]3Pa@t&PaH]Pa@uۀ=at2EbaPaHE;a]EUe[^]ÍD$VaF$] tD$a$Ѓ au a뎉D$D$ aaD$aD$@$ ah ataD$ haD$aD$@D$$ a0 at¡aD$ taD$aD$@D$$ a aRD$ġaD$ aD$aD$@$ a aD$ŢaD$ aD$aD$@$ a aFaD$ aD$aD$@D$$ aJ aHaD$ aD$aD$@D$$ a ahLaD$ aD$aD$@D$$ a6U]á9"auD$aD$d $+dt$\$ $G]u]Ðt&Uuu ]dtJu+v[t Et>tL1ۉ؋u]]$$Hu؋]]$a1螊 uD$1D$$aLxD$$nD$4$mD$4$mY4$uLUVS]耉$$1$%4$D$襝$ D$$YmD$$EmD$$1m1[^]þ[^]$讦ug$蝦D$4$$腦D$1$lD$$lD$$l~$F$6t UWVSLD$$a蓜@$u~$f`a"$RD$a4$D$, 4$D$4$4UtjEEttEt$$]t|ED$<$D$nMt|ED$T<$D$U ue<$-1`EtEt$$裀]tED$<$D$5nMtED$T<$D$WU tE 81L[^_]É$蹤 atSK`at sL a\$t$ ?\&at$P5da\$LÅۉ|$Tl$Xdat3э<!9s#=HavHaHaF),!ut&\$Lt$P|$Tl$X\D$ D$0l$<$uǍD$$D$D$<$ t" au?a 1)daD$ aD$}aD$$ a븉l$D$ @aD$}aD$ $ ah atD$4D$ aD$}aD$ D$D$0$ aD$D$$D$D$(D$G $t$|$v 9vua<`aS| t'L a5=G$t$|$ ÍvFt`aP(Vp(a<Fa<1볐t&, at3`a("D$ aD$aD$@D$$ a!`a("$~V`aǀ(",Ðv'UWVS/t$$g4$T$hT$t|/t~$l$f3,$h u\$,t$0|$4l$8<À\uڃ Ƅ3ŀ~\t밍HDm&<t& D$t ÍtT$ ,\$\$0t$ t$4l$(|$$;t1|$4$Neu\$t$ |$$l$(,Í tSt̍C 1LC1BC18C1.Ct$ \$1ҋ|$$l$(,|a릐UWVSÃ,p$tLH tGuwAvt$L$|$4$VC $,4$Se[^_]ÉƄtCuv<CtC t $CC 빈UD$ D$D$$LaK C AC$t$L$D$4$VC $UaESdD$ X,T$ Pt $31[&' a Ð&'D$0$@(Ít&' aauat"0at uuЃ à 뉺afVSÃ$ a@1C t$ZCu S:Ct$, aK st7C uv:C tD$$C $s$[^ÉD$@D$ aD$aD$ D$C$ aD$ stmC O$?fCD$ aD$aD$ D$C$ aD$CD$w sS .s$[^À{(?a;aSDCT$D$\$ D$D$$LatG atCD$ aD$aD$ D$C$ aD$CD$ YC$aD$ CD$CD$L'S\$ D$C$nC$C[&'S\$ tD;aCat.a1 0@t39uR4aaDƒ[Ít&볍&`aCatd\$D$Ha-&$B d-&묐t&S\$C u {7C t[Ð&'|$$T$ tBB1B uu$D$ XaD$caD$$ a+ ÐVS$d\$0S$. aD$0CC Is=ģa1҉Ks,tJC C$kt 4$\D$C$^t$a %D$$uĐt&D$ aD$aD$$ a, 1$[^s$T$0T$t$D$ aD$aD$@D$$ a C t$CC$5CCC D$ D$D$$LaC D$ D$D$$LaڹC_&'WVSP a\$` 1{D$C$D$C$C$K =ģaC t:T$HD$D$ T$D$$Bx |$L;431KtD$C1$-D$C$C$=ģaC tT$HD$D$ T$D$$MD$LT$,1rD$T$C$8 |$8CD$ aD$@aD$D$$ aF {( D$$P[^_Ív1P[^_Ðt&CD$D$CD$CD$ aD$@aD$@D$$ a C 1$T$,1׹D$T$C$N |$8D$0D$D$$l  aD$0D$CD$ ,aD$@aD$@D$$ a! $t&v'UWVSLl$`]L$dC1۾D$($D$,D$(D$$D$dD$8daD$<&D$8t$ D$D$<$rr=tÀ=ģauE1۽laD$ a]aD$aD$D$$ a 9LD$D8$RRt>=t7T8ۉDʼnD$D$ aT$D$aD$$ a {0E tD$11ۉ$`ۍSuiӿto,$D$ËD$d$ dۿt[$謻J&Ӿ2m2ct&/E tD$11ۉ$D$,D$D$($ atFL$dvaUt$D$ aɹ{aDT$D$D$aD$ $ aW u+}(tl$/E t$ E1҃UuL[^_]ËE1D$D$ aD$aD$D$$ a L[^_]ËE$R,$wL[^_]ÿ1$aEt&ģaÐ&Ð D$D$ v'S`a,"t00"D$$T$_Ia[aLǃ0"n,"ǍUWVS,l$D\$@t$H1󫍃l1r1 ǃǃaǃǃǃTǃǃǃǃǃǃǃƃǃ<ǃDǃHfǃL3fǃNͫfǃP4fǃRmfǃTfǃVfǃX ǃ\ǃ`ǃdǃhǃlǃpǃǃǃ󫍃 {aǃǃǃǃǃǃǃƃtƃ|ǃǃǃǃǃǃpǃpǃxǃ|ǃǃ+Px8PP P<ǃǃ?aǃ?cǃ Ctw;ato`a!!$<aZ5`aaD$0"9 ,"\$a,[^_]ÍP<ǃǃ?aǃ?cǃ Ct;at`a!!t $ca5`aaD$0"9v7,,"(D$a$,a[^_]0","Ca,,"`a,"15`aSà t ǃ ǃ ǃ ǃh ǃ ǃ [Ð&UWVS<\$P=Ta t$Tǃj ah N$p ǃh $t ǃp  $ ǃt $ ǃ $ ǃ $ ǃ &t$D$ aD$gaD$@$ a h tM$p ǃh t$ǃp t t$ǃt t$ǃ t$ǃ t$ǃ t$ǃ  $CJagD$(a t:=at0`a,"9D$,tPD$,1҃ Ń9tB9rT$(t at$P؃<[^_]a &<[^_]Ël$,1f9׉=av L$,E atT$\$D$ aD$gaD$@$ a t&'PX $X $T $` $L $P ։$X É͉T$|$$=8"auR|$,$D$$ kat a$L $P $T $X \ $>P<;5LaTP9s9s$$ D$D$4$ D$$D$$( D$$ D$$D$\$ D$0HaD$ D$D$ a$6D$$D$$ a ;5`aC<$kf1&d$1T$$1$1$1dd$$1DŽ$1a-1$1d1Ð  Í&'VS a$a5ad-1 T$ T$ DŽ$ $ $D$$$ u}t&a;aa`a\$," $F tš`aa,"T$ dt a3؁[^á`aD$a,"$_\$D$ ^aD$@aD$@$ aW f1x&%4$։|$4$|$ÐUWVSÃlL$ TۉD$\PD$ \$L{D$ D$,dk|"D$D$D$D$ D$t$$6d|\$$DL\$LD$ D$(D$ D$\$,$D;D$,;D$$9T$(d-1ѹud-19`auD$8D$dD$D$ D$|$lFdD$|$Jl[^_]fdaoD$ DLuD$\$蕅aD$\x@S@L]l$,DLOD$$\$L11Ҁ|$@uD$8T$<dVD$|$JD$ ?x1D$ f1.&D$ D$D$$:d|^NA7Ud]]uu D$D$$aD$ dt$\$ $ d]u E E ]r USPatX@Pat Ћu[]Ít&'UWVSÃ|U8<~tD$a$YK1‰$`2tE{:tl\<'KS$UM 2UMt :Et\EuD$a$J$G֍D=L$'M΄'"u6}t \tc'"tѐt@8&M<\F\EFuUEED$ D$$D$ Bd1u MЅe[^_]\7&CK8ty<\DٍN\MxMΈ!U*\$$D$$4UǍ@C1ɉE D9u]u눃 8"aU 8"a;}̋8"at}1щډv73D7tY atJT$MD$D$ aD$"aD$@$ a$ U<"BE}̉<$e[^_]À{\uC$<58"aD$/$89"aX9"aۉ 9"a9"atD$$71p9$Wa. da$ 0 apat<8"aD$ aT$8"a$С8"aD$ aD$8"a$ta atu눋Uԉ4$T$!38\t$"u.x"puЀx\N빍xpt먐t&pH$ aj LF ؉މlj^P ,D$8"aU$@8"a8"a4$D$1,8"aD$ aD$ "aD$@D$$ a 8"a>؉]ȉljV1tE} M؉ $(E؉$)Mк$ 4$D$D$D$D$ LaD$D$D$$>$f.D$JET$UD$D$ |$4$F4$EPMUPt ;} aIE؉$'8"aEUЉD$D$ aD$ "aT$D$@$ ad 8"aEЍUu'8"aD$\4$A*1u]А a_D$ aD$`"aD$@$ a 6t& a$MD$ aD$`"aD$@L$$ a註  aUD$ jaD$`"aD$@T$$ ak D$ aD$`"aD$@$ aB : D:U\$$*M؉ $;&UUT$$Haat$d dLD$$ 8"a"蠶58"a1ɍD$+u 4a D$$L$Ha$3vU8=ea]]uu }}tCD$a$5taf@]u}]ÍvD$a$4uD$D$$a` u%9u=|$t$\$D$ aD$!aD$$ a讹 ]u}]É|$ t$\$$Da)'UStE$]t,f}Gv%{u{ 7t+ a1O 1]1Ҹ a< 1ۉ؋]ÍvC='atD$'aD$$ aCftDf1ۉD$D$ !aD$#aD$$ a跸 닍v\a0C9teT$D$$!aCu TYft1Ҹ af{j +vd1fYC@=HtD$HD$$ !a닍t&UVS $&a|Sw 6"aɣaudD$$4"a\6"awfDŽ4"a\6"afDŽ4"aD$$6"a}8"a; D$D$$T!a tea$c!a@ag {asaP`PP @4aa0asa7)\$PaD$D$D$D$ @at$$D$DaD$$}Da $U: ËSCuPav PawaP0@(afsna$k7ѕ%d-1`aXa at$D$ p!aD$"aD$@$ aѵ e[^]fv6fuatwfDŽ6"a\8"afDŽ6"a a4G = wv l&a@$\a$0!a1øÃD$ @D$a$&@SH$P\$H$% Q\$$4$RR$D$$<DŽ$DŽ$ DŽ$(@$$DŽ$,DŽ$0D$$g =:t t =4u1$<$PH[ÃD$ $à D$Ht |w5a(fttt 1u9 ÐW1VST$$\$ у $aD$aD$@#a$c&BD$aD$_$a$D$aD$g$a$]D$aD$o$a$3D$aD$w$a$ iD$aD$$a$l?D$aD$$a$BD$paD$$a$D$XaD$$a$aD$@aD$$a$70< $aD$(aD$$a$XD$aD$$a$[.D$aD$$a$1D$aD$$a$zD$aD$$a$PD$aD$$a$&D$aD$$a$\D$aD$$a$_2D$haD$$a$5D$PaD$$a$~ 0< $aD$8aD$$a$?D$ aD$$a$uD$aD$%a$xKD$aD$%a$N!D$aD$%a$$D$aD$%a$mD$aD$'%a$CD$aD$/%a$yD$xaD$7%a$|OD$`aD$?%a$R%B0*a$qD$ aD$H*a$tGBD$ 0 aD$+a$AD$  aD$,a$D$ aD$ ,a$`D$ aD$,a$6ê閪B1<$xaD$ @ aD$,a$TD$ ( aD$(,a$W*D$  aD$2,a$-D$ aD$<,a$v֩D$ aD$F,a$L٩鬩D$ aD$P,a$"邩D$ aD$Z,a$XD$ aD$d,a$[.D$ aD$n,a$1B1<$aD$ aD$x,a$b¨D$ aD$,a$8Ũ阨D$ aD$,a$nD$ aD$,a$qDD$ xaD$,a$GD$ `aD$,a$D$ HaD$,a$fƧD$ 0aD$,a$<ɧ霧D$ aD$,a$rBB1<$taD$ haD$ /a$oϜD$ PaD$/a$EҜ饜D$ 8aD$ /a${D$ aD$*/a$~QD$ aD$4/a$T'D$ aD$>/a$*D$ aD$H/a$sӛD$ aD$R/a$I֛驛D$ aD$\/a$B1<q$aD$ aD$f/a$j=D$ aD$p/a$@D$ aD$z/a$D$ aD$/a$_鿚D$ aD$/a$5š镚D$ aD$/a$ kD$ paD$/a$nAD$ XaD$/a$DD$ @aD$/a$B1<ߙ$aD$ aD$/a$Kؙ髙D$ aD$/a$!遙D$ haD$/a$WD$ PaD$/a$Z-D$ 8aD$/a$0D$ aD$/a$y٘D$ aD$/a$Oܘ鯘D$ aD$0a$%酘D$ aD$0a$[B<5',<2 <1<<3Z<4'#<8tw<6<7 <9t2D$ iaD$@2a$AD$ piaD$J2a$D$ XiaD$T2a$`D$ @iaD$^2a$6Í閍D$ (iaD$h2a$ lD$ iaD$r2a$oBD$ haD$|2a$ED$ haD$2a$D$ haD$2a$dČD$ haD$2a$:nj隌D$ haD$2a$pD$ haD$2a$sFD$ hhaD$2a$ID$ PhaD$2a$D$ 8haD$2a$hȋD$ haD$2a$>ˋ鞋D$ haD$2a$tD$ gaD$2a$wJD$ gaD$2a$M D$ gaD$2a$#D$ gaD$3a$l̊D$ gaD$3a$Bϊ颊D$ xgaD$3a$xD$ `gaD$&3a${ND$ `aD$03a$Q$D$ HaD$:3a$'D$ 0aD$D3a$pЉD$ aD$N3a$FӉ馉D$ aD$X3a$|D$ aD$b3a$RD$ aD$l3a$U(D$ aD$v3a$+D$ aD$3a$tԈB1D$ pBaD$3a$AD$ XBaD$3a$D$ @BaD$3a$`D$ (BaD$3a$6Ç閇D$ BaD$3a$ lD$ AaD$3a$oBD$ AaD$3a$ED$ AaD$3a$D$ AaD$3a$dĆD$ AaD$4a$:dž隆D$ AaD$ 4a$pD$ hAaD$4a$sFD$ PAaD$ 4a$ID$ 8AaD$*4a$D$ AaD$44a$hȅD$ AaD$>4a$>˅鞅D$ @aD$H4a$tD$ @aD$R4a$wJD$ @aD$\4a$M D$ @aD$f4a$#D$ @aD$p4a$l̄D$ x@aD$z4a$Bτ预D$ `@aD$4a$xD$ aD$4a${ND$ aD$4a$Q$D$ aD$4a$'D$ aD$4a$pЃD$ aD$4a$FӃ馃D$ aD$4a$|D$ haD$4a$RD$ PaD$4a$U(D$ 8aD$4a$+B1D$ XaD$5a$AD$ @aD$5a$D$ (aD$$5a$`D$ aD$.5a$6Á閁D$ aD$85a$ lD$ aD$B5a$oBD$ aD$L5a$ED$ aD$V5a$D$ aD$`5a$dĀD$ aD$j5a$:ǀ隀D$ haD$t5a$pD$ PaD$~5a$sFD$ 8aD$5a$ID$ aD$5a$D$ aD$5a$hD$ aD$5a$>D$ aD$5a$tD$ aD$5a$wJD$ aD$5a$M D$ aD$5a$#~D$ xaD$5a$l~~D$ `aD$5a$B~~D$ aD$5a$~x~D$ xaD$5a${~N~D$ `aD$6a$Q~$~D$ HaD$ 6a$'~}D$ 0aD$6a$p}}D$ aD$6a$F}}D$ aD$(6a$}|}D$ aD$26a$}R}D$ aD$<6a$U}(}B0< }$|aD$ (aD$F6a$}|D$ aD$P6a$\||D$ aD$Z6a$2||D$ aD$d6a$|h|D$ ȼaD$n6a$k|>|D$ aD$x6a$A||D$ aD$6a$|{D$ aD$6a$`{{D$ haD$6a$6{{D$ PaD$6a$ {l{B0< ^{$aD$ 8aD$6a$W{*{D$ aD$6a$-{{D$ aD$6a$v{zD$ aD$6a$LzzD$ ػaD$6a$"zzD$ aD$6a$zXzD$ aD$6a$[z.zD$ aD$6a$1zzD$ xaD$6a$zzyD$ `aD$7a$PyyB0< y$̟aD$ HaD$7a$ynyD$ 0aD$7a$qyDyD$ aD$"7a$GyyD$ aD$,7a$yxD$ aD$67a$fxxD$ кaD$@7a$<xxD$ aD$J7a$xrxD$ aD$T7a$uxHxD$ aD$^7a$KxxD$ paD$h7a$!xwB0< w$aD$ XaD$r7a$RwwD$ @aD$|7a$(wwD$ (aD$7a$w^wD$ aD$7a$aw4wD$ aD$7a$7w wD$ aD$7a$ wvD$ ȹaD$7a$VvvD$ aD$7a$,vvD$ aD$7a$vbvD$ aD$7a$ev8vB0< *v$aD$ haD$7a$#vuD$ PaD$7a$luuD$ 8aD$7a$BuuD$ aD$7a$uxuD$ aD$7a${uNuD$ aD$8a$Qu$uD$ ظaD$8a$'utD$ aD$8a$pttD$ aD$&8a$FttD$ aD$08a$t|tB0< nt$DaD$ xaD$:8a$gt:tD$ `aD$D8a$=ttD$ HaD$N8a$tsD$ 0aD$X8a$\ssD$ aD$b8a$2ssD$ aD$l8a$shsD$ aD$v8a$ks>sD$ зaD$8a$AssD$ aD$8a$srD$ aD$8a$`rrB0< r$laD$ aD$8a$r~rD$ paD$8a$rTrD$ XaD$8a$Wr*rD$ @aD$8a$-rrD$ (aD$8a$vrqD$ aD$8a$LqqD$ aD$8a$"qqD$ aD$8a$qXqD$ ȶaD$8a$ο[q.qD$ aD$8a$褿1qqB0< p$aD$ aD$9a$bppD$ aD$ 9a$8ppD$ haD$9a$pnpD$ PaD$ 9a$qpDpD$ 8aD$*9a$躾GppD$ aD$49a$萾poD$ aD$>9a$fooD$ aD$H9a$<ooD$ صaD$R9a$oroD$ aD$\9a$uoHoB0< :o$aD$ aD$f9a$覽3ooD$ aD$p9a$| onD$ xaD$z9a$RnnD$ `aD$9a$(nnBaD$:a$oiBiBaB``D$ .aD$s<a$`t`Ba$讧;YYD$ naD$>a$脧YXD$ GaD$ >a$ZXXD$ aD$+>a$0XXBa$qXDXD$ `maD$A>a$躦GXXD$ `FaD$L>a$萦XWD$ `aD$W>a$fWWBa$WzWD$ kaD$m>a$}WPWD$ DaD$x>a$ƥSW&WD$ aD$>a$蜥)WVBa$PVVD$ jaD$>a$&VVD$ CaD$>a$V\VD$ aD$>a$Ҥ_V2VD$ aD$>a$訤5VVD$ aD$>a$~ VUD$ aD$>a$TUUD$ aD$>a$*UUD$ aD$>a$U`UBa$ǣTU'UD$ aD$>a$蝣*UTB?a$tTSBaD$?a$yRQBNND$ 07aD$@a$臜NMBa< M$taD$ 0aD$@a$EMMD$ aD$@a$M{MD$ ȃaD$@a$~MQMD$ \aD$@a$ǛTM'MD$ 5aD$@a$蝛*MLBD@@D$ kaD$Ca$臎@?D$ DaD$Ca$]??D$ aD$Ca$3??BD$ xaD$Ca$i>>D$ aD$Ca$?>>D$ aD$Ca$>u>D$ aD$Ca$x>K>D$ aD$Da$N>!>D$ aD$Da$藌$>=BaD$Da$:p:BaD$Ja$wq#"BJa$ap!!D$ 8aD$IJa$7p!!D$ 8baD$TJa$ p!m!D$ 8;aD$_Ja$op!C!BY  D$ xaD$fOa$Y t D$ aD$qOa$Xw J D$ aD$|Oa$XM  D$ @aD$Oa$X#  B1< $aD$ haD$Oa$TX  D$ xaD$Oa$*X  D$ aD$Oa$X ` D$ aD$Oa$Wc 6 D$ aD$Oa$W9  D$ aD$Oa$W D$ aD$Oa$XWD$ aD$Oa$.WBMD$ {aD$hRa$MtD$ yaD$sRa$LwJD$ @xaD$~Ra$LM D$ vaD$Ra$L#D$ puaD$Ra$lLD$ taD$Ra$BLD$ raD$Ra$LxD$ 8qaD$Ra$K{ND$ oaD$Ra$KQ$D$ hnaD$Ra$K'D$ maD$Ra$pKD$ kaD$Ra$FKD$ 0jaD$Ra$K|D$ aD$Ra$JRB1D$ ]aD$DSa$IAD$ \aD$OSa$ID$ [aD$ZSa$`ID$ YaD$eSa$6ID$ HXaD$pSa$ IlD$ VaD${Sa$HoBD$ xUaD$Sa$HED$ TaD$Sa$HD$ RaD$Sa$dHD$ @QaD$Sa$:HD$ OaD$Sa$HpD$ pNaD$Sa$GsFD$ MaD$Sa$GID$ KaD$Sa$GD$ 8JaD$Sa$hGD$ HaD$Sa$>GD$ hGaD$Sa$GtD$ FaD$Sa$FwJD$ DaD$ Ta$FM D$ 0CaD$Ta$F#D$ aD$ Ta$lFB1D$ @*aD$Ta$CAD$ (aD$Ta$CD$ p'aD$Ta$`CD$ &aD$Ta$6CD$ $aD$Ta$ ClD$ 8#aD$Ua$BoBD$ !aD$Ua$BED$ h aD$Ua$BD$ aD$(Ua$dBD$ aD$3Ua$:BD$ 0aD$>Ua$BpD$ aD$IUa$AsFB<1t8<2t <03TD$ aD$TUa$A4D$ aD$_Ua$}A D$ aD$jUa$SAB1O"D$ `aD$Va$>%D$ paD$Va$n>D$ aD$Va$D>D$ aD$%Va$>zD$ aD$0Va$=}PD$ aD$;Va$=S&D$ aD$FVa$=)BD$ kaD$HYa$1AD$ jaD$SYa$1D$ aD$^Ya$`1B1D$ АaD$^a$BD$ }aD$+_a$tD$ H|aD$6_a$wJD$ zaD$A_a$M D$ xyaD$L_a$#D$ xaD$W_a$lD$ vaD$b_a$BD$ @uaD$m_a$xD$ saD$x_a${ND$ praD$_a$Q$D$ qaD$_a$'D$ oaD$_a$pD$ 8naD$_a$FD$ laD$_a$|D$ hkaD$_a$RD$ jaD$_a$U(D$ aD$_a$+B1D$ `aD$`a$AD$ _aD$`a$D$ ]aD$`a$`D$ P\aD$(`a$6D$ ZaD$3`a$ lD$ YaD$>`a$oBD$ XaD$I`a$ED$ VaD$T`a$D$ HUaD$_`a$dD$ SaD$j`a$:D$ xRaD$u`a$pD$ QaD$`a$sFD$ OaD$`a$ID$ @NaD$`a$D$ LaD$`a$hD$ pKaD$`a$>D$ JaD$`a$tD$ HaD$`a$wJD$ 8GaD$`a$M D$ EaD$`a$#D$ hDaD$`a$lD$ CaD$`a$BD$ XaD$`a$xB1D$ ,aD$aa$AD$ x+aD$aa$D$ *aD$aa$`D$ (aD$aa$6D$ @'aD$aa$ lD$ %aD$aa$oBD$ p$aD$aa$ED$ #aD$aa$D$ !aD$aa$dD$ 8 aD$aa$:D$ aD$ba$pD$ haD$ ba$sFD$ aD$ba$ID$ aD$"ba$B<1t8<2t <0߿TD$ haD$-ba$S鳿D$ xaD$8ba$)鉿D$ aD$Cba$ _B1 ˼鞼D$ 0aD$ba$ tD$ @aD$ba$ wJD$ PaD$ba$ M D$ `aD$ ca$ #D$ paD$ca$l ̻D$ aD$ca$B ϻ颻D$ aD$*ca$ xBka$b5D$ @aD$Ika$8 D$ ؔaD$Tka$D$ paD$_ka$W鷚D$ aD$jka$-鍚D$ aD$uka$cBaD$ma$Rߐ鲐D$ =aD$ma$(鈐D$ (<aD$ma$^D$ :aD$ na$a4D$ X9aD$na$7 D$ 7aD$na$ D$ 6aD$*na$V鶏D$ 5aD$5na$,錏D$ 3aD$@na$bD$ P2aD$Kna$e8D$ 0aD$Vna$;D$ /aD$ana$D$ .aD$lna$Z麎D$ ,aD$wna$0鐎D$ H+aD$na$fD$ )aD$na$i<D$ x(aD$na$?D$ 'aD$na$D$ %aD$na$^龍D$ @$aD$na$4锍D$ "aD$na$ jD$ p!aD$na$m@D$  aD$na$CD$ aD$na$D$ 8aD$na$bŒD$ aD$na$8Ō阌D$ aD$oa$nB<1t8<2t <0[TD$ 8aD$oa$\/D$ HaD$oa$2D$ XaD$'oa${ۋB1ra$ ~j~BzBua$rYrD$ aD$Jua$\r/rD$ XaD$Vua$2rrD$ aD$bua${rqBa<q$aD$ HaD$nua$9qqD$ aD$zua$qoqD$ xaD$ua$rqEqD$ aD$ua$軿HqqD$ aD$ua$葿qpD$ @aD$ua$gppD$ ؅aD$ua$=ppD$ paD$ua$pspD$ aD$ua$vpIpD$ aD$ua$迾LppD$ 8aD$ua$蕾"poD$ ~aD$ua$kooD$ h}aD$ua$AooD$ |aD$ va$owoD$ zaD$va$zoMoD$ 0yaD$"va$ýPo#oD$ waD$.va$虽&onD$ `vaD$:va$onnD$ taD$Fva$EnnD$ saD$Rva$n{nD$ (raD$^va$~nQnD$ paD$jva$ǼTn'nD$ XoaD$vva$蝼*nmD$ maD$va$snmD$ laD$va$ImmD$ kaD$va$mmBa<qm$aD$ HgaD$va$ݻjm=mD$ eaD$va$賻@mmD$ xdaD$va$艻mlD$ caD$va$_llD$ aaD$va$5llD$ @`aD$va$ lklD$ ^aD$va$nlAlD$ p]aD$va$跺DllD$ \aD$wa$荺lkD$ ZaD$wa$ckkD$ 8YaD$wa$9kkD$ WaD$*wa$kokD$ hVaD$6wa$rkEkD$ UaD$Bwa$軹HkkD$ SaD$Nwa$葹kjD$ 0RaD$Zwa$gjjD$ PaD$fwa$=jjD$ `OaD$rwa$jsjD$ MaD$~wa$vjIjD$ LaD$wa$迸LjjD$ (KaD$wa$蕸"jiD$ IaD$wa$kiiD$ XHaD$wa$AiiD$ FaD$wa$iwiD$ EaD$wa$ziMiD$ DaD$wa$÷Pi#iBa<i$aD$ H@aD$wa$職ihD$ >aD$wa$WhhD$ x=aD$wa$-hhD$ <aD$xa$hchD$ :aD$xa$ٶfh9hD$ @9aD$xa$诶xa$1ggD$ 3aD$Jxa$gggD$ 82aD$Vxa$ݵjg=gD$ 0aD$bxa$賵@ggD$ h/aD$nxa$艵gfD$ .aD$zxa$_ffD$ ,aD$xa$5ffD$ 0+aD$xa$ fkfD$ )aD$xa$nfAfD$ `(aD$xa$跴DffD$ &aD$xa$荴feD$ %aD$xa$ceeD$ ($aD$xa$9eeD$ "aD$xa$eoeD$ X!aD$xa$reEeD$ aD$xa$軳HeeD$ aD$xa$葳edD$ aD$ ya$gddB{a$\[\D$ aD$J{a$Ѫ^\1\D$ ~aD$V{a$觪4\\D$ P}aD$b{a$} \[D$ {aD$n{a$S[[D$ zaD$z{a$)[[D$ yaD${a$[_[D$ waD${a$թb[5[D$ HvaD${a$諩8[ [D$ taD${a$聩[ZD$ xsaD${a$WZZD$ raD${a$-ZZD$ paD${a$ZcZD$ @oaD${a$٨fZ9ZD$ maD${a$诨aD$N}a$蓣 UTD$ `=aD$Z}a$iTTD$ ;aD$f}a$?TTD$ :aD$r}a$TuTD$ (9aD$~}a$xTKTD$ 7aD$}a$NT!TD$ X6aD$}a$藢$TSD$ 4aD$}a$mSSD$ 3aD$}a$CSSD$ 2aD$}a$SySD$ 0aD$}a$|SOSD$ P/aD$}a$šRS%SD$ -aD$}a$蛡(SRD$ ,aD$}a$qRRD$ +aD$}a$GRRD$ )aD$~a$R}RD$ H(aD$~a$RSRD$ &aD$~a$ɠVR)RD$ x%aD$&~a$蟠,RQD$ $aD$2~a$uRQD$ "aD$>~a$KQQD$ @!aD$J~a$!QQD$ aD$V~a$QWQD$ paD$b~a$͟ZQ-QD$ aD$n~a$裟0QQBa$FuFD$ paD$Ja$xFKFD$ (oaD$Va$NF!FD$ maD$ba$藔$FED$ XlaD$na$mEED$ jaD$za$CEEBa<E$ aD$ gaD$a$EaED$ eaD$a$דdE7ED$ HdaD$a$譓:E ED$ baD$a$胓EDD$ xaaD$a$YDDD$ `aD$a$/DDD$ ^aD$΁a$DeDD$ @]aD$ځa$ےhD;DD$ [aD$a$豒>DDD$ pZaD$a$臒DCD$ YaD$a$]CCD$ WaD$ a$3CCD$ 8VaD$a$ CiCD$ TaD$"a$ߑlC?CD$ hSaD$.a$赑BCCD$ RaD$:a$苑CBD$ PaD$Fa$aBBD$ 0OaD$Ra$7BBD$ MaD$^a$ BmBD$ `LaD$ja$pBCBD$ JaD$va$蹐FBBD$ IaD$a$菐BAD$ (HaD$a$eAAD$ FaD$a$;AAD$ XEaD$a$AqAD$ CaD$a$tAGABa<9A$taD$ @aD$a$襏2AAD$ >aD$ʂa${A@D$ H=aD$ւa$Q@@D$ ;aD$a$'@@D$ x:aD$a$@]@D$ 9aD$a$ӎ`@3@D$ 7aD$a$詎6@ @D$ @6aD$a$ @?D$ 4aD$a$U??D$ p3aD$*a$+??D$ 2aD$6a$?a?D$ 0aD$Ba$׍d?7?D$ 8/aD$Na$譍:? ?D$ -aD$Za$胍?>D$ h,aD$fa$Y>>D$ +aD$ra$/>>D$ )aD$~a$>e>D$ 0(aD$a$یh>;>D$ &aD$a$豌>>>D$ `%aD$a$臌>=D$ #aD$a$]==D$ "aD$a$3==D$ (!aD$ƃa$ =i=D$ aD$҃a$ߋl=?=D$ XaD$ރa$赋B==D$ aD$a$苋=<B<D$ aD$a$贊A<<D$ aD$a$芊<;D$ aD$&a$`;;D$ aD$2a$6;;B <1t8<2t <0;TD$ aD$>a$;W;D$ aD$Ja$͉Z;-;D$ aD$Va$裉0;;B 1<:$aD$ @aD$ba$a::D$ PaD$na$7::D$ `aD$za$ :m:D$ paD$a$p:C:D$ aD$a$蹈F::D$ aD$a$菈:9Ba<9$ aD$ aD$a$M99D$ aD$a$#99D$ 0aD$„a$9Y9D$ ȭaD$΄a$χ\9/9D$ `aD$ڄa$襇299D$ aD$a${98D$ aD$a$Q88D$ (aD$a$'88D$ aD$ a$8]8D$ XaD$a$ӆ`838D$ aD$"a$詆68 8D$ aD$.a$ 87D$ aD$:a$U77D$ aD$Fa$+77D$ PaD$Ra$7a7D$ aD$^a$ׅd777D$ aD$ja$譅:7 7D$ aD$va$胅76D$ aD$a$Y66D$ HaD$a$/66D$ aD$a$6e6D$ xaD$a$ۄh6;6D$ aD$a$豄>66D$ aD$a$臄65Ba<5$laD$ aD$ʅa$E55D$ aD$օa$5{5D$ 0aD$a$~5Q5D$ ȉaD$a$ǃT5'5D$ `aD$a$蝃*54D$ aD$a$s54D$ aD$a$I44D$ (aD$a$44D$ aD$*a$4U4D$ XaD$6a$˂X4+4D$ aD$Ba$衂.44D$ ~aD$Na$w43D$ }aD$Za$M33D$ {aD$fa$#33D$ PzaD$ra$3Y3D$ xaD$~a$ρ\3/3D$ waD$a$襁233D$ vaD$a${32D$ taD$a$Q22D$ HsaD$a$'22D$ qaD$a$2]2D$ xpaD$Ɔa$Ӏ`232D$ oaD$҆a$詀62 2D$ maD$ކa$ 21D$ @laD$a$U11D$ jaD$a$+11Ba<}1$aD$ gaD$a$v1I1D$ eaD$a$L11D$ 0daD$a$"10D$ baD$&a$k00D$ `aaD$2a$A00D$ _aD$>a$0w0D$ ^aD$Ja$~z0M0D$ (]aD$Va$~P0#0D$ [aD$ba$~&0/D$ XZaD$na$o~//D$ XaD$za$E~//D$ WaD$a$~/{/D$ VaD$a$}~/Q/D$ TaD$a$}T/'/D$ PSaD$a$}*/.D$ QaD$a$s}/.D$ PaD$‡a$I}..D$ OaD$·a$}..D$ MaD$ڇa$|.U.D$ HLaD$a$|X.+.D$ JaD$a$|...D$ xIaD$a$w|.-D$ HaD$ a$M|--D$ FaD$a$#|--D$ @EaD$"a${-Y-D$ CaD$.a${\-/-Ba<!-$<aD$ @aD$:a${-,D$ >aD$Fa$c{,,D$ 0=aD$Ra$9{,,D$ ;aD$^a${,o,D$ `:aD$ja$zr,E,D$ 8aD$va$zH,,D$ 7aD$a$z,+D$ (6aD$a$gz++D$ 4aD$a$=z++D$ X3aD$a$z+s+D$ 1aD$a$yv+I+D$ 0aD$a$yL++D$ /aD$ʈa$y"+*D$ -aD$ֈa$ky**D$ P,aD$a$Ay**D$ *aD$a$y*w*D$ )aD$a$xz*M*D$ (aD$a$xP*#*D$ &aD$a$x&*)D$ H%aD$a$ox))D$ #aD$*a$Ex))D$ x"aD$6a$x){)D$ !aD$Ba$w~)Q)D$ aD$Na$wT)')D$ @aD$Za$w*)(D$ aD$fa$sw)(Ba$sn%A%D$ aD$Ja$sD%%D$ HaD$Va$s%$D$ aD$ba$cs$$D$ xaD$na$9s$$D$ aD$za$s$o$D$ aD$a$rr$E$D$ @aD$a$rH$$D$ أaD$a$r$#D$ paD$a$gr##D$ aD$a$=r##D$ aD$Ša$r#s#D$ 8aD$Ίa$qv#I#D$ МaD$ڊa$qL##D$ haD$a$q"#"D$ aD$a$kq""D$ aD$a$Aq""D$ 0aD$ a$q"w"D$ ȕaD$a$pz"M"D$ `aD$"a$pP"#"D$ aD$.a$p&"!D$ aD$:a$op!!Ba<!$4aD$ aD$Fa$-p!!D$ aD$Ra$p!c!D$ aD$^a$of!9!D$ aD$ja$oa$1iD$ OaD$Ja$igD$ MaD$Va$hj=D$ 0LaD$ba$h@D$ JaD$na$hD$ `IaD$za$_hD$ GaD$a$5hD$ FaD$a$ hkD$ (EaD$a$gnAD$ CaD$a$gDBa< $aD$ ?aD$a$ugD$ >aD$a$KgD$ =aD$΍a$!gD$ ;aD$ڍa$fWD$ H:aD$a$fZ-D$ 8aD$a$f0D$ x7aD$a$yfD$ 6aD$ a$OfD$ 4aD$a$%fD$ @3aD$"a$e[D$ 1aD$.a$e^1D$ p0aD$:a$e4D$ /aD$Fa$}e D$ -aD$Ra$SeD$ 8,aD$^a$)eD$ *aD$ja$d_D$ h)aD$va$db5D$ (aD$a$d8 D$ &aD$a$dD$ 0%aD$a$WdD$ #aD$a$-dD$ `"aD$a$dcD$ aD$a$cf9D$ aD$ʎa$c<D$ (aD$֎a$cD$ aD$a$[cBa$][D$ aD$Ja$]^1D$ aD$Va$]4D$ PaD$ba$}] D$ aD$na$S]D$ aD$za$)]D$ aD$a$\_D$ aD$a$\b5D$ HaD$a$\8 D$ aD$a$\ D$ xaD$a$W\ Ba< $aD$ ЍaD$a$\ u D$ haD$ΐa$[x K D$ aD$ڐa$[N ! D$ aD$a$[$ D$ 0aD$a$m[ D$ ȆaD$a$C[ D$ `aD$ a$[ y D$ aD$a$Z| O D$ aD$"a$ZR % D$ (aD$.a$Z( D$ aD$:a$qZ D$ X~aD$Fa$GZ D$ |aD$Ra$Z } D$ {aD$^a$Y S D$ zaD$ja$YV ) D$ xaD$va$Y, D$ PwaD$a$uY D$ uaD$a$KY D$ taD$a$!Y D$ saD$a$X W D$ qaD$a$XZ - D$ HpaD$a$X0  D$ naD$ʑa$yX D$ xmaD$֑a$OX D$ laD$a$%X D$ jaD$a$W [ Ba<M $daD$ faD$a$WF  D$ heaD$a$W D$ daD$a$eWD$ baD$a$;WD$ 0aaD$*a$WqD$ _aD$6a$VtGD$ `^aD$Ba$VJD$ \aD$Na$V D$ [aD$Za$iVD$ (ZaD$fa$?VD$ XaD$ra$VuD$ XWaD$~a$UxKD$ UaD$a$UN!D$ TaD$a$U$D$ SaD$a$mUD$ QaD$a$CUD$ PPaD$a$UyD$ NaD$ƒa$T|OD$ MaD$Ғa$TR%D$ LaD$ޒa$T(D$ JaD$a$qTD$ HIaD$a$GTD$ GaD$a$T}D$ xFaD$a$SSD$ EaD$a$SV)D$ CaD$&a$S,Ba<$aD$ ?aD$2a$]SD$ h>aD$>a$3SD$ =aD$Ja$ SiD$ ;aD$Va$Rl?D$ 0:aD$ba$RBD$ 8aD$na$RD$ `7aD$za$aRD$ 5aD$a$7RD$ 4aD$a$ RmD$ (3aD$a$QpCD$ 1aD$a$QFD$ X0aD$a$QD$ .aD$“a$eQD$ -aD$Γa$;QD$ ,aD$ړa$QqD$ *aD$a$PtGD$ P)aD$a$PJD$ 'aD$a$P D$ &aD$ a$iPD$ %aD$a$?PD$ #aD$"a$PuD$ H"aD$.a$OxKD$ aD$:a$ON!D$ xaD$Fa$O$D$ aD$Ra$mOD$ aD$^a$COBBBtp a t0t$D$D$ aD$aD$$ a dT$@؋$0$,$4$8<G fG GFGGHYt t)GG덋F ufG..GN F G1ۋW u1ɀ.D$/^SC u)CXL$<$_1҉$1L$L$8d4$D$(9D$($,$0$4$8< at a D$([HD$D$$2 a\$ l$D$ta$:Y \[^_]fCHD$aD$a$Y D$D$$Ǹ C(D$ CHD$aD$a$X a|$D$a$X C(D$ CHD$aD$a$X  al$D$ PaD$@aD$$ a D$,t$D$XaD$ a$(X |$D:D$@l$(99t$(sz)T$T$$l$(D$ D$ ,$ZT$$tefD$t$CHD$ ,aD$@aD$D$$ a] [9D$(s9t$(r D$(ohD$,T$ l$D$aD$a$EW q,0 aa(0 a$0 a,0 ax4t;u$0 aD$D$$D$ D$D$ $aã$0 a΍vVS\$ CttP a $]C=datj$Y0 aD$ CD$$ 0 aD$t 4$u]C[^À=da aC au=au$D$ CD$$ 0 aD$ts[^Ív,Xau D$0D$D$4D$D$$D$,Ív' 븐&d-1?ctD$$ 0 aD$Ë @$ 0 aD$eÐD$0 aÍ,0 a(0 a$0 at29"afH9t9"au$0 aaËu9"a荴&' a0 a UWVSPHq$H$4։$WDŽ$<$D$D$$8D$ D$<$ō$<D$l$7$}imffoD$a<$ivqD$.a<$QvD$D$`a<$AyG$1D$D$a$y)`aW2 f|$ $T$ D$wT$ T$4T$T$ D$$ T$ tf|$4GD$(D$,!v,$D$Ptfxh%D$$D$,$D$袱 tD$:,$ttT$$D$;$zt+D$\$D$ sT$ tD$$sL$$ $P,L$$@f11蕜Ɖ$=q=T=#11U@Ɖ$s1==s_=11Ɖ$l1x1Ɖ$1x1躛Ɖ$L1p1萛{Ɖ$~lNa( at-T$D$ aD$@aD$@$ a蘕 a(f===1ܚơa(4$D${hTD$Da4$P11膚qƉ$TWb11\GƉ$*8112Ɖ$011Ɖ$&1p1ޙƉ$ 1x1贙Ɖ$d11芙uƉ$f1h1`KƉ$<P4$T$P@-x1=11Ɖ$O==jt211踘D$$|11膘t9Ɖ$NdžpdžtdžxFX% a\$4$P4$vL11 tƉ$}N a atD$ aD$@aD$@$ a6 x=0 aI5`a1ҋ" " 9Tt 9r1D$L$$KtLa(11FƋ4$D$j aD$ aD$@aD$@$ ad 1-&L$<$P$D|$ $H$T$@D$ D$(D$,D$0D$4D$8D$<D$@DŽ$DŽ$DŽ$ DŽ$DŽ$DŽ$DŽ$$C$s$ C $$C$(C$,4$Pbt$$D$T$퉔$tA蚙<$<$x؋$@$<$D$HLÍv뻍L$X$T$P$<\$ $؀ɠ$H$@$DD$ D$(D$,D$0D$4D$8D$<D$@DŽ$DŽ$DŽ$DŽ$DŽ$ DŽ$DŽ$~$tS1hrts$RR$ aLu~sa:8$$$$<$@$D$HL1 auDsa:8$貛벉|$D$D$aD$ aD$aD$@$ a 뫍t&$$$l$T$$$ 1Dr$@@aL $xX$$;B}E$ t5@a $| $$$$ļø@a $蓖$$ٗƉ$T D$,u$t$nt$$襗a('D$,$菱T$,:L$X D$D$$ D$,84$ZD$Xf!== =$D$$D$$D$D$ $$ȃҁ@؃ D$,$)ƅ T$,:@D$4$J|$XE$$ҁ@@T$$l$ 4$T$T|$4$P<`a$FP"4F @$f a$$D$ aD$aD$T$D$$ a< &T$,$DŽ$DŽ$zWt$,aaT$,D$TaD$XaD$\aD$`aD$daD$hD$X$$#& t<$t$nt$$/RRtYa(D$,$T$,:tD$XD$,D$D$$9f$t$$œu$D$8D$$诓tjD$D$u,$HqT$,,$T$\D$,$d$$DŽ$$T$,$t$,a$u;aD$TaD$XaD$\aD$`aD$daD$haD$TaD$XaD$\aD$`aD$daD$hx$D$$D$ $D$D$$[?H$aD$$D$<a\$0\$@t$4|$8P t1a$t x\$0t$4|$8<Ív@u$Ƒ$赑$褑D$,|$D$$;t$,t[t$$D$D$,$D$D$o\$0t$4|$8<$SH\$0t$4|$8<Ív軐utrkT$,D$D$D$T$ |$t$$CUt$,D$ aD$naD$$ aȅ (@ad {~xt@a @a P&<\$,\$Dt$0t$L|$4|$@l$8l$HtxD$D$<$p`a"P B@uҁT$ vf`a""$T$D$D$<$D$T$tE `a"H AӋft&t$ T$Pl$$T$щ؋t$0\$,|$4l$8<Ðt&ސ&=a$$$$$t#$$$$ĬVtԍ\$?D$i$Ƅ$D$vD$iD$D$ D$D$"a$1zt$i>u q>taT$($?D$,[T$iD$D$$[tۉ,EP8t 1D$D$,$҅uډcD$,$Tt-E,$T$($D$o)&E ,$D$D$($:fWVS0t$D|$HD$4$d%NLPǃ|$\$4$7CLCPtPPPP a1‰T$$P au 0[^_Ë$84$|$D$HD$ |aD$aD$@D$$ ax 0[^_ÉT$ D$D$HD$D$ XaD$aD$D$$ a) 3t& aBD$ 2aD$aD$@$ a @$1P aD$ EaD$aD$@$ a裀 &'UWVS\ a|$pt$tl$x\$|@a D$Gte@a y;wpD$H X@a莹 D$G]^@a菸 ;wT$H@a, &~π\$L$H<$D$D$L a@a ;oF L$H@a褸 ,$, L$LT$H |$G a\[^_]f\$l$t$D$ aD$aD$@$ a~ ?t$D$ aD$aD$$ a~  aD$ D$D$aD$ aD$aD$@$ a:~ %sa @a虷  af\$l$t$|$D$ 7aD$aD$$ a} &@a6  asa @a  at̉l$D$ aD$aD$$ aM}  atD$ D$D$aD$ aD$aD$@$ a} Zv@av ;oT$L|$G aL$HL$LD$,L$H$L$L $T$@L$,T$@L$L$HT$L$D$ aD$aD$@D$$ a7| f,$@a薵 9ol$<$1 L$L $P@V au!sa\$D$ aD$aD$$ a{  atD$D$D$aD$ aD$aD$@$ aQ{ mt&VS@a$\$4t$0Գ ;^ @a| T$84T$4$$Pt a@ u#$[^ ap@ t\$HD$ MaD$`aD$@D$$ avz 멍t&@a  attga %Ixt 2a:Gu u1ua4$8"a|$]a4$8"a|$]fa4$8"a|$]Í&UEU EU Dt&UWVS,a]t]@Tp tS$1WEu 2tVUD$$T$  u݋U<=uҍ|e[^_]D$D$$| u1e[^_]estt$D$${ D딍&'U ax t$a' a@ ÍUED$D$$/"aÐ&UE$D$ E D$ED$Í&UE$D$ E D$ED$Í&UE$D$ E D$ED$9Í&UE$D$ E D$ED$ ÐUU E @JHJRHP]Ðv'US]Ct$rC tE[]rvC u[]ÍvUSu$a$`au[]ÐUWVSÃL$D$C$gsCt$$td<$SDD$C $6sC T$$|$C C${ a e[^_]Ít&U$U UЉ$U$ NjC<$D$aD$|$4$S<$KDD$C $r C L$$ |$C C$UЉ$ {P=daC{eԍGW(jt$#T$D$4$sD7C C4$D$ye at&CD$ waD$aD$@D$$ am  aC D$ aD$aD$@D$$ am e[^_]Ðt&U(ED$E$$aÐt&U(ED$E $$aÐt&UWVSP8iEJ׍ Bh $\$#؍0 fCD$t$$w 11$  tDn$ljLj  auie[^_]и lntD$$$^  at(\$D$ aD$aD$@$ ak e[^_] aDžtߋD$ aD$aD$@D$$ ak 믐&UH]ɉÉЉʉu}EtD;֋K%Ixt 2a:Gu u11u]u}]Ív a&C Xg `a!^s1 sUt$3t$s1 $T8ƋUfau}t ҿfabfa9U4$ST lNj<$D$Ct$$ aD$ aD$aD$@D$$ aj s KUt$3 $t$4EUD$ aD$aD$D$@$ ai C Ut\]Ћu}]q `a atًUD$ aD$aD$D$@$ aXi U맍vS u]}]t&Ua99"at9"a9"aÍv'UWVSU<=1tU<=u01u2ހ>=t57t"E\$4$D$tك7u1[^_]I)NjE 8F[^_]f1둍UWVSd]E-1   U܉E$} ¸tV;tQD$=u$u:t$$|UBׅtԃGt atE1ʃuE,Eڸ HgEC aUD$' EMUE}uUUE1EU1ۄt tDދuU@aE/|=faDtMy u}utIE뛋UU$MLMːt&9l}uɃu+u9uHa1M11ҍ@at)=fat"UU$5MLM t&|u>u`a!u uڋU+EU 9]+]ulM at4MD$ =aD$@aD$@D$E$ aD$6c Ee[^_] D6E a M\$EE $D$ `aD$UD$eMljE1uE D$&a$Ptۍ:tӍMUX 1҉1$舂 ME9MXى$h f?!|_yU+9EfvE$nEMdE MD$U$eMU 9Mn+MϋMZfW‰$UUtwf:Sf=Hf=>&UD$ yaD$@aD$@T$$ a%a M1,EEf:zU\$D$ aD$@aT$D$@$ a` \E1}EEpD$ aD$@aD$$a+DD$ (aD$@aD$Z$aDD$ aD$@aD$$aCvUWVS1ɃLEU1҉D$&a$\$4$PT$U6UԍEܸ)ЉD$U܉T$E$Wtsa8$|U:/t4ыU܉ au44$jU$*be[^_]fU1ɉ at̉t$D$ NaD$aD$@$ a3_ 뢐Ee؉$rP[L$#L$T$U܉$MWMԉU\e냍&UWVS˃<Ӊ$UЉEE̍ED$Eԉ$1t_ufaU4iaaE11҉TU1ɿfauԹ1e[^_]Ð$EuU9EU1Uu)ƃFE~;0 at]<$`0 atE9"at$$T$9"arUD荱w9"aT|$$x`9"a0 a벍USd]E-1   UE$菍 ¸u0tJ;tED$=$u11ɋU ؃}d[]f atna|$D$ aDƉD$UȉMD$aD$@$ a3W UȋMh* $UȉMD$D$UȋMą a'D$ waD$aD$@D$$ aV UȋMuЅ s $UȉMD$D$MċUȅ}Ѕs $UȉMD$D$EMċUȉE aE܉$ U܉$a  aDžtA as t,<$>f t$<$C $XC uĀ=(atL a_t(\$D$ qaD$aD$@$ aU D$\$$fa M܉ $ e[^_]É'UWVSÃL$ TBQD$#fUމ\$]Љ$fEEy"ED$D$$e D$D$ aD$D$$$ ED$aD$ t$D$$d& yr$( D$D$ aD$|$$$ ED$aD$ t$D$$ & y$' u1e[^_]ÉE$p ED$4$$g' UWVSÁlE؉$ž dE-1  UЉEԍ$ U؉$h ¸aafx<<$yV|$\$Ɖ${Xiaavk$aa59"aED$$fa$atE؉$ de[^_]Í&t$]؃tWunEȅۈ$U0 a@]5 af9E$n DžDžDždE䋕] =ڸ=Ċ8tBuJЉa$ a‰D$Yt- a4 avFT1Ct&|aC{f1t&< a:uӋ $a|$L$$ +]\$;$|$ D$a$ \$]܉$hR`aEE@]ċ!EEEEԉD$ ED$ED$(D$$D$ @D$D$D$D$D$@$R,xJaH uM\$D$ aD$ aD$$ aA E$D$aL]u}] at҉\$D$ aD$ aD$@$ a^A 먋=a&'UX=da]]u}u%ap ]u}]dD$-1$_t8a(tt==0!au  atA a1]u}]t&11 0!aӍ&f=aK}1EEEEE‰EE$E܀}]<$a$ָ6aa a-a9WJ+G1ftqJGat$؉$^ JGG"a1X `af k3u17ƃvf=a9aw aOx 5aa]w a#x a3 af=aaw aw =a at,D$:D$ aD$@ aD$@$ a> $:8I&US]D$$paID$$It#D$$paHt#]ÍvD$$HuD$ aD$ aD$$ aa= ]ÍUVS19]t;u0 ae[^]Í&D$t$$BH t[D$\4$t&/D$\$ݪut$ \$D$5a$0 a- e[^]ÍDžcygwDžin1.DždllUUEu}rE1]] }t)BZB CB(BE]u}]ÉZ ېfU1UVSzmatXJ tO; LasGBY:J BABt+Cl&aBo?t$$4aD$c 0 a !%tDJD0 aD^00 at$7 !%tDJD0 a0 a$[T E؍Ut$D$$T$ D$D$D$D$D$ D$$"?(u;e[^_]D$0 aD$ aD$aD$@$ a3 k=D$$Y= t&;z=t$<=t$$|aD$ -=UT$$=UD$ ^aD$aD$$ a2 룍1_fUHuuUK_ a]É}UF%CF;CpaCE䉃 CC$$<da$<ø舨  at8E\$D$ aD$`aD$daD$$ aD$1 ]u}]ǃpaCAaƀH,v'U8]Éu1҉} υu t]Ћu}]ÍUt$$UuԋlTE M$Z؃a t$@$e<농t&'UWVS]  Dž t71 ale[^_]Ít&$<: t4$;DžD$4$;# a` 4$; avi`  apa`a\$D$ TaD$ aD$D$$ a/ 4$ ;DžD$4$:uW a` 4$: a4D$ aD$ aD$$ a'/ f D$$Z‰؈_ 4$S:y atNҹadaDD$D$ aD$ aD$D$$ a. e[^_]D$ |aD$ aD$$ aK. L$D$ aD$ aD$D$$ a. 16&1( auB $؃^ 4$(91҃ PD$D$ aD$ aT$ T$D$$ ao- zv'dUU-1HP]vU$aVS e d-1PtgX ށ at;T$t$\$D$ aD$aD$$ a, d-1p$a5f [^]ËX뗍&U8uu $a]]},e ! au5t$c $ae ]u}]&|$\$D$D$ aD$aD$$ a, 뙍&'UH$]]uu }   $aRd d\$EE$蔖 <t$$蒃 E\$$ d-1D$E$$ad ]u}] au4qsa aut]u}]fD$D$0D$aD$ )aD$aD$@$ a* qsa aOt$\$D$ @aD$aD$$ aJ* v["a8tQt$$Q E\$$“ d-1D$E$X$akc ]u}]ÍE\$$轒 u&UED$$ɃÉ'US4] wa$a"b d\$EE$ d-1D$E$$ab 1]Í atDD$YD$aD$ )aD$D$aD$@$ ax cesaD n$%4󥍍T$D$L$ǃ 1\$0t$4|$8uCƒ;T$tm4$3H9r҉) 9tP\/tS;T$u1ɉ}\t[\$d$D$,[^_]Ít&D$D$,[^_]Ð< a\$,\$Dt$0t$@|$4|$Hl$8$݁tL aqF ^$ Ѓ ЃF\$,t$0|$4l$8<Fƒ |ƒV a ^$˃ ؃ ؃҈FtuaD$SaD$ aD$"aD$$ a _\$4$t^ aN^$/D$La띍&|$\$D$ aD$"aD$@$ at f aFl$D$ aD$"aD$@$ a  aF a1ɽf a1ɽFFƒ `M&VS4D$DT$@L$H~lugiaaΉˁ@@ @@DٸD$#B$$ ؉D$041[^à asa4[^ aB$tD$D$,D$ aD$`aD$@$ a訾 D$,fL$$P41[^1B4[^D$B$@$% L$f41[^D$D$|D$`aD$ oaD$aD$@$ a VS$\$0D$8t$4T$M $}t$D$ |aD$!a|$D$D$$ a[ Ee[^_]EEM $3utw@ff|P\uc atsa  a1$$$$ĜÐt ttA CpȍCXJp f asa*( aX|$D$ aD$@"aD$@$ aZ /vTmD$D$$P8M$8$ʉp $NjP@vl$D$iD$@"aD$ oaD$aD$@$ a訲 D$18tQT$8 a9,T$<  a9KD$0ftOT$8 a9T$< a9D$01t1Tt aDCbt at D$ D$D$$Lata3$a&'D$`P`@`f?fPPfa@ f?fPfP P`BBB Bʃ@@@@ @$@(@,@0@4@8@@@D@L@P@X@t@xǀǀǀǀ@ǀDǀHǀLPÍt&D$`P`@`f?fPPf@ @f?fPfP P`BBB Bʃ@@@ @$@(@,@0@4@8@@@D@L@P@X@t@xǀǀǀǀ@ǀDǀHǀLP( aÍt&,\$$\$0t$(t$8CuO au1\$$t$(,ËD$ aD$`aD$@D$$ a6 1\$$t$(,cD$D$D$t$ D$D$D$4$9t\$$t$(,ËD$D$D$(9щT$,| 9v|$(D$ T$ |$D$D$1hlEv`L$$ $Ԡlxh |)9r%t&1L$$ $誠Q_>t&D$,L$(D$(T$,L$1;L$,}~)LE1$1 t;vhՍvhLE)‹D$ $ hǃlŋL$$ $ _. ;|$(v|$k9!v'VSӃ$B!M Ce C@poECDSDfCCH$CC@Sl$p$視p<8D$Tt<$t$D$pt$D$,`GD$$N$ԝD$$D$( T$(D$,z $|$D$K,$觝^d!a*l$$Fa\&L$,11<$ !$_u"tǃlh<[^_] D-D$$$L$,$i <$֜|$$ `[Stǃlh<[^_] & a<[^_] t&Ȼa$_d!aL#asE at踈t$7|$4$}9wtED$4$YD$%a$D$w_tfVSDT$P\$TlH H KH$KH(K H,KH0KH4KH8KHa1<$D$a$ma1f afN҉D$,L$T$D$ 'aD$2aD$$ a要 D$,Maƀ1: ahsa  atD$D$D$2aD$ y&aD$3aD$@$ a  at$D$ -'aD$2aD$$ a %a96D$D$wD$D$$2a讕Dt&a\$\$ t$|$$D$a$af9t9fǀfǀD$l$\$t$|$Ðf9u䐍t&VS4D$@\$H$D$$Ƌt1 au441[^7%a3 atJvCD$ C D$\$t$D$D$ <'aD$2aD$$ a> 4[^ÍUWVSLt$`\$h4$T$CD$D$D$D$ @aD$D$$'a' h$D$a$uVl`CfC$T$,T$$c a4[^Ít&afff$l`CfC$T$,T$$茄 axf$0$t$D$ 'aD$@3aD$@D$$ aZx 4[^$r at$L$< D$ D$,D$D$4$L$D$-D$6T$:f9t1f9kT$0혃l$D$T$ D$$L[^_]faL$hfT$4L$hL$hfL$6/fl$8Ffft$:fD$,fL$.f  fL$2f9fT$0T$t1fD$< fD$>$L$< D$ D$,D$D$4$L$D$}D$6T$:f9f9L$2)D*$L$L$0D$D$L$ L[^_]fL$8dffL$:FfT$6vt&,\$\$0t$ t$8|$$|$hˆ  ayҸ&a&aD‰D$D$ 'aD$1aD$$ am =D$hD$D$lD$$Da1D$$JED$ D$lD$alt$*D$ D$D$%(a4$" v5a EP|$lfƘ$t$D$|$ D$$w5aPu-D$hD$D$lD$$4D$hD$$D$ D$lPHƒD$t&$D$a$aDD$D$D$ ЉD$D$D$$`aDD$D$D$D$ D$D$$ aDD$hD$D$lD$$D$hT$lD$ D$D$D$aT$$T$aDD$hD$D$lD$$D$haD$D$D$D$ D$$D$"aDD$hD$D$lD$$ aD$hT$aD$hD$D$lD$$D$hD$ D$D$D$l$D$ka FD$hD$D$lD$$MD$hD$D$ 딍&D$hD$D$lD$$D$hD$$D$ D$lPHD$a1D$$qɉE΅ҍrEƉL$ D$b~D$hD$D$lD$$a1D$$JҋT$hED$T$ 0aD$$مED$aD$$D‰D$aD$$D‰D$VaD$$مED$#oaDD$hD$D$lD$$ZD$h aT$lD$D$D$ D$ L$T$$oaT$ D$$D$aDD$hD$D$lD$$D$hT$lD$ D$D$D$aT$$T$"ƈ4$>5a9o$D$a$džf%ffdžpfdž0fdžPfdžzdžkƆ_ƆSdžDƆ8Ɔ,Ɔ džfdž`fdž fdž@fdžffdžfdžfdžfdžfdž}fdžofdžafdžSƆGƆ;Ɔ/&D$*[?6t$*fD$.c^D$hD$D$lD$$`D$h aT$lD$D$D$ D$ L$T$$u5a]D$hD$D$lD$$D$hD$ D$$D$D$>D$hD$D$lD$$D$hT$lD$$D$T$ D$yD$D$ D$D$$D$hD$D$lD$$SD$hD$D$$D$D$lD$ Ulh(ch҉$[1hD$$sh$T$RT$$lB=a.$T$\T$D$ t$T$$mafaǀfǀfǀhҍR$h*hEʈh+rh)ch҉$O$T$RT$$kRR(D$`5af+D$\fD$bf+D$^ft e5a b5a$T$\T$D$ |$T$$mlvt&UWVSla$$D$0ka)ap.$)tt$)9Ol$$L$DL$t|$pD$DT$T$(D$ dD$HD$-0$T$0T$(5CtL$4uEL$4)щL$4D$4xT$$D$D$0]| xǡa ]1&TEJf0afTE9w׍L$XL$0t$8t$0t&D$X)lE$@@FD$t$ T$l$$ju?%a aDŽ$$l[^_]Ëp1~C$T$LD$T$ D$D$, a$j9pǃpv;$D$DD$Ht$8r7pD$8$$l[^_]Ív=`aD$0pL$D 0a$dL$T$)-0T$(L$,|$l$ D$$T$0T$(L$,,w,E9$T$89t$8uL$8)L$uEtT$4BD$4[^_]ÐD$4D$4[^_]1Ƀt540atԋT$4D$Ѓ$|D$4[^_]Í404at$4D$4[^_]Ðf<$,áa$8͉$0$4HT$T$$D$XE$D$D$TD$=D$Pt5Ea`$,$0$4$8<Í$(lD$\D$`'D$dP$P $P$$P($P,$P0$P4$P8$P<$P@$@D$D$$4$1҃|$\tT$`L$d$$$D$X xL$X$$D$ D$t$ $$_Q$ffCa,ǀ$u-f$ f$f$8$t ǀt׃ tt$f2f $ft PD$x4$D$U $#$$D$ T$t$$OI)}t-t$P|$T7EEt $"yt$Pt$PulD$\D$`D$dP$P $P$$P($P,$P0$P4$P8$P<$P@$@DD$$$4$o$DŽ$DŽ$bth=tH%aEa`$$"aE`$ "E붐a`R f$x$D$$Ey$$ $ haT$hы9)ɈL$o1Шl1ɨU|$oD$ MtD$h9$ ҃ MT$ t$h$$ |$hD$h  ǀffT$l$f1tt$hdžt t$h t T$h |$ot$h*^D$h(1P!D$lD$!+a!C=Cƃ t$xD$T$ L$4$ DŽ$ a5$M&ftTfa+z$t$xD$@+a4$K DŽ$$5E6$t$xD$*a4$D$$D$$D$$D$$ D$ $D$ !ကtDȍBDɃ)$=t$xD$D+a4$s #a D$ D$ ++aD$3aD$D$$D$$ aL {D$ t$xL$D$+a4$D$D$lD$ǃD$  !ကtDȍBDɃ)$$ 5aADŽ$wheeDŽ$l dofDŽ$wnƄ$)t$hD$ MD$o a$ DŽ$$ L$h)L$o aD$ *aD$3aD$$ aWK 5a)t$hD$oD$l t$xL$D$+aD$ǃD$ 4$ !ကtDŽ$tɀ$t$xLx$Dxǃ x!D$lt$xL$D$+aP!T$L4$ T$LL$|DŽ$$Tx$ $*a=aDŽ$wheeDŽ$l upƄ$)T$hD$ ML$o@$*at$8 4f$`a$t$yP@L$D$$; c ‰$$ ^ aL$y` DŽ$moveƄ$$*aD$4 lj|D$ *aD$3aD$$ aH $*at$<D$ MU$у?€@LxTy$5@D$|?D$}DŽ$D$xDŽ$`$*aD$0 ljaǀu$ff}|$y2$Dx$[D$|DŽ$*D$yD$xt$x$aD$y}D$l@%Í'S8$@\$,$;g $/D$:$豼 $!S at(\$D$ H+aD$-aD$@$ aF $/tּ 8[UWVSLT$`D$$4)at$dl$hHD$8$,.( T$8$ T$`x av9ath$ݡ|$\$D$ D$ Z+aD$/aD$@$ aE a v au& w$+at&>099ƃǃ aLt&%\$hT$8$X a`L[^_] v$T$,^T$,^Hǃ aT$`D$$vaǀ& at&ЍJЃ DBЉƍЍJЃ $L TJЉTɍt&>0(ƃ6<[<]<(T<)ƃT$`t$l$$ t&ǃa|$\$\$D$ Z+aD$/aD$@$ aB a?<;ǃ<; ǃ&=Ƅǃ1ƃƃDŽ(uǃƃǃǃ_ƃǃ~ǃƃǃ^P L‰ ǃ2u$a덐t&t ǃǃ D$ht$D$ S+aD$/aD$D$@$ a/A  aD$hD$ p+aD$/aD$D$$ a@ T$`D$ D$$D$aǀ;T$`$D$a$aD$D$D$ D$D$`D$D$$aǀÈ$VaT$`ƀƀƀ$D$D$ D$D$D$`D$ D$D$$aǀ-ƃ! Ŷt&WVS t$0D$ D$D$$  at]$ aoKt9t4$t $&  au;a [^_*KJD$$c atʼn|$D$ +aD$`-aD$$ a> 뛉D$D$ +aD$`-aD$$ ae> J=VD$D$ +aD$`-aD$$ a(> fU]u}$ta]u}]kGP!DžP,aDžXDž\Dž`DždljDžhDžlƅpDžDžDžDž8Dž<Dž@DžD$訏3P&D$ D$D$$@a~@D$ D$D$$@aID^ع`󫉥<4$IfD?L%`8H,aEL,a\$7EP,aET,aEX,aE\,aE`,aEd,aE¡h,aEơl,aEʡp,aEΡt,aEx,afE։\$4$IDD$ @D$8,aD${$ ElEDž`DEfED$$`D$ D$D$D$D$D$ LaD$La\$$F(qG<'GD$$ @$DD$DD$|D4$aH7G&E؉$SDE܃$EDD$'@$DtGF<}FD$$% @$CDHeE$3uFt&뼍&',F at(D$D$ z,aD$ -aD$@$ a9 $,ÐS\$ $$CC$$+Cat1[Í&f=at Q1[áar ar at븍S8CtS aau18[1aD$ ,aD$,aD$@D$$ a8 ؃8[Ít&t/D$,D$D$ D$ D$D$$Eu6 aumD aa^[t&D$(tál&a@u$ a+8[+㍴&D$ ,aD$,aD$@$ a8 bDa륐UEU puǀlaKǀlU E5t&UWVSÃ\lCMĉƉ9TaCl$S  lِt&uăG D$F$]Ufzt=BFFB` F  aul\1[^_]ËB===FFJʁ `EF 1 au Ѓ\[^_]1҉T$UD$ 4aD$`4aD$@$ a|6 UĐt&먺YfAENEčMЉUD$aD$ EСTaD$a $-aiD$UUNktY4auĉމCa(FNt&UU EU E鱤U(]Éu։}$t"1CuI Ɖ]u}]1Cu'D$D$$P8tHCt/1 FF(t1$P@듉 Ɛ{t&USӃPlu0I1CC CmAfC[]Í[]Tt&UE@t1ÉE t&U8]] uu}% = uKE\$4$D$Jt]u}]ÁD$\$4$rN au&zsa1]u}]D$1D$1D$`5aD$ 14aD$4aD$@$ a3 wzsaH at@)E\$7D$$@\$ D$D$D$ t$D$ D$D$$k=(x,=t3= E$==1e[^]Ðe1[^]Í&K CaD$D$a\f9GfEfEE]${= <ۃE$<؃e[^]Í& ې&UWVS|]PaTa{lEUA 1ECXE$09zUEC\EUEЍE̍EEUԋUt$$D$ !@D$T$(UD$D$D$T$ D$E|$$C<,vA u>Cpt8`aU!$%#E @D$EE$f;1e[^_]Cp<1EUEЍE̋EEUԉt$$D$(E܉D$ ED$ !@D$D$D$D$1&t$;FVFNfsV@3Att@ribu@ tes1FFfFXFEt`a!%#E B5aA D$ǀh DŽL\$HT$T$8\$D$D$ 96aD$?aD$$ an& T$8[^_]1 atFXT$8$2l$D$ 6aD$?aD$@$ aD$& T$8U$ T$8$5T$8>$D$$ D$D$ l$$6$1$C$C$C CL$< $2ffT$~1ۍ&D $3;|ꍆP$l34$Q at>D$0H|$D$D$ O6aD$D$:aD$$ a" 1[^_ÐL$<É$H$P$@$DdtGTt;Xl$$l $<$@$D$HL&$k{lD$,)A Œ{X{X$DŽ$DŽ$DŽ$DŽ$DŽ$DŽ$DŽ$DŽ$u$$$D$D$ (T$|$$m1Ń{l A u Cp|$,11A Cp{Xf{Xt&Cf%?fCD$D$$P8D$,{lA jCpZCXt @E$SXl$$jŒ麀5aT$,u$74t{X{X$DŽ$DŽ$DŽ$DŽ$DŽ$DŽ$DŽ$DŽ$%L$,$Cp $C\DŽ$DŽ$ aDŽ$$DŽ$$$D$ $D$$,D$@D$D$$.}CXDŽ$DŽ$DŽ$D‰$$D$$,DŽ$DŽ$DŽ$DŽ$DŽ$D$D$ (|$$A.$,$-&T$T1׹D$@t$bsa 벋$T$8T$T$XD$D$ T$$+u`;|$D|Svzt$P|$T$T$PT$T$XD$D$ T$$}+$1 C`@t$P|$TD$@T$D99$T$XD$$D$ D$D$D$ T$D$ D$D$$P*( at:CX$'t$D$ 6aD$=aD$$ aD$S v$T$PT$T$XD$D$ T$$[*15avD$D$D$=aD$ 6aD$:aD$@$ a vD$ D$D$=aD$ 6aD$:aD$@$ as  au%P`sa't&D$D$D$=aD$ 6aD$:aD$@$ a f;t$@|1t&5aS(D$4\$0 u, D$$D$VK([Ðt& aub_sa1([D$D$_ D$@:aD$ 6aD$:aD$@$ a _sa1([ ataD$ 6aD$:aD$@$ a bv',\$ Ét$$։|$(dt3Tt' auXc]sa%$L$0SX<$L$\$ t$$|$(,vD$D$ID$>aD$ 6aD$:aD$@$ a g&'Lt$@t$X\$<É|$Dl$H l$,$|$$D$D$ l$|$$%D$,D$,tL$D$D$ l$|$$i%x!1\$aD$ 6aD$:aD$@$ a [sacv5a2H&l\$`\$pt$d|$hCXt5t1sX4$t Cpu^1\$`t$d|$hlÍt& a#Zsa\$`t$d|$hlÍ&4$X !TaD$HC\D$LD$TD$PPaD$\D$XD$ D$D$H$#=4u1*{l5at&D$TD$PPaD$\D$XD$HT$ T$oD$D$D$;aD$ 6aD$:aD$@$ a 1뮐v'$É$։$1$A L$,@p$tVf aXsa(fCD$D$f%? fC$P8oFwBtm areXsa$$$$$:|$,Q aDWsa1$M$%bf$($T$,D$D$$/uƄ$$$$T$T$,L$ T$SXT$$ $XCXDŽ$DŽ$DŽ$D‰$DŽ$DŽ$DŽ$DŽ$DŽ$$$T$$D$D$ (T$$$SXD$ D$T$$&/bV8XDM$$T$,$T$SXL$ T$$.t& T$8ؽQH$$$D$PBD$HQ$ B T$TQƒ8Q$$Bȃ$BA A$@@?D$D$D$ ?aD$ 6aD$:aD$@$ a &D$D$D$ ?aD$ 6aD$:aD$@$ a {t&D$D$9c atHf$$PC\f$f)鍬$$$$$D$$f$f$$DŽ$DŽ$DŽ$DŽ$D$!@D$l$ D$$$D$$D$HD$$l$D$(D$ D$%D$pD$ D$D$$o,ŋ$$$$CSع[^_]Ív atۉ<$D$8T$8D$ 6aD$ @aD$@T$$ aD$[ T$>Hf,|\$lÉt$p։|$tl$x$Nj$(D$1{l<$D$Bt*D$HO\$lt$p|$tl$x|ÍD$8l$PD$D$ D$l$<$C Ct(L$H뢐BtD$H܍D$X<$D$D$ D$l$BT$XD$\uwCpt Kltt&SL$HCs a {dwJ at߃X$D$,T$,D$ 7aT$D$D$`@aD$@$ a  atX$\|$D$ 8aD$`@aD$@$ aD$ iX$l$D$ 7aD$z&S\$ $pC( aǃh[Ðv'\$\$ t$t$$$5C( aǃht$$t$\$ \$ L\$@\$Pt$Dt$T|$HCXtBt>t6 aX2sa1\$@t$D|$HLËD$X$D$ D$D.u a\$@t$D|$HLCpt {X $T$0T$T$8D$D$ T$$*xFD$0T$4D$(1T$,1Bu-T$,D$(w CptKltu {dw11҉CC@S$02X$%t$|$D$ p8aD$=aD$D$$ ae D$D$D$=aD$ 6aD$:aD$@$ a$ g au6$n auZ0sa1&D$ Y8aD$=aD$@$ a $ ataD$D$($T$oCD$D$$f%? fCJCXD$\PH;v'UWVSÁ$P$D$+|$$E NA=ʚ;FPT$,ʚ;|N|$,$$P a$$=D$PD$$|$H$D$HD$L}2 D$XD$$$c2 D$`$D$dD$h$D$D$ (|$t$${l =1ļ[^_]Cf%?f @fCD$D$$uD$+$|$$D yNA=ʚ;Fhl$,ʚ;~uN|$,$$P$$ aD$PD$$|$H$D$HD$L0 D$XD$$$0 D$`$D$dD$h$D$D$ (|$t$$v{l '|$+61ہļ[^_]ÐxՀ|$+$Cp {D$xC\D$tD$|aDŽ$$DŽ$D$t1ۉD$$D$@D$t$ D$$X$D$D$ (|$t$$$$t&L$8$tL$8$D$ 8aD$@=aD$@D$$$ aD$ t&$$$$$$$ auek)saQC\XD$tD$x$$DŽ$DŽ$D$|uD$D$@D$@=aD$ 6aD$:aD$@$ a Zj5a~u1fc?D$D$$" au YD$ 8aD$@=aD$$ a@ -v' %t&,\$Ét$ ։|$$l$($t}Cudt(Tt؋t$ \$|$$l$(,N{lt(uы\$t$ |$$l$(,Í&7uD$D$$uta{lC$!ŃCCC ЅC4\&CD$D$$f%? fCltfov' t&|\$l$$t$p|$tl$xD$?{ $SXT$8Cp @D$DC\D$@D$HaD$LChT$Xl$@T$ $T$0L$4D$PD$TD$D$l$|$=="ƋT$0L$4 au$1\$lt$p|$tl$x|ÍD$8k$1l$$D$ |$D$ht$D$ 8aD$<aD$D$@$ a[ 녀|$?%@!NjCD$T$ l$D$|$ $k L$@r atnL$sq|$Xf?.T$@$L$4$T$$T$D$D$ $@1҉ƃ1L$4$$|$T|$@t$PBT$TD$PxGpn|$@wltYt$@~dH11?|$@dCc ]D$D$a,$ t)ƇNL$\D$PD$TkD$8$fС a9PD$D$,$J ƇML$\D$PD$Tt$@4$L$4$T$$T$D$D$ $1҉ƃ1L$4$$gt&S\$ $`ǃh aǃlǃp[ÐS\$ tpD$$dl[Ðv'SÃ(շtluD$$D$([ÐL$ T$~1f9uÐfST$D$ ~#XHu[Ít&T$ D$~&@uÐ&'ST$D$ ~ XHu[Ð11Ðv'S( a\$0uCuǃ|ǃx([1CD$xD$|D$ @aD$EaD$@D$$ aK 뚐&L|$D|$T\$<\$Pt$@l$H% D$D$$ǃhǃl@ǃpǃttltHD$, au|sa20 a+1\$D$ L$T$|$$D$\$D$ xa|$D$$W a1\$Pt$T|$X\Ív$7t֋1z$|$>D$D$ |$$D$ED$\$D$ xa|$D$$蟁uD$,t$$D$, atQvT$T$D$D$,D$ AaT$D$KaD$@$ av D$,,&VSD$ L$T$A tgt]sHӅҍZHӋ?s+sQxZX 1ta[ +XӉY [^ÅҍBHT$T$ ҍBH?RQA [^Ðt&[ tX 1u։Q [^Ð<\$0\$@t$4|$8{ t\$0t$4|$8<Ðt$,|$ t$$$@  a1 D$ D$$t uvN d-1諍{ atD$,D$D$(D$x$+t$,\$0t$4|$8< &C$ a$\$lj$xttD$pD$l<$D$ D$,D$D$(D$t  a9xt$|$D$ BaD$ GaD$@$ a袣 D$ BaD$ GaD$@$ ay +t& atD$D$,T$(l$t$ |$$uD$,D$\$D$ PxaD$D$$l aT$(10R$T$(謕t݋1y$D$>D$D$,l$t$ |$$D$,D$\$D$ PxaD$D$$k aT$(tHt&L$T$(L$,l$t$|$D$ DaD$ IaD$@$ a L$,T$(u T$L$,$HL$,1* &'<\$0\$@t$4|$8s t\$0t$4|$8<Ðt$,|$ t$$f$ a1 D$ D$$-t uvk: d-1y{ at$o|$ pD$lD$|$t1t& aD$1D$$yjt& aT$,D$,T$D$P`$PxNjD$,(f a3C$Z$tD$ pD$D$|$)@1lf P`1 aD$2EaD$ nDaD$ FaD$@$ a zt&D$DaD$ nDaD$ FaD$@$ aԌ D$]DaD$ nDaD$ FaD$@$ a裌 D$\EaD$ nDaD$ FaD$@$ ar D$IEaD$ nDaD$ FaD$@$ aA == @t81D$oEaD$ nDaD$ FaD$@$ a !C$D$$Itl$D$ lD$x$phC$1$tl$D$ lD$|$phtl}1vD$DaD$ nDaD$ FaD$@$ aԊ D$$?|$ pD$lD$x$^C$t1t&D$DaD$ nDaD$ FaD$@$ aD D$$tD$ pD$D$x$lC$O1WD$EaD$ nDaD$ FaD$@$ a贉 D$DaD$ nDaD$ FaD$@$ a胉 D$DaD$ nDaD$ FaD$@$ aR D$DaD$ nDaD$ FaD$@$ a! 1. at aqt&XMa1q&$Nap‹$D$ D$L$T$D$4$Mj% axD$ NaD$OaD$@$ a{ O aB|$D$ _NaD$OaD$@$ a{ t& aD$D$  a1$|$x$h$lL$L$hEET$LEfUfD$LFD$ FD$F D$VD$ PaD$VaD$T$D$@$ as N^ at@GWD$T$GW D$ PaD$VaD$T$D$@$ ar GWF EFEfEGW   aEt8D$ PaD$VaD$T$D$@$ a>r Ĝ1[^_]Ðt$LL$LQ Ed$|$|$hD$D$|$D$ D$D$@$f~ |$L{ au>N1D$L au>L$LAQ v1CPa&1EvL$LAQ D$T$QD$ PaD$VaD$T$D$@$ a q zD$LFf D$PD$PFT$T‹D$PT$\&D$8D$\‹D$8щT$PL$PʉD$8D$8T$Eč\$+PD$Za$@tUċsB 4$D$\¶ PE}t$<$蘱 MH$7 C14kMAQE@ 1 aue[^_]ú  atUMĉD$ET$L$D$ ZaD$[aD$$ a\A Ee[^_]ÐUB |~&<$ȄUBR u&EX$M1҉$1pMAQ<$qMAQ&C1҉$11(USDEH$ ¸Bm<L$u#t D$,\$0t$4|$8<É% D$D$$\|CfC}D$D$8D$ [aD$ ZaD$`[aD$@$ a= # au ۄ sa1fD$D$2D$ [aD$ ZaD$`[aD$@$ a= fS\$ $2( a[ÐU(ELtst1Ít&E u atE\$|$$[ 4$ ډ$$$$ĬÐt&E\$|$$踛 4$| ډ\$,t$0|$4l$8<ÐUW1V1S1ۃfUWVSD$;U$E菜 M $ E&a@Bn-D$;ED$ T$D$$ B&a҉U]EEEEEEE3C{S D$)D$ itt$T$D.EUiKcD$D$ ʉllhhL$$-D$D$ EUi$<|$-EU0EU9U&UEMD$T$$UD$ EL$D$T$UD$D$R_aT$ U$a&aEEۉE ]1K(MSD$D$ EEiUʉUMEUL$$,D$$T$(CS +EUD$D$ i$T$,D$D$T$ D$CiK0D$D$ ʉUMEUL$$j,Mt$D$c_a $D$ T$HE95&aED$ D$H$D$^?-]D$ D$ \$$0?Ep`Hh(xP$UM{ UMT$UL$ MD$ t$T$ $|$|$D$`aM ]Ë+]1U M\$L$$( ډMEU $ܘ EUe[^_] au._aT11D$D$ _aED$jaD$@$ ac- E au[}R1t& atD$D$ p^aEEEEEED$D$ x_aD$jaD$@$ a, x'S\$$0% D$^aD$$[Ðt&UWVSEȉ$S Uȉ$袗 Mȉ $l著 ~UfEfEuEx:aaEE@E>aaEBaaFaa1EEET$D$$< l\$/EƅsMD$L$D$ED$ D$\$$ < f;wuD$t$D$D$D$n`aC$ uȋCp@$M t4$D$ D$tC4$D$& D$`afE4$;4$[ EE@EETpa%t 2a:Gu u1t $^ t$TQL$\$$\ ,$1X L$\$$%^ 또WVSP5$|$0VNF4L$4(<$1$pa0F\F<FDFXF8F@F0$7 D$4NI@VFfF1! aD$D$D$`xaD$ paD$waD$@$ a1ۋFVF1ۋFVF1ۋFVFsf1D$D$Qt&fF1DvLD$P\$ t<\D$@T$DEL$lT$lE$@|$h$$D$D$@T$ $|$L$$$D$,qaT$+T$hL$$8T$$HL$$T$ =@L$@ȃ>&U 9uT$@L$D>|$TD$bpa|$ET$8L$<Љ$迒T$8L$<D$@T$@|$DL$D$4T$L|$`$@$LD$H$<T$d$H$8$D>L$X2$!$DŽ$DŽ$DŽ$DŽ$q$ &a5h&a$ 0$$ED$$D$  $D$D$ ,D$D$<$U $XD$D$ D$D$<$ $xD$D$ D$D$<$t $8D$D$ D$D$<$É<$(< $D$ D$ D$$> $D$ D$0D$$  $$pD$D$ $i$tD$xʉT$|T$xL$|$L$`i$lD$D$ Nj$hʉT$|L$|D$xT$xL$$$1҉$ &aË$$$1҉$$D$$ !%tDJDы$+$@$$$T$h$D$XD$TD$dT$`Mb⋄$D$P\$H|$D$+$\$@|$؉tECe[^_]Éf\tE$<׉I{a14jfUWVSlu}̉<$I H$& D /C L$S t&fft<$p e[^_]ÍfExf\7t&UWVSHt$P$ 7D ۮC t$'K fft]u}] a sa1 at‰|$\$t$D$ 0}aD$}aD$$ aѩN au3 sa a]1u}]D$1D$D$}aD$ }aD$}aD$@$ aA, sat&D$D$D$}aD$ }aD$}aD$@$ a au& sa11D$D$D$}aD$ }aD$}aD$@$ atfUVSӃ H azVCC CTC F SC ډ  aU sae[^]ÉD$D$ T}aD$`~aD$@$ a觧ډμVCC CTщC F u FX$1҉$1;FVCS 3&$`}aC€@St @@S tS12S'K1e[^]ÁK1e[^]ÁK1e[^]ÁK1e[^]ÁK 1e[^]ÁK`1e[^]D$D$5D$`~aD$ }aD$}aD$@$ aajU1҉E&'US]$N a[]ÐUS]a1t$hD$$҉pt[]ÍUWVSE$ U$ D$$ÍED$ukX$賨D$4$ljD$D$~a$[Eą1]X9uGtOHD$_%$L$@O@U\$ D$TaL$ډKHuC 9|[^_]Ð& a\$\$ t$t$$|$|$(uL|$t$$lzNj$8wMt 踔\$t$|$D$ aD$aD$@$ a|뎋$F롐&UWVS˃,|$@D$u1v)D$$lZ H)9sTfxtY)׉tGى<$TD$uD$$)Z H)9sfxut&D$D$,[^_]Åt捶t$t$ \$4$xt؋t$\$Ðt&4$y?auf=atUt<dž\$t$Ít&t$COt(amA뗡aamatL S(`at/t؃([ÍD$D$$ND\$١`a!t/T$T$ D$D$$'Nt8랐D$D$ HaD$D$$Mk\$b&UWVSLɉEȉMQEԃۆ\$}E~uEԿaEЍ4tN12<%thD;;u|Eȉٺ$轪Ẽe[^_]ËEEEԃ}t Mԅ1뺐:@u1밍&FEЋE9E}xfEED2ED2UD$EED$E$+ Uff\tf/uuЈD;;u 4f%tf:tօt(EE̍e[^_]É$U UĉE<.t<@uЃ}tt&ă}t}uz.u낍v'S\$${t3C$藂C$\LCC C [C C [ÍS(\$4{trC$7C$Ku< at,\$D$D$ aD$aD$$ a蠈1([ø(a=뮍v1맍 yt&t$t$$\$\$ D$D$a$o u)ǃt$$t$\$ \$D$D$a$! uǃ밍&UWVSl$l$\T$HL$@D$LD$GDŽ$\D$?C̀ඃC.1$l$p$t$x|Ít&KI@1fCȋ-$Tt($X1ҋL$<$1誛C,C(돋$X1ҋL$<$1C,C(g$XC,C(&'UWVS\}\$/ aEHu$ǃp!!ǃtsh/pro@c/re@gist@ ry/H@KEY_@CLAS@SES_@ROOT@ (aW%(a9%1fD$D$D$aD$ aD$@aD$@$ apUM$ $t&E1ҋM$1fUM$ ataD$aD$@$ a[hlpD$g~t& 70 aD$D$ aD$aD$$ ai[ aD$D$D$aD$ aD$@aD$@$ a [ aDŽ$DŽ$DŽ$ $D$ PaD$aD$@D$$$ aD$$D$ZL$\D$fvD$fD$f$nt&DŽ$Z11;& at$D$ $aD$aD$$ aZ$aJTED$@vD$ aD$aD$$ aYD$XD$OD$XD$OvD$XD$OD$X@BD$OD$XD$OD$XD$OD$XKD$OD$XD$OD$X D$OD$XXD$OtD$X`D$ObD$X,D$OPD$XD$O>D$X%&D$O,D$D$ aD$aD$$ aX aD$D$"&'\t$Pt$`\$L\$d|$Tl$X4$T$$T$$cu\$Lt$P|$Tl$X\1 D$(=q=U=` =@B=C$ C( fD$6<< ac sa;&==t&=%=Ku?C$C(et&=> == a距 sa=XVn!=,uC$C(<<K0|$8lD$7<S<uKl$,# D$-t t |$9E׈S|$:E׈ST$,f0f 0< @u>KF <t7lQS!hC auA1pF <uɋlQKS!hC1 a6lD$hD$ aD$aD$@D$$ aU1v K@-KK@&Kt&K `&KP&D$D$ ՍaD$aD$$ aT aD$D$1D$aD$ aD$@aD$@$ a|$t$HD$D$ <aD$aD$D$$ a=FvHD$ aD$aD$D$$ aFQ8"aD$HD$ aD$aD$D$$ aE&',t$ t$4\$\$0|$$|$8l$(u91u_1\$t$ |$$l$(,Í&$D$$Rǃtt;1$D$$Qǃtsh1$D$$Qǃt/$D$$]Qt&ǃt1Jut&$aк$a뺸$ap$aU&'WVSP|$`\$dt$h<$T$4T$T$LT$$P .Tj'TpTTt$\$<$"f at8D$D$,t$\$D$ daD$aD$$ aCD$,P[^_ÁT,TTuD$D$<$p(Tf@F at\$ t$$|$(,Í&'\D$d\$L\$`t$Pt$h|$Tl$Xt*t$D$$~\$Lt$P|$Tl$X\Íiaa@S$@D$/l$/:L$/l$<! D$T$${1uD$$Gp $J att$D$ aD$aD$@$ a[=1 t&@ f@@u"@S$D$/@S$ȉL$<@8u T$E UWVSL$t$`$df~ftftn attd$Ta舿 Ƌ$t$D$ D$$$D$?t$$C $D${[^Ðf,|$8\$$D$4t$(\$0uUtA$Ta Ƌ$D$ D$t$$J\$$t$(,Ít&D$D$$,{D$됐t&S\$C  ǃǃǃ[Ít&T$D$ppttxx||Ð&'Lh!at$@t$Pl$Hl$T\$<|$DD$D$$R8h!atB8pD$,L$,|$,tdžpCCC |D$xD$tD$ p,$D$aD$\$1ҋT$$$T$\$\t$`|$dЋl$hlÍD$$j!xT$$ ׉x#|$ttT$8P$$D$$t@ D$$!>1҃u2D$tt uf'!A&HuHHH@멉 $cH$&'DD$$~91ҋ|$t#x>>UWVS1ۃLt$`|$dD$hud1ҨƒT$(l$,$ow 9}]|$$D$$D$Ng ,$Bw 1҃D1$,$0$4$8<ÉD$롐t&$D\$l$$f 1뵍vs=&'t ޙa5f1 󫋃hfD$(tt$='뵻l$9NÉD$$D$jf D$L$<$P$@$D|$8$H$XDŽ$,$$,T$|$$= utht~E$,9|?$T\$|$$e 1]$<$@$D$HLÉD$$T|$${e ]뿸ҙa묍$ljD$$D$,nL$,1D$,tffDŽ$t$T$(D$kD$v T$(}$T$(t 9LljD$$D$$T$d T$($t 1҃DED$,lO&UWVS$$6$T$XD$t$D$x1r$D$dt$Xt1D$\D$tD$`$D$O$$D$pt#l#<$]u D$pD$O t$H1$D$H<$L$D$t;u2=8'~v$>fl$XlD$dL$`D$<L$D<$T$\L$DT$T$pT$T$|T$ T$4ElhF}'}]MlMUEMU$MUMT$ỦT$UT$ UD$ D$|$T$L$$$EÀ}1MUuFۉ}EFEĉFiaa=VẺF؍e[^_]Ðt&t:9v )lj:B)뙍vEUEn=3'^U= a$MUD$D$ L$T$$׃MU} $UUM̉L$MD$D$L$ T$|$$>1=J'EFEĉFiaa=v2ẺF*Uڅy$='bęaRbU$ED$EE׉fEofEkCE؊ESEEOEEQEE"D$ D$D$D$ aD$ D$D$ȉ$$uęaMfęa:UWVS$ $$<,b$$D$ $$l$X4$D$D$l$D$9$$$$$1$DŽ$D$HD$@$T$LD$Dl$T$@D$ D$l$T$T$DD$T$$T$ $T$$5$$D$Hlu;$f|$HE:[^_]Ív$T$@D$ D$l$T$T$DD$T$$T$ $T$$$t=3't4$D$HlM9$9D$T$<$t`$D$LD$"$D$T$4 Eċ49   ;EDž4 $Nu+ia4 8q<4 8n.e[^_]ÃlMh@WGMuUЋUẼ E,36t&S=3'$$bH3' Eċ 49<$,MD$D$|$ T$L$$AƅTE$l4{vUu$t$,D$ D$T$U؉t$|$ D$T$$$nD$$`$3D$D$"$3lEċUMȋu($t$D$ T$,L$(D$|$ T$L$$$E$l 4 Eċ4;v }4EP+4U܋E9U$e[^_]Ãl atD$0$ D$$虞_D$4qv at at|D$ `aD$t$$,tD$ gaD$t$$+\$t$Ð&'SӃ(TwduCPCT([ atD$X|$$D$=Ƌ|$j atkK <;9OpWpt-ɉOpBBk@|ǀ asqt$D$aD$ jaD$ aD$@$ aq<%JD$DD$$D$CCK 9w?nk<;Wp3BB9&'WVS t$8\$0|$41C,1Cl@t$<$D$ =VCuqC1C CDpDxDtD|DŽ=uCpCxCtC|ǃiSJpBpAAA ǂt  au#C [^_Ã1C,  D$D$!aD$ jaD$ aD$@$ a襯뫐fUWVS<\$PD$\l$Tt$X{D$/1Cw 1Cl@ǐ|$t$,$踼 =VCuqC1C CDpDxDtD|DŽ=uCpCxCtC|ǃrw$0a1҅‰St  au C<[^_]ÉD$D$'aD$ jaD$ aD$@$ atÅu|$/҃kSJpBpAAA ǂmC1C CfDpDxDtD|DŽuD$l$$dCBUWVSL|$d\$`l$pD$<<$=X{W{C1D$/CD|D$Sl T$>  L$> T$> @ω  ⿉ SlS0t D$Ht D$JnD$K_T$KVt$$V T$/:T$JFL$?:L$K7&'d$ $($$ $$,-1$ $$DŽ$T$ T$  $$D$$$蘼¸u#mtOmH@m@FL$ d$ $$$Á~Wtf?"FWWBfv#f tf tftf Wu~~VD$D$,$誗 t4 at$D$ (aD$aD$@$ aFf"]$Pa$ܢaF1D$ D$l$4$FD$D$ D$l$4$FGD$l$4$D$ FD$G؉D$ D$l$4$`FTD$GӋGl$4$D$F,D$ D$l$4$F GFF0@4D$GD$l$4$D$ FF0G;FH~;F$;F D$l$4$qFhFRfRXGl$4$D$F=D$l$4$F!D$ D$l$4$IFD$ D$l$4$%FD$ D$l$4$FGD$l$4$D$ .FFlF0D$D$ D$l$4$[FOD$GD$ D$l$4$0F$D$G؉D$ F0KD$D$ D$l$4$D$ D$l$4$FGl$4$D$UFGl$4$D$F~D$G؉D$ D$l$4$]FQD$GD$G؉D$ D$GD$ |$l$4$FD$ D$l$4$ĿF D$D$ yD$ D$l$4$聿D$G+F F-L\$<\$Pt$@t$$|$D|$Tl$Hl$X|D$,D$ D$D$$daD$(t$$ rD:=a :\$1Kt&d-1cD$ D$v au, sa # D$ D$D$aD$ aD$aD$@$ a_떉ag7|$iv atl@D@@@HËlBB.BB B$B(lB/lB0lB1lB2lB3lB4lB5lB6lB7lB8lB9lB:lB;lB<lB=lB>al H@D@@Pt&Í&'D$l@fUWVS$$$Ƅ$DŽ$DŽ$DŽ$DŽ$DŽ$D$^D$4%D$|$1$D$8$D$4tq11D$/9$vP$\0 <tۋE9(uЋE9 u9atO1ɉ؍T$49$w|$/u$$&_[^_]áa1ɍT$4kԃ$D$/\< a\$,\$@t$0t$D|$4l$8la9$^D$$4ttQ\$,t$0|$4l$8<Ël1zrt5 aD$$1뷍vd-1[z ata(F sa\$4t$8<Ívla\$T$ T$$T$(D$ PaD$aD$D$$ aka( 9$tT a\D$D$D$aD$ !aD$aD$@$ a{ku lǀ(D$t$$2%1 atL$,1D$,L$,xM1 av\$|$D$ aD$aD$$ a!d\$0t$4|$8<ÿ au\$0t$4|$8<Ð&'S( aD$4tQPLtXZP$\$D$aD$aD$ aD$aD$D$$ a~c1([Í&XP릐v'S( aD$0tQPLtOZP$\$D$aD$aD$ aD$aD$D$$ ab([ËXP믍t&,\$ \$0t$$|$(mSL9l5a9> atJrP$t$D$aD$aD$ aD$aD$D$$ a>b\$ t$$|$(,Ë au\$ t$$|$(,Ë뻐S(\$0D$ D$D$a$pD$8D$ D$8D$D$D$4D$$mu  au'$D$D$at([Í&D$ )aD$aD$D$$ aaUWVSLt$`l$d|$hlPT$P T$P$T$P(T$ P,T$$P0T$(P4T$,P8T$0P0a; a//Tʼn$8T$D$D$D$T$ D$l,$D$S a4av$0u*vtPw$RuĬ[^_]ÿaRt?)4ap at|$ D$aD$$ aHrf atP$$PD$\a<$D$ `a D$ a$D$$lD$ $<$aD$D$ D$D$R$l$p$$t$ta$;NQD$ aD$aD$$ aDD$ İaD$aD$$ axD|$D$ aD$aD$$ aKDD$lD$ @aD$aD$D$$ aD at?$D$lD$ paD$aD$D$$ aC$$&'VSD\$TD$8D$D$TvCTf@tcT|$\$4$3\$ t$$|$(,ÍvTűlPL@HW1\$ t$$|$(,ËD$D$$fD$1\$ t$$|$(,Í|$4$\$ t$$|$(,Ð4$1\$ t$$|$(,Ð|1\$ t$$|$(,Ílf9BHt'_JHZLD$B؉$Q1O1f9JJuD$D$$a-VfSD$ \$$$\$ D$$[FUWVSLu a] }|$\$4$a t*l;At(4$UP 9ETcvsTf@unED$4$.E1 at.\$t$D$ aD$aD$$ a?e[^_]Í4|$\$4$蟛e[^_]Í&\$D$ aD$aD$$ a?vl@( at_@D$+D$a$D$l@D$a D$ ıaD$aD$D$$ a?$T4$= a$1&4$|$ aD$ D$ D$a4$plTXPǀtmPHHLPTHXlPTHXOPTHXPHHL4$D$ D$atl a f9PHOPTHXlOPHHLD$@؉$¥4$D$ D$atld at8t$D$$D$aD$ aD$aD$@$ aP=; sa20Wf9PJ6bt& at7;T$8[D$>D$?DŽ$XW$\t$Gl@($蚕oT$89T$0L$8UM1҃xT$(L$,$P$P$Tl@(tD$4D$8P6@=T$8D$4 T$4kD$4dE$l$D$ aD$aD$D$$ aD$~9)D$01ҹU^v=D$0=1 aD$0L$0a`$l$p$t$x|ËD$0 auKa`븍va`fD$0 aT$0\$0 atl$D$D$ aT$D$aD$$ aD8f>1&==t$ aT$0\$0y a6L$0u$ i = a$> k\$0x atD$ `aD$aD$$ aN7$11&D$$D$ @aD$aD$$ a7|$0D$$u4aI[D$$|$D$ aD$aD$$ a6D$$t&1D$0T$8DŽ$XD$>D$? aT$$$T$$$XD$L$ T$T$HT$$@> a$1DŽ$\x$?(D$ aD$aD$$ a5D$?D$ aD$aD$$ a5$`$\$\L$$$X)T$0|$?D$HT$,$T$$D$ T$$L$4T$T$$D$ زaL$D$aD$$ aT4T$$D$ aD$aD$$ a'4 $F$\D$0u1"ڃT$D$m$aHM a\$0D$ aD$aD$$ a3t$@S$\a`o|$>Wv' D$P09P,vlB(u l Ít&UWVSL$`$h$d$1t#t]t ǃv at0D$D$$D$ iaD$aD$$ a2D$$L[^_]ËlD$,$<l$(B l$(  CDŽ$<|$$+~v$<B$ l@)uvtr$ByedaD$ $;tM$u|$$u@;1m4as1t&d-1Pu auCNx sarfT$,l$,D$D$D$aD$ aD$aD$@$ a0|$L$;D$|$ l$L$$;6 aal@)ǀ $ll$(t l~@ $<L$ $( $ $ D$(aNfVS\$ t$$$kmKǃpǃtǃxCX% aǃ|ǃǃǃǃǃǃxgPt$D$$]:CX`a8t/dev@/ptmf@x[^É$uP\$ D$$[^7:Í&'D$@ Ð&D$T$ H P ËD$@ H 1Ð1ÐÍv'W1 BB(_Í&'\$\$ t$Ɖ|$׉$Ax+u&VXt0t+CCS\$t$|$CCӐt&T$ D$$J% D$D$$RÍv'Sa\$t1[Í&f=at&ht1ǃh[ÍaALaMat랍VS\$ t$$D$($t$D$&u1p^phhL$$T$pt 1[^Ít&S\$h atǃh\$[%\$[%&'S\$ $؃[t&, at$0D$F U@MDT$8L$<a8H1L$$T$VL$$$D$FfWT$L_w fD$HWT$uʋ\$8t$ $p X$$)؉T$09щL$4 9D$0z a Q$ sa&18D$F ff@@@ @@@@@ f@$@(@,@0@4$_?RD$8L$@aT$4PT$4'f$dT$D$8T$4t$|$ L$\$D$ kaD$aD$$ ayT$4D$8E$ T$fDŽ$ D$,$af$ uX1JfDŽ$  "T$$L$)9B}EtjEUT$|$ t$t$$ aujE99wUԋ2u aee[^_]ËEUT$|$ t$t$$ atUȉD$ Eĉ\$T$UD$ aD$aD$@T$U$ aT$萻EąO$aű}pEaRD$ EӉ\$|$T$$at$D$ |aD$aD$D$$ aED$$ atMt$+chilFd %dF - Ẻ4$D$ 4${ , er@rno f@%d@ EԉD$EЉt$ D$aD$D$$ a auug sa20>Ta auy sa E܉$ @aYt$D$yD$aD$ aD$aD$@$ a6\D$ D$ND$aD$ aD$aD$@$ aF auu $zEԉD$ED$ 8aD$aD$D$$ a蘫D$ aD$aD$$ ajt&U at$D$ iaD$aD$@$ a-UERPB UStt&X$蕭ۉu[]É'UVSÃt1$ 9BuF[^]É'U8]Éu}@$AYUM$褭UMtX@XGLGHL$MT$$ MGLCfO*G fGBGfGDGG_P]u}]ÐUM$UMƉt΍~X~HL$FLT$$ FLMC^P}fN*]F FfFBfFDFFu]Ð&UWVSӁuVrH tVCt$$LF%=@=/=tUĜ[^_]à uuCt$$?Vu/V@tj tu C 1Ĝ [^_]u 8Ct$$U{ ō&N~ SLEC8FK0{4tfC<:.tfSfz>yfRfz>x&r4B011 uE;B8ut& r.utzrv t&'U]Éu1}}uFxQEUMD$<$2PUMtp# U U]u}]ËE D$D$U$M1xōED$$OUMuE9t tR3U3E u܉$!VU$:n UXt&UWVSÃ,u92|tt Iut$$D$ aD$U ;utΉ0^uU@,[^_]ÍF(D$UM܉$莪UM܅bUWVSlUEċ@$"Ed}F$EE}Ek}a]EEMQ(A|/E)F$tF/EFUEE)ЋUĉEEEB>E&EЉ$_$ F$ E8.ډM9M/FMVE=FW$F [ 8$ƦEEЉ$SUfB@N$ 81l[^_]fUЉ$5MċUċ~$D$80$4EEnEfHBy EEHG%=.MډeE9EEE=XUfS>MCEfEfC(tHUȅEUfC@ CC BCE̅UԃE]ԉZt&MȅtkUt G <tuXF$SLS1ɉ,MȅfC@~PfvfumUCteMԉYE]F$CfC@ CCE̅t/EԃE]ԉXXMċ}fC@ ACCuщ]뜍$UD$衦UFt}9tF$EtEEMEV)=UMfK>x}̋CLfC@ CCtMԃE]ԉYFP [E 8$ECMЉ $Ef@@N$ 8Et&CUCC*D$CL$D$ F$Pt&EEEEEUЉ$EtSFVtH;HLt +H HP@uEfx>x$H;HLt +H HHPtqfx>yF$t}؅tM9NumE]t%M؅t}u#Ufz>F$/U؅S}EH늍& 8t&$xEEЉ$UfB@N$ [E뛐MċI89NhUčF,D$B$́!MċA8Fh1fy<FltUEEPE0E1E4$ EU܉ÉPUf@>@LCB$ډffC@MUE4C]uE1ɺaU B$Xf@@ y4t&$xf~>x!pup$]f~>y卶4$HCtCt$-C$"C$uC$quC$b.$1[^]Ð+ 0C$>.t؉$Ҝ 0΍U8}}]uu]1u}]ËG$SDfCD}f{@se$Mf~>FDftfCVOB(R|//V*T$VL$T$ 7؋]u}]S@JfUfe@tAW 9S8t9CB%Gt GfC@f1ۉ띃uʍvWffGsK8S0$t$!X_GsOF(v€|/uލP/C*D$CL $D$ ؉ &s$f~>F(Wf~>G$~ fF@؉7fG$uG$ F*fF(D$FLD$G$V ^LD$/$S t89H $M M$L$@UD$ UfV*GFFF87G 1ɉfC@G$ffF@afFDFBG$uF$$F$$*C$$*^ffC@qG$gD$D$$a*!C$6fKB6G$fGG?, fKBC _ؐt&PRP@uu{jVG$D$a$J80S1ہO$~G$D$D$$a5 F$fNBdG$c렉4$1L  4 fC@C  F$$0) 1ہO$G%E؉ fF@F UEwU fBD1Í& Í&'U8}} ]]ut#tj 1]u}]Ðt&UF UC%uB@f u!B]u}]1]u}]1fuCt UUt'fz>uB8/tC$tʉ'ƉC륁K$ΉM1D$D$$aBMjʉC<$N<$'s>&UE]@(Ðt&UE]@PÐt&UU EP(]ÐUWVS,E} ED$EED$$t:4$fx@ v- 84$tt 8,[^_]P@$af,[^_]ÐT$PHT$@$ׅt뛺޺f1G \r&D$믍1TUWVSMU)‰+EUE}҉t}EӉ؅u)ۉE~OEÉE]ܐE~0U1+E4>];U<[^_]áata닋5aڃ:5ate-M܉\$ $ tW}P@<;<:>6a*e>uaatE܀8:t\$$a4za?-5a~a aaawt&P@M>v 15a a4"a>54"aaa >uja9EaM=aaatU܀::tD$W$ a=yM1aW9:Í\:UaM U܋ED$ $MWM4"aOUEU ME EEUS]U EM] ]E][]SvUS]U EM] ]E][]#UWVSÃ,EE*ED$4$D$R tS t) 9s΃,[^_]Ð,1[^_]ÍUWVSӃ<9ʉMs:u3S}ƒ?4 u*UB Bt_׃E9]wΉ FGt&[ tw* u>9]ԉt$}ډoF u1<[^_]Í=8"acE@EEH3u1 hÍvEU@RE܉U tsE! ҉U3EE3u3E tmM֋U%4]  Sƒ-4 u=8"atBU܉$= ƋE$= t$$~P~Z SE늍&U܋ET$$NP~*sUbU9U}Y=8"augsE܉t$$POEЉExf}G$< 1ɉ4$MȉE< 11ɉ&sEC$< ƋE܉$< 녍<[^_]ÍvUEU EU D t&UPd Eu]Ӊ}Ϲ @iaaNUED$4$EuЋ}C Es@{DCECEfCECECEC EC(‹ES,UĉC0EȉS4ỦC8CXE؉S\G@ )9n>\tDžDžU؍ET$ D$t$$S Pv{'UƉWDžDž@릍&EGt&UML[^_]Ít&@t&L[^_]UWVS}Gt?7Wt'$dqtuuG$EqG[^_]ÐUSaU EҺaD f8\u\$$ u[]f[]Ð{aU]aÐ L9"a@9"a@9"aD$иlaB19x9"a[Ív1[ËL9"a@9"aʍt&'UWVS|u8`a!!}$U|$D$ D$D$nU=#tNyJ aEt/D$ED$ \aD$aD$@D$$ a^Ee[^_]ËMAZ\$+|$L$ \$D$$UnExEEE;t1v99;DtޅtډD$$oɡ`a!EEEEEE$E|$$t6`a!~&11M!u/9tb09!E뜋DaHEt͉D$ $ou`a09!EQMta9uʋU9U} GMU EM9Mrj atMD$8D$8> atFT$p\$D$ aD$ D$tT$D$aD$D$D$8$ aD$W|$LD$Ht,D$8\[^_]Ã09\$D2t$MZuЋF<8PEufxtPxtRUP @UȉEt1;]sUȍẺ<$D$) u֋EU̍<OfEEX1UD$aaUD$ EЉ$D$?EE3}ĉL43uEEC}a"E$WNPU|$D$aaUD$ $}MX}ԅE11E=U$MUPED$D$9F1D$E$D$ OEbEĉEi&UWVSL$ah$ֲ k=\$t$$ EED$D$a$j t&!DžCCC CDžƅDž@DžPDžXEEEE$4$&MDfD %k<D$D$4$xM$It;4$MED$D$a$P e[^_]úao $0|$$$aD$uUS`aD"tSP[u[]ÐUWVS1ۃ(E qaM܋uD3MuMЉM؉uԍ10E 1ɍX҉]x>u\}MҍLҍX]y1ۄuD1ۅE+EЃ} tkE ͉]}D΃tJɿ &J @vZȀ#1ۃ([^_]ÃXtxfE1EwE 7wEU U yEU .uu>LE9E@U؍F V]D #EpPUED$E$¸EEÐUWVS$qaUMMԉME܍v1 <0uL}]\JM؄u…<.u9uE1 U؉E<0Rff?}uDuGtd<.umwXE9EsPMMHȀv8\AaE)ˍ\ ϸ$[^_]ÄtMиDtu+Mԉw1t1\ 9u뭐U<"a$:IUT$$^t&U8E ]u}r't*t&]u}] XatPۀ=<"at"dU-19v?c#d ul&a@ud@농$ELa1}XaYLH<"a<"aCv=<"a3;"atX aɋt9at1ҍv@a;"au<"a\$$Gfd9 a1t&09v,9u)<;"aD$$W;"akDUH]]}} u`a; ""4F @ aU9U4$Us`a"fVtfT$|$$Qx aN|$\$D$D$ aD$aD$$ aEz8V JҋE@4$ERE]u}] au)/ sa ]u}]D$ D$D$aD$ aD$@aD$@$ a7뙉U|$\$D$ aD$aD$@$ a7`a"$U`a"T$|$$Qx aV J]u}]ÉT$D$${lT$$脘Ut+7T$D$$= at2T$D$$ UED$E]u}$LuTM1]ȁ% 1NjE ыU%Ӂ? ]u}]ÐUWVSl]u ESf1;}܉D$<$EE}?E}EEȋCD$EED$1D$ EĉD$E$F=@$>E1U܁$UD$'EE>U}ЉE1ۉUtCEEED$D$1D$ EĉD$E$TFxD1=@t4$4>Ee[^_]t&E1E}yʼn$!D$=1빍&US$Mt_$Tt'E\$ D$E D$E$]$|=1]1뽍UVS@M ]Eul1҅uD$4$CEc=E@E؍EԉD$EuEE\$$D xWEe[^] t*uD$4$GCE<EBEE1EU{$B$<1뒍v'US$Mt_$St E \$D$E$] $<1] &1뽍UWVS\]u ESf1+}܁D$<$&BE;E}EEȋCt$ D$EԍEĉD$E$C=@$=;Ef1U܁$UD$AE?;U}ЉE1ۉUtCEԍEāD$EEt$ D$$dBxA1=@t1$:Ee[^_] t&E1E}녺ȉ$@$a:1뼍v'US$Mt_$Pt E \$D$E$] $91] &1뽍UVS@M ]Eul1҅uD$4$"@E9E@E؍EԉD$EuEE\$$A xWEe[^] t*uD$4$?Eh9EBEE1EU{$$?$81뒍v'US$Mt_$Ot E \$D$E$] $81] &1뽍UWVSl]u }EK0҅*U܉$UD$>EH8UEEỦEȋC|$t$ D$EԍEĉD$E$?=@$7E1҅M܉ $UMD$=E7UMUЉE1ۉMtCEԍEĉD$EE|$t$ D$$O?x=1=@t-$7Ee[^_]E1EU닺̉$=$61'US$Mt_$fMt'E\$ D$E D$E$]$\61]1뽍UVS@u ]Eul1҅uD$4$<EC6E@E؍EԉD$EuEE\$$> xWEe[^] t*uD$4$'<E5EBEE1EU{$;$a51뒍v'US$Mt_$Kt E \$D$E$] $41] &1뽍UWVS|uE]} UUЉEԉU1 ؉EU%]ۃ؃E؅GEEEEUMD$E܉$:E^4 UEMEEE܉EGE}EEEEL$T$ \$D$ED$ED$E$;81=@ $3Ee[^_]vEEEu܉UM4$D$9E3UMEE E1utG EE%}EL$T$ \$D$ED$ED$E$;xa=@t:$2Ee[^_]E1EEE]vEt&$8$]21랍US4Mto$Ht5E\$D$ED$ ED$E D$E$$]$11]f1뭍UVS@U ]Eul1҅uD$4$8E1E@E؍EԉD$EuEE\$$8 xWEe[^] t*uD$4$7EX1EBEE1EU{$7$01뒍v'US$Mt_$vGt E \$D$E$] $s01] &1뽐 a a@ a@ a@ a@ a@ a@ a@ UWVSH<"aaaaa$<"a <"aE~F1C"a11ҋxnjW"a<aɿEt[tW;Uuщ5$<"a <"aD<"a~.1B"aC"aJRŒW"a9؉auՃ[^_]ËX;Uq랍&Ut ʃ0 w]À,t+t-ttʃ0 vfU $t$|$t-sЃ w114ts;u#{Ѓ v9|2$t$|$]1$t$|$]Í&'U1ɉuu]Ӊ$otiU8:t ]u]Ã1ɉ$;@tkU<8:uԃ1ɉ$<tU붍vU$Ӊt$-t+t8]$t$]fAtt$t$]Ã1ݐt&USӃJMt҃0 vk1[]ÍvS $ ctր8.uσS$Ct8.u1ɍS$&t&S1$m x8/t+C gS$mȃS[]1UWVSӃEu#غQE)kd9tGt]tht1EA[^_]fQBiQNjEtٍQ<M)‹iҐ9ƒ҉UuiAQ룐t&q FEHE]¸at&i:Q9u]]~ *)R)1Q)Ékֺgfff)ƃkd)ÉC)ۍTH~Iލ$Isq))Љ)…ҍBHЋA)ЅPHƒ~8U<}<a9~< t&S9} Ӄ9UiÀQEQ[^_]É}ۍt&'US 9ˉ1[]Ðt&U t$։|$lj$x%ډȉ‰|$)ˉ$t$]롐ЉՐUWVSÁEUuMU EC҉ECEċC EȋCE̋CEЋCEԋCE؋C Et%U<@t Č[^_]Í}Ĺ<tČ[^_]ÍEȹt 봍U̹ EЃulEu}[Eu1ɋuȃ}Mu)ʉduʉf4au럋uȁn1Ƀ}1Mu)ʉduʉf+4aEЉutEȺEEuȋMпdȉʃEfUʋM}U1}uu }‰ցk ΋4a9}) ~kEȺEЉM̍u)}E~z}E}EUEMD$ $T$UE+Eu E+EuE+EuE+EuE+EtZxC~1)E뤺qME;MmEpmgE+EuE܅;E}'a ["a@<"aEFEkP}>}9:^kPxnE9t_EG+BUMEED$ED$E$UE9EUMu(E9Eu E9EuE9EuE9EuE9Et뎃m]E9EuEˉEUEM9ƒ8ʉE/UME\$ $T$U}}Uhuu]É}ωUD$4$gt]u}]Ít&UD$4$9uҋUD$4$EċCmEȋCE̋C EЋCEԋCE؋CE܋CEC EEɉrMYv'UWVSÃLx UԉM~@ MЍEUԉ$MuK yL[^_]E@<"a ["a}Ԁ'aDEȋPEȸUx΍UȍPE̋E̋9upMȋyxeP9tlM̋F+AMЉ1ҋUC E$RUfŰB1+F{ ƒS ymmxK ut&xS 냸'UWVSPX/E` ۋO<:T4fuϋ44)؃,E4fuϋ4+04Ef~\$D$$@z"a$z"au e[^_]É4$D$r |$D$aƉ$L }f4$D$q |$D$aƉ$L >f4$D$q D$aƉ1)lj|$4$\L f}D$a$r $at 4D$<$%q t$D$a$L |@<"af4$D$p D$aƉ1)lj|$4$K 0&0D$a$:r $as 0UaTaS:;$aԔ$z"a~D$D$$@z"au t_$ls =ve$z"a;u}@<"aD<"aC"aC"aD$a$W"ajq eTa[]6;$z"aD$\$$@z"a~r ;t@<"at;:u7@<"a*Ta[]:=$z"at"x1ɺ@<"aot뵉'UED$z"aD$$z"aÍvUS] aED$\$$؃[]fUED$z"aD$$z"aÐ&US] ED$\$$؃[]Í&UE D$z"aD$E$z"aÉ'UE$EvO UHEԉD$E$U T$$yO Í&US]Q1ɺ'a[]&'UE@ 뽍'U1ɉE0(a@ SvU0(aEM @ 2fUS]@<"ax9ՌY"aՐY"a)É[]1)É[]UWVS ]5@<"a&;ŌY"a|ŐY"a؉v;ՌY"a|ՐY"a)9|B~rHxs; ՌY"a|ՐY"a)9߉~Iؐt&ՐY"a)9߉}/ȉHxv; ՌY"a}׃y1҉)9߉|׍9D [^_]Ív11nt&1BUWVS,}E] 0439s.}u]9v\$4$Uu,[^_]É}E|$4$D$_ E,[^_]ÐUWVSE}] 01439r9vE\$$Uu؃[^_]Ã1[^_]ÐS( a\$0u?at&a5 (a[6f<a\$0([D$,\$D$ @aD$faD$D$ $ a돍&',a\$$\$0t$(@{"au"$8a au9\$$t$(,úa5%Ƹa5 atNjD$,t$\$D$ SaD$D$QaD$ $ a\$$t$(,Í&', a\$ \$0t$$t$4|$(u/t$$@a auD\$ t$$|$(,Ðt&aQ4Ǹa 5 atD$,|$t$\$D$D$ kaD$4aD$ $ aK낉'S(\$0D$4$D$(t([Åt$D$D$([Í,|$(=a\$ \$0t$$t$4u/t$$da auD\$ t$$|$(,Ðt&aQ3Ǹa 4 atD$,|$t$\$D$D$ aD$aD$ $ aK낉'\$ t$t$$|$|$ l$A -aFt)@ sa\$ t$|$l$Ða2T$( Ÿa53t f1t/@ sa렐t&X'S(at3a2T$4D$0øa2؃([Ít& at saXX1([Í'S(at2a0D$0øa0؃([Í& atE D$t$uD$ D$t$$;u,u܍t&;tuE D܋UD$ D$T$EԍEԉD$<$"u0C1DžDžBD*MEpL$MEt$D$ D$L$$'<EDž Dp(ƒ UM 8E@8AMQyIF90ǃDž$ 8 t $LJ$aD$'MD$t$u D$ L$t$$+Ƹ?a;ut* $`D$ D$D$aD$PE9u } 9uFut { teuF FĬ[^_]ËD$*aD$+E$]aD$t$*D$D$$D$4$D$D$L$4$fdQ/Dž.4$cDž 0ǃǃDžmD$D$$^D$@D$$xD$D$4$z_EfEEfEEED$D$4$+&DaC@{ af $蜄$aD$t $aǃDž$a${aDž> $$aD$h; $׃$CaD$7$Dž{E E} D$D$E t$ |$$zUNjMT$L$G ИD$ WGt$$ ИD$U$a{N $$OaD$J*ǃDžEU 4$D$T$N9E<$XDžMU9Nȉ<$D]DžS $$aD$u/> $$aD$DǃDžd $蚁$aD$@ $v$aD$U(E$`{"aD$ED$ E D$ED$R }"a"aÍt&UWVS,EU ]DE M9.UM U܉M9U"<.hsCUUtp9u v^MF]8uHu9.u-v@U8t]ԃ4uUt9EtU+ MDUEu܃9w .tuE+E?w-MEEM19t MUU9U,[^_]]Ԅt<.QyGM+M9Mr]؈S+E 뭋MȃyEEOEEt&UWVS\M ]u(1E,V T$UD$D$ D$$UMA@FFFfFFFFFF F F Ef BEfJBut!1ҍ1uEP@ʉiɉf)ȹf)Éۃ)ىEĉ )1Ef3uuEfP@G\[^_]ÍM1fq@ XMǁȋE@t\$$aэt&'UX]]uM}E} Cuu=ǃtit$uD$ L$|$t$$ҋ]u}]ÉD$|$$aǃuT$ L$ D$$D$D$D$D$|$D$$REt$L$T$D$ $2t&'UWVSL]} CYEMD$EL$MD$ L$|$$t L[^_]D$.<${: txtًK)SDtƉ<$6 =0|$߉ $5 Ƅ5.)E&t$T$$8 }ME$L$MD$EL$ D$L$WHtu C uƁL[^_]ËE|$$aD$SCt=MEL$MD$EL$ D$$trKu!f; ǃI$'aэvU(E$`{"aD$ED$ED$ E D$ED$ }"a"aÍ'UWVS<}] tR$5 =\$$33 3u\)ET$|$$.7 }uHE \$D$ED$ED$ ED$E$<[^_]fx.t@.땐E@u( Eǀ<[^_]$DaʐU(E$`{"aD$ED$ED$ED$ E D$ED$ }"a"aÍU(E$`{"aD$ED$ED$ E D$ED$ }"a"aÍ'U8E($`{"aD$$E$D$ E D$ED$ED$ED$ED$ E D$ED$ }"a"aÐUVuS] vH"?9w u)[^]ø[^]Ívt&'UWVS u ]}i 9s"1t?w9r-Du [^_]Áv?ڍ9w [^_]ÐÍL\$<\$Pt$@|$Dl$HuW\$1<t9wZ AD$fMډ$fEE+fE؍E؉D$ED$$x e[^_] fE1E+f 膸D$fEfEE$}'UVS u4$- \Cf]*D$ڃE$`DfEED$D$$&Mډ $6e[^]&UVS u4$ - \Cf]蚷D$ڃE$DfEED$D$$&Mډ $e[^]&VS419s2t$ D$D$ 9v(D$t$$ uٺ4[^1҃4[^Í&'UWVSÍB=L$/1dDŽ$-1 T$0T$0  $$ D$4$ue15vDžx1t|$/TugЉT$(,T$(t/Cy auN  saT$0d[^_]Ðt&롍&D$D$D$aD$ `aD$aD$@$ a蔹q at/&9ro$fE D$$  D$;p 8uNttA9׉t;&D$$@a t @09tu1Ĭ[^_]D$$a ;D$E$hD$)h$NDMC!k>)@a9>Xt)}onD$$5o aup saĬ1[^_]Ðt& atD$D$XD$aD$ aD$aD$@$ a;D$D$C& ajD$D$J뚐ED$$R/1UE%=@ at44$$E00 $P a aUME \$$T$ UL$t$(|$D$T$D$ aD$aD$$ a &at}"al}"a8L$D$D$5D$aD$ YaD$aD$@$ a譓 sa a\$D$ 3aD$aD$$ aZ؍e[^_]ûNjDD8D$ D$ T؉D!DDEL$$訜$D$D$͜U $EU\$L$M D$ (T$0t$ $M|$tpDÅtd&aU T!9D@tFD)1҉8D@ ҉<D+<v@av4W4$$}0+0 $P aB}U`aU; ""DA @ T0Dh&at}u89M u @fDA HW ;DTH@DžDDž4$MZt&Jt&; at1L[^_]ËE\$D$ @aD$aD$D$$ a薆:ED$ YaD$aD$D$$ af aD$D$|D$D$vD$aD$ YaD$aD$@$ a t&UWVS<] aKra@ay5&a1҉t, a saEuˋEt~"auƍ&~ut&?\$<$tu9u wu9u 3D$<$nu a sa @aW at(\$D$ aD$aaD$$ a覄<[^_]ËEU \$D$ laD$T$D$aaD$$ afz6 aLD$ D$^&<$UƋT$U \$T$ W 4$T$G 4$PD$ D$D$aaD$ YaD$aD$@$ a譃D$D$D$aaD$ YaD$aD$@$ al&UWVS|] au  &a1҉tm a saE at.}D$ aD$@aD$D$$ aՂ}e[^_]Ít1aٸ@a!V~"a҉UgE}܋UEE%EU]vEP2EӃEEEzt tE%}E@>D$ ED$D$E$蟋EEEU|$T$ t$D$$tCEuʋM@StM<}OD$E܍UT$ D$E$E}ja6EEvEE@a]蓺}ED$D$$誊 ;a86EED$@D$E$赊 ESEt$\$D$ aD$D$@aD$$ at+D$D$D$@aD$ YaD$aD$@$ a3@a褹M1҃tE=tuEuhuWEEEƒt } tCUT$ D$t$$uE}몸@봉D$ D$t$$!E뺍U1҉WVSL&aEuM}D$ t$|$$TU )‰E!‰U͐=tSx1 ae1[^_]Ísa3 ae[^_]Ív]U؍M܉T$L$$蚌 E܋]9]ԉ]܋U9v]؉ډU蟈UЉ\$T$$\ D$ t$|$$=j/1 aCE U\$D$ aD$T$D$aD$$ a}t&9]v É]>]ԍ]/ auh sa  atD$ D$nD$aD$ YaD$aD$@$ a3}D$ D$a U1҉H &a]]uu }D$ $T )‰EE!ʉD$EUD$耎x1 au.]1u}]ÉaA1 at0t$\$|$D$ aD$aD$$ aH|]u}]É'UWVS\u}w] u,E 19ƉEs]D$\$4$装 uT at:Et$|$D$ aD$E D$aD$$ aD${e1[^_]Í&}t&EE9EvD$\$$  u1vv'U( atdl[^_]Á  au膫 sa>D$D$ aD$aD$$ aSd atD$D$qD$aD$ aD$aD$@$ adnED$ aD$aD$D$$ acu aet$D$xD$aD$ aD$aD$@$ ac聪 sa20}Xt1E a$=d,$ $ U a]]uu }}\$]|$ t$$$iDtUuM au踩 sa20}X$E a<]u}]Ívut$E a<]u}]É|$\$t$D$ aD$RaD$$ a:b-ED$ aD$RaD$D$$ a bu a-t$D$D$RaD$ aD$aD$@$ aa$ UWVS|} au ]urd-1 E U E$辒tgd|[^_]fE\$t$|$D$ ED$ aD$ aD$D$$ a`KED$E$D$ @D${@E aEE8kEEEEE}ЉuԉEda]E@E̋EE܋EEE$At9]t1E$E a=:d|[^_] au5]ݦ sa}XEE a$9fED$ 7aD$ aD$D$$ a_] at\$D$D$ aD$ aD$aD$@$ aQ_Z$ bt&'UWVS|] au }utdE-1  UE$Nd|[^_]ËE|$t$\$D$D$ LaD$aD$$ ag^dE-1  UE$裏¸t"d|[^_]Ít&E\$]|$ t$D$$$J?tMu> au]uf蛤 sa20}Xu$ j vEtE a$7FED$ aD$aD$D$$ a-]u amt$D$D$aD$ aD$aD$@$ a\У sa20}X6E a$6U(u auBà atT$D$ aD$aD$@$ aT\fT$D$ aD$aD$@$ a"\U(d"aU ]u}i2U40i:<8<$< 4$2 )u$t$<$ u]u}]Í'U8d"aU ]u}iUUi4$ }<$ )u'|$4$R uU䋂]u}]Ív'UEU EU  t&UU SB B\19s i?9w[]ÐfUE WVS]P @t19svi?9wE;1t'9Slt'1l9t9r1[^_]1vklD[^_]Ít&U(E ]]uu}E`aƒwklzMJl]`au}]^&'UWVSÁɉ4@@@ @@@hE؍DMD$D$ t$0D$ $iEx7Et$D$$~"ap߹e[^_]ƅ/EЉD$0D$D$ D$E$5iEt Kt&MЅx/t, a41ۅ؍e[^_]Ðt&X0D$ED$D$ L$$hx\dűXC`fEfECeS ; Ct~tt Ct1Ƀul&aBf ȈC4E\$$~"aD$;t&낍ƅ/LCBEEM=af;9CЋAfUfUD$EčED$a$Ng >$Et$D$ aD$ aD$D$@$ aVS  $ //C? / ȃCS 1ɈSS  ȈCM؍E}EEE@UEED$@D$0L$ |$D$$ fDž(= ƅ/0DECD$D$ t$|$$eEJEt$D$$~"a|߹E$d؃}D$D$|a<$De S F DaUf;MD$CfEfEED$DaEčE$d ~C '%'tC S D$D$|a<$d aC Ch0D$ED$D$ @|$$MdGxaBmS7|C C1U= t fƅ/uff&J&=fUfUMĉuf0(MfUD$@D$ ED$L$|$$hczU= ef[ a1ۉWE$b؃BfE ƅ/0}(D$@D$L$ M|$D$ $bgJ&fU $T$躊C=t =QE x/ CE/{WU ET$$` CD$/$軫  EUE D$T$$ EЅ1 au Ѝe[^_]1ۋU\$U D$ aD$@aD$ET$D$@$ aD$=ډfCD$E$螬 U`a l $T$UT$~ u# U ,<\$ a`a D$ paD$@aD$@T$D$$ a@< aU $lC411ۅAt& M̋$U.Cy19iUԍBEȡ`a u /uiE@ U$U EBt9~AUE |$T$ UD$EȉT$$뎍t&U B<:1ۋE ]D$\$$ue aU |'E a@aDaCHaCLaC PaCTaCgE }a8UD$$T$ Euȋ]ċ=`a q $T$UЉT$w # MЋ t<\`a EЀ8?M/At& aE\$D$ !aD$aD$D$@$ a5LiEM}Ћ]ċuȋEt%t\t/EEuEEUM)‰iU+EE=~uE[M\$D$ !aD$aL$D$@$ aI4t&\$D$D$ >aD$aD$@$ a4\ D$E$虣 EȅMąt/iEM1t$<$EEED$~`a eu>t#4$ߤ D$Et$$ 4SaEU$衤 Mf/UU$蕎 t MЀy:t0Mt$$L$%~Ut$$T$ ~EUt$ L$D$$n&UH]] u}D$D$Za$ ~f{:ttKufC\Mԉ4$m4$ŝMԺ$NED$ E|$D$E$fCC4$O]u}]Íu4$4$]ٺ$HNED$ E|$D$E$(4$؋u]}]Ð&'UWVSu~J1 t&9~Ii1ɍ@B $U 8t[^_]Í&[^_]ÍvUWVSLuE} E׸;tgD$,$ tjXD$aD$ D$E܍ED$a$ tDxt@!;uL[^_]Ë@ ;u吉$D$萞 1}u͋ED$ daD$aT$D$$ aG0EЃL[^_]Ít&'UV1Sa $c atu4$?3t+»af $D$ a,Pu[^]Ðt&UVS E ]t^tW/uRx/tL t$$D$zE 4$豠  1[^]f at as saU$誗e[^_]<\.?=at-aa?$|q\$,t$0|$4l$8<+D$4"a4$ D$a$ 4$tu<$D$a,$L 4$ltY4$v"a"a"a+,\$Ét$ |$$׉l$(D$ $u ƉCFFCFC F Āu{Ct$ZFt[F$FFSfJ@@@ fH@R@P-CF$FtVSK$T$L$e \$t$ |$$l$(,ËCFFFC F Ā9Ft$4$1륐&UW1VSÃt=؉1st!t1t6F[tƉRu߉<$1T[^_]ÅtF[tˍWV1St8!Cu6{Ku Cfx[tĀu9Ktڋ[u[^_1҉؉L$ L$ t SPC먾ΐ&U1WVSÃ$xt3$|u0f>t4$O tFf>u<$Ā[^_Í&'UWVSˁLt$4D$a4$ $Y t$$1*$4󫍄$<$@$4$\$,$x$$$$$4DŽ$<fDŽ$4fDŽ$6DŽ$8fDŽ$,fDŽ$.DŽ$0fDŽ$$fDŽ$&DŽ$(fDŽ$fDŽ$DŽ$ DŽ$8DŽ$<aDŽ$T0DŽ$X aDŽ$p0DŽ$t<aDŽ$0DŽ$ aDŽ$0DŽ$Za$D$D$ D$t$$m/$<+$(tBt2ft-1҉l$,݉9v4$ tFful$,f^$ t@t0ft+1҉l$,݉9v4$較 tFful$,fKEtL#UL Љ$8t$4$ $0t$,$ $(t$$$ $ t <$ L[^_]Ë$8t,$@$kELD$$Y$0'$$@0LD$$@$$ELD$$$ݼj$$늍UWV1SÃ<}ED$|$$ zt e[^_]ËE T$$UD$|$sUԃ u:ƅt1 89s!9Xuxuk8t e[^_]Ðt&1e[^_]Ít&UWVS]ED$\$$ zt 1e[^_]ËEpt$#E D$#ED$\$$E t E묍t&ŰD$$ EĉEtC }̍L$#MD$ $CD$\ t}ȋ}EMԋQEԋO9u r9mPu@E;]wEEEED]EE1UȋB4$M}ԋOtMȋA9u t&9t WuEg _WEtaMMO M1EaEKT$ $UD$ EMD$ED$UMWKt KMȍSH}ȋIfCHJS W MHfǃHQK:1#U ЉG{1ft&9Ƅu苆ǃ$]M̃E}ЃE999]ǃEče[^_]ËEԃPuWE|au4UUW UP'G EaE'K{t&UȋB5G{Sс KSASECfClo@CKWExaqEEG EWEpaKUUW UgOEnt&'UWVSu'&*$B \uӋT$0D$8B t$B D$8ËL$4ځI0D$ $#kT$4 \$D$$-3 L$4틁 L$0pQfP<L$0itpp4yta/t[\$<Ӎ,$A 34$l$@T$,D$1 T$,փ&/uT$4\$< L$0Q tp T$4$? T$4t$8 )91 atSatD$T$D$+aD$ aD$` aD$@$ aT$4  aL$@d,[^_]ÉD$D$+aD$ aD$` aD$D$@$ awyft&L$4\$< D$0D$D$+aD$ aD$` aD$D$@$ a$D$@D$D$,L$T$D$ 0aD$` aD$$ aD$,fL$4 r04$T$.> T$4 f AU a' a1D$ aD$` aD$$8afUWVS,dDŽ$-1 T$@T$@  $$D$D$\t"dT$@,1[^_]Ðt&$D$@D$$ΡD$0d-1D$4 t  aLL$0w aL$01t$> h]D$01pt>u'&*$B> \uӋT$0D$8B t$> D$8ËL$4ځI0D$ $kT$4 \$D$$. L$4틁 L$0pQfP<L$0Qtpp4yta/t[\$<Ӎ,$h= 34$l$@T$,D$N- T$,փ&/uT$4\$< L$0Q tp T$4$W; T$4t$8 )91 atSatD$T$D$+aD$ aD$` aD$@$ aUT$4  aL$@d,[^_]ÉD$D$+aD$ aD$` aD$D$@$ ayft&L$4\$< D$0D$D$+aD$ aD$` aD$D$@$ ar$D$@D$D$,L$T$D$ LaD$ aD$$ a+D$,fL$4 r04$T$9 T$4 f AU a a1D$ aD$` aD$$8aRfVSd$ $$DŽ$-1 T$,T$,  $$D$0$tdT$,[^Ét$$茜u'1 auZL$,d[^Í$ $ D$$< u an뭍&\$D$ haD$ aD$@$ axyvUWVSldDŽ$ -1 T$LT$L  $$$(D$P$t"dT$Ll1[^_]Ðt&$_D$$DD$$HD$$LD$ $PD$$DŽ$TDŽ$<DŽ$@D$pa$ $$d-1D$0 t  a a D$,t$^8 ƉD$,{1t7ua$8 tuԋC 1҅t3&K ΃t 8uIL$00D$ T$($VeL$0 t$D$$`( L$0T$, KҋT$(xfH1Kt|xK|$<<$l$@T$(D$ ' T$(׃t+uËL$0\$,T$4t$8 x k K fH tJEtCK t$,މ׉;L$<$D$& N AǃtEuӉt$,L$0 )91 atSatD$T$D$~aD$ aD$` aD$@$ aL$0 a L$Ldl[^_]ÉD$D$~aD$ aD$` aD$D$@$ aUC 1҅Ah&\$D$~aD$ aD$` aD$D$@$ at&$P=V$LC$H0$D$\$$[$[$<$T$0$<$^$,$]$,fDŽ$4fDŽ$6$8D$(D$ aD$ aT$D$@$ aD$(BT$0 8<$L$j2 L$0|$,T$( AU ad au 1f4$\$D$ aD$ aD$D$@$ aCD$ aD$` aD$$8aͥ'UWVS,dDŽ$-1 T$@T$@  $$D$D$<t"dT$@,1[^_]Ðt&$HD$$DD$$@$蛔 D$0d-1D$8 t  a|$0 a5|$0D$4t$V2 ÉD$4D$01pt7u$2 \uԋT$01B t30XR Ӄt uL$8ځI0D$ $JT$8 \$D$$T" L$8 L$0pQfPT$4L$0Qtyp4|$0Wtf:t`l$4͉\$<Ӊ<$1 u4$|$@T$,D$ T$,փ;uT$8l$4\$< |$0,p W  fP tDt>L$0\$4Q ˉ.T$,$D$ S BŃtuԋ\$4|$8 )9 atIatD$T$D$~aD$ aD$` aD$@$ a¾L$8  aL$@d,[^_]Í&D$D$~aD$ aD$` aD$D$@$ aJt&T$01B t&5t&XL$8l$4\$< yt&L$0L$D$~aD$ aD$` aD$D$@$ a趽D$,D$ aD$ aT$D$@$ a肽D$,T$8 `04$T$, T$8t$4 HfAU a萵1vD$ aD$` aD$$8a襠t&UWVS\d$pDŽ$8-1 T$dT$d  $<$@D$h$tdT$d\1[^_]y@Oj$t@ $t atG L$D9L$LDŽ$HDŽ$LDŽ$D$HC$LCF C F9t$HsD$8|$@T$0<$QT$0BB (t&u<$ "aD$4|$4F\$ L$sF\$ L$)sa',$$0$ $$$4$($8¼DŽ$d-1 T$0T$0  $$ D$4$¸utl$|$4$Q au8L$0d$$ $$$(,Ít&D$D$,l$|$\$D$ aD$ aD$$ aL$0dD$,느,$$0$ $$$4$($8肻DŽ$d-1 T$0T$0  $$ D$4$¸utl$|$4$ au8L$0d$$ $$$(,Ít&D$D$,l$|$\$D$ aD$ aD$$ a訯L$0dD$,느<\$4\$@t$8t$Dft"t$$趦 au\$4t$8<Ð att$\$D$D$,D$ aD$n aD$$ aD$,\$4t$8<Í&'<\$4\$@t$8t$Dƹt"t$$ au\$4t$8<Ð att$\$D$D$,D$ 4aD$P aD$$ anD$,\$4t$8<Í&'a1S\$t 9ta t& 9t uIa[Ít&VSd$DŽ$-1 T$T$  $$D$$7tT$d[^Ít&5`a@a+ ""@@at8$ \$$D$.D$D$aa$.a1ɋ5"at9ta 9t uIat`$% \$D$$a.D$D$da$E.T$d[^ø@aJawafWVS$4DŽ$d-1 T$ T$  $$D$$$xu$t $4$D$$D$̦ atY4$|$\$D$ faD$D$aD$$ a|dT$ [^_D$|$\$D$ faD$aD$$ a,dT$ [^_Á<$,$@$0$4$D$8$HµDŽ$d-1 T$@T$@  $$D$D$¸u/t+$LD$D$l$D$ |$4$ au4L$@d$,$0$4$8<Ë$LD$D$1([Í&iaa=v1([Í([ attRT$(fBD$$l$t$$[1L8ptB8l$ W T$,fB묉t$(FD$, D$$l$t$$8pt&8f$؋T$$ 󫋂hf$f t&|d$l$$p$$t-1$x $DŽ$T$DT$D  $$ D$H$u@Fvm asajj a&dT$D$l$p$t$x|ÉG atz`1э\ :gL$(&:UDŽ$ VS4D$D$D$@D$ D$$d1Ƌ tC$~d1ǃ t?4$ dD4[^Åt4$߆ d1 4[^VS\$ u+9$(~Ct$~s$~tCuыCu߃[^fUWVS|$T$lD$lT$h[$T$,PT$0HL$4X \$8X\$$D$P\$L0 U$M D$0t V9$$D$8t D$,^ '|$8l$4 V$D$hT$趃t׋T$l& t*ufD$La0aD$P&uCD$LalaD$PT$l^u듃ut&벻8t$d؉uD$0|$PD$>\$l$t%$:tD$,t|$D$C$t$G$1t&D$Q$D$PT$L"atT$lG$D$T$l#1һT$, r$D$0L$4tj$1Ҁ;T$lL$8T$4D$hD$4$dT$lT$l1X[T$lf0 v:1|$4v_D$4u|$4ۃ &\$lt$L$4tPry$D$a$ģtPrl뿹rxr48R됋$D$a$^1PFrYD$L$C\$le&\L$`\$LT$ht$P\$p|$Tt$ll$X|$tf9t\$Lt$P|$Tl$X\AfD$t3t/D$xt$ T$L$$t[D$xuKD$x D$aD$$t't!1|$$D$_JD$t$ 1D$D$a4$A+|$t$$ &1& $T$L$D$D$`T$L$tStMD$xtD$.$UT$tt$E$D$D$D$xt$ T$L$$w:&T$awaÉ'dDŽ$-1 T$T$  $$D$$tT$dË$$T$dÉ'Ld$< $@$X$D$\-1$H $TDŽ$T$(T$(  $$D$,$ t!tt }'=a"al&aB tt N$P|$ t$l$$Ѓ='~e1;atXul&a@ ut ~fdT$(؋$@$<$D$HLÉÅu1\m$D$"aD$ujDŽ$ $V$V $V$V$V$ V$$$$Sv  $F$ F$F $F$F$F$ FDŽ$ l$$$$(D$ $D$$P$"a='~U1;atHuf$,D$ D$,$@$,80Ѕ!$(kƋ$($"atEu8ыQuq$P|$ t$l$$R71 $'d$  $$ $$8-1$ $0DŽ$T$ T$  $$D$$$Z=a"a# l&aA uff‹$4|$l$4$D$$,D$ $(D$$$D$҃='~Z1;atLuDazdT$ ؋$$ $$ÉÅt봍vg"a=V1aaDD$$AtN"a$4|$l$4$D$$,D$ $(D$$$D$*"aD$Ít&D$Ít&D$Ð&D$ÐU4"aVS@ a@$ڃ !%tDJDdrivBers\Betc\B t$$5D$a$  au e[^]Ðt&D$\$D$ aD$aD$@$ ale[^]ÐUWVS1ۃF$D$aD$tdE$n atD$D$ aD$aD$$ aIkEEDƉEvEhE]D$$pƋE؉0 auouY{$mtG$ v at׉D$D$ #aD$aD$$ aj뭍<[^_]ft$D$ aD$aD$$ ahjE؋0_&'UWVS<$Exm a)EEǃD$$D$l EtD$ ߉$>ED$ $n aÉt(D$D$ XaD$'aD$$ aivt$$44$Eluu܃<[^_]f4$kۉu1<[^_]$dl au)DE11t&\$D$ <aD$'aD$$ ah뭍US"a$\k"atOtI$Dkt6u"a$,k"af"a"a[]Ë"a$j"af"a"a[]Ð&US"a$j"a$j"at[tU$jtBu"a$j"af"a"a"a[]f"a$t&US$"a]tR$u uJL a"at(\$D$ aD$aD$$ a1g$[]Åtwa"a륍UWVSL5"aD$a}$a|$$D$aM̉|$$D$D$/$EM̃Eԉ $qU a"a$蝾f"aEԉ$lq a"a2"a$h"a a"adL[^_]É$hD$a}$a|$$D$taM̉|$$D$D$/$EM̃Eԉ $pU a"at.UЉD$D$ aD$aD$$ a"eUЉ$gf"aEԉ$6p a"at(D$D$ aD$aD$$ ad"a$gg "a1 at$D$ aD$zaD$$ ajdL[^_]øwaVtI"aD$4$D$ I4$ 4$"a e1P aD$_'U"at1$ɹ "a a"auÐt&{ a"atD$ aD$aaD$$ adcfUS$"a]tR$E uJ| a"at(\$D$ aD$DaD$$ ac$[]Åta"a륍UWVSL5"a mED$a}$a|$$D$aUЉ|$$D$UЉ$Em a"aEԉ$膺f"a"a$d"a a"aL[^_]Ív$dD$a}$a|$$D$taUЉ|$$D$UЉ$El a"at(D$D$ aD$aD$$ aEaEԉ$芹f"a"a$c="a1 at$D$ aD$LaD$$ a`L[^_]Ít&atI"aD$4$D$ 4$P 4$"as a1L a]D$['U"at1$) "aZ a"auÐt&; a"atD$ "aD$1aD$$ a_ÐUEȉD$TD$ED$E]] u}EEENfsVE3AttEribuEtesD$ D$D$D$D$ t$q $xYtҹ]]u}]ÐUWVSt$ |$U܋PHT$@$U i끍v뾿fUԿuA1뙍t&諤\9MԿp1U8]ál&au@ t ؋u]]áa=pFatF=FatF=HatF=HatF= Iau̸UT$$k uf WD뢸ԸQ͸Ƹ뿍'UEU EU t&UWVS˃LɉEԉUEEM }FE̍ED$ED$ |$\$D$d-0$Uԃt'tDžt7m Ft묋ũL[^_]ÅEt$m f U Ft҉tt&U Fu븐E F1f륍&'UWVS\ɋuEEUȉMEEEE U ]ĉuЍuUԐUȍE؉D$T$ UBt$D$d-0$ŨtD};EFt1  9uUfzt+)}ԋ}ԃEu] \[^_]EE+];E\)É[^_]1ۍ}ÃftUȉD$ED$d|$T$ -0$ŨuĀ}t1ېxt&'U]Ӊu2$U EL$D$]u]ÍvUu΋M]T$$\$L$ h C؋u]]ÍvU (MT$D$ L$$Yh ƒ1EEÍv'UWVS,}D$ |$T$$ h Eރt4ڃ0< w tu؉e[^_]É䐍t&UWVSÁD$"a$2uE au "ae[^_]á"aD$ AaD$aD$@D$$ aXĉ\$$"aiE\$$TD$@$"aMD$. $@aEkMaUD$_$MOl&a@@p]D$ \$D$Y4$|f MM\$ $6U D$ \$D$Z4$f \$$u4`a_4t8M<8*fMD$ $t U8~غ a"at.T$D$ AaD$aD$@$ aV"aЍe[^_]1"a}1#Ct j`ua CDF~D$ \$D$Y<$d auja|Ё  aE~-D$ D$$zD$$Ba󥋅cu1ۉ:SD$E$6tRڅ&:fED$@$}u"a&OaD$$vu%jaqamD$ua$IHЁ  D$$TaRRYt&'UWVSˁMH D$ Pt$T$<$9b H<ft4ڃ84Pfpv7ffu捶EfMuUDEEEUE}M+ED$D$C$EUM|EyUD$)D$C$EYU|ExED$)D$C $E+U|Ez UD$)D$C$EMSDAT$$ UBS$T$ MS AT$$ UB S$T$ t&UE¸t#E "a$aaED$赧1ÐUa]ÍU("aUM t;D$L$D$ T$D$$cF tÍ&: at#D$a4$蚛4$ޜd/$haPkaD$ hD$EfE$԰E t$$͚`|$D$$ tFD$ $ƅg誟D$a$ߟ #tt1ۉ<$ e[^_]Í&fV E$JfUWVS<]$\'`a$D$b a$a豼8$1Ƹab`a!$%J8A`aaaPyD$`a$E`at$!$mac$蝔e[^_]Ðt&+1D$ aD$aD$@$ aD$`aD$5)$a詻t%8t $$AI$Ƹaa`a!$I~8A`aaaP[~D$`a$'`at$!$laa$觓$Dt$D$$a$?e[^_]Í&1 `afa@laRfUdD$@aD$-0$wzt>t 4t&Í&'UVS] ul&a@ t-d\$t$-0$zu?[^]dD$t$-0$yD$$辖ÍvuD$dt$-0$ydt$D$-0$|yÉ[^]ÐUVS0t. a|msae[^]t&8 atlajv?|$$}D$1<$s x"aɉ\Pd~g "aDž`Sދ{9v,dW8uIt21 Lt"8Lt` \9`|1fĬ[^_]Ív=t"au$H"atB L"a@"a@"aD$иla>j1|$$|t L"a@"aƍ&'UWVSu ]u =t"aulaR=tMla>=x"a1~, "a9Xt"P 1rЃ 9t 9|1[^_]Ív=t"auH"au/L"a@"a$뎉tX"a$ȧur L"a@"a@"aDō&UWVSu ]u =t"aular<tmla3=x"a1~91v95x"a~5 "a8$D$Duա "ae[^_]Íe1[^_]Í=t"auH"au6L"a@"a$kaX"a$uK L"a@"a@"aDUWVS]D$Ja<$ې1Dž8D$a$`a :UU8D$uT$$( E |$4$z aHu4$te[^_]áatޡ`aD$ $&t aR$Jau5 aJavDºtaD։D$`a|$L$T$ D$JaD$$"aD$ ,P  aus$D$"a裎e[^_]Í8Eu|$fa;PD$$Bt&D$"aD$ KaD$FKaD$@$ a\ USED$$/4؃[]Í&UEftE뷍&E릍UH}}Euu ]u]"u}]ÅtED$$E3$EIq‹CU؉$9qCMԉ$)qEC$qE܋C$ qU؋MԍT UU܍;EcE0C>FC F E<$D$?SFT$$*SFT$$SFT$$SFT$$nF]1u}]Ðt&UE$U t$M]fut$Et$]xut$]$MU E]VUSED$$2؃[]Í&UH}}EuU]u Ҹ"$D$B11te$Eho‹CU؉$XoCMԉ$HoEC$:oE܋C$,oU؋MԍT UU¸";Uv"]u}]Ív]"u}]ËE0C>FC F E<$D$<SFT$$'SFT$$SFT$$SFT$$l1F]u}]fUd 1t'9x"a~Ѓ "aÐt&1úlam5t)la.6d 119x"a븀=t"auVH"atcL"a@"a@"a $Tla5d 11;x"aN]t&X"a$ӟubL"a@"a$Lt&U1]É'dUǀ]Ít&'dUǀ]Ít&'U1]É'UWVSd=d*D$6Ka$:KatL EE܀( aÉEE܉$.$-Y D$$Y $Y t$D$$Y $X $$X UpT$$7\Eމ\$$nZ $G \$D$<$O \$$ r. 4$D$CKa<$nt$'.Ĝ[^_]É4$BX xۉ4$4$.X UpT$$[t]Ut$D$Y t$F t$D$<$NN t$ T$- AvtދE4$EEEEEEEEeEEĉEEȉEẺEEЉEEԉEE؉EjW UT$D$$V6Ut$D$X t$(F t$D$<$M t$ T$, 4$V pD$T$$,VU&UD$ "a$@"a見ÐUVSu~s\\u5u5<\R\/ Ѓe[^]Í/t \u9u]L$1ۉT$$*kÉ؍e[^]u \t1/u딀/t„ft1ۀ|:tΐG\u~\t/t[^_]Í&'UWVS|u]$YU$UEEENfsSEymliEnkTaErgetENameEZUD$ D$D$ T$D$D$ǍE؉D$E D$ $R $x[Gfu$zYe1[^_]W$L  x$AYe[^_]Í&1㍶U<WVS ] \a‰$0Ith{:{\ED$$D$8E!ʁ t€DэHD҃+Ee[^_]À\t8ED$$D$Q8E!ʁ t뤐t&{\t‹5`aa%!"$4 ƃa47R&\$4$f\ aMD$ |$ L$$E!ʁ tt&KasDž\8u{:t<\ $e aMD$ \$ L$$m‰뼍v'UlWVS Eu]$V$ WEED$$@D$D$ǍE؉D$E |$ D$ D$ D$D$$* (=tW= uf= $MVe1[^_]Ív$ E؃t= t(u = 1OGW Lfꍽ҉$ |$4$lj$Ue[^_]Ðt& audž1҉D$1D$ KaD$YaD$@$ a/džGW f;aD$LaMԉFǃfEfEЍEЉD$a$ +fUWVS|]$T$TUƉT$UEED$ EEЉD$E؉D$E D$ D$ D$D$$ U$;EE EZw"E$Te1[^_]ÿKa^U11EUЉT$UD$ D$D$E T$D$ D$D$$ $q}f?E܋UfB$S$~=1 atID$ LaD$@YaD$@$ a# a1=t Uǂ$Re[^_]ÿKa tQKa U1 @EEEU1rD$ED$ KaD$@YaD$@$ aE+1B aED$ LaD$@YaD$@$ aEt&}UET$$7=Et$$yfUWVS|] E$uFQEEED$D$ D$t$$E EUăv1ۍU$Qe[^_]f=wUjM $QD$ EEЉD$ED$ED$t$D$ D$D$$ $UU1;UkM1ۃ9L]οhYaFEHȃ 2Ex<%ELt ]KLD1ffMX,La]MUDDE9s EfM]f;1f}ME]L$$ÅEmt&BU L$3EЉMD$ D$T$L$U1ǂ$1=EǀUE$D$S$BU]E$0Oٺ1$=Ut$$fUWVS,MUu AQD$\4$U؉MXU؋M܅D$.$EWM܉qD$É4$@QM܅ۋU؉EA tuu15%t 2a:Gu u1t&un:uˉ޿/La%t 2a:Gu u1t AE+E=~ AE,[^_]ÍEA]D$.4$M܉uUWM܉qD$É4$v'UVS]Kt4u6pt-t&t puuv0C 1T$C $hQ{tB[^]$4Las 4$R.lnkFC͍&s 4$R.lnkF륍&KjCC낋Ct%CC C1TCFUU M[t& ttt ǁ 1]É]Ð&'UH}} uu]]D$t$<$aEԋE9xD$t$<$\aEЋE9tbxD$t$<$;a9}tFtLUԉ$ƃfUf ]u}]Ðƃ1]u}]É$fǃfǃ ƃ]u}]Ð&UW@VS<a] 'u%@׃@Eȉ$MJUȉ$fEfE6KMuUǃƃE܋E fǃfǃ ǃ$M$EE}EEEt$D$$M+U  $oQ DžDž`aƅDž1ɋE ǃU1E[$ UЋMEt$(u4$D$$D$ @ D$D$D$D$T$ L$D$ , aE)@ HUD$ET$$,$B0 :„҈t  }t{ǃ Dž u ǃE$oEt @U auȉ4$Ge[^_]ÐEx   aǃDžtxD$PLaD$ MaD$XaD$$ a,EZ@M a+uȉ4$G1BEЋUD$ @ D$L$(Mt$$D$D$D$D$ T$D$ $ , ax_EUB ED$E${MQE‰ OutDžDžMЍuEt$D$@ D$L$ D$$  a4Fl&a@MTEЍUME@D$@ D$D$ T$D$ $  aEM'Ex E$ E:t gMZBR t..t&E1ɍUE@&uUM ǃƃfǃfǃ ǃ$ƅT$EL$4$k+U DžDž`aDžE؉D$t$D$ jLaD$XaD$@$ a~UEMU~ Ѐx\Pu8 t& a3ǃ \:PD8,4M؉ffЋU܃f])G_<\tU4v<.{ti])=UA&<.tC}EUv)=~Lt&e[[^_]ÍvKMۀ}\t}/u-;]tK\Mt/u)='}.uz\J{<\E}/E EuK}tE.MU\]UEUz\]‰ 9UsCU܋EM9щy\tdy:Ut[M9U܉Ur3 /\ Ȅ#&<\t/u<.E9ـ} a'1L[^_]C<\/<.E:;uԉ>Eԉـx//ƒ/ M|$t$$K/D$\$uL[^_]À{/KPىuAMtt ~:+"`D$T$ |$t$$d$@7rɉu   E95/E9‰E/8/u1DžD$<$t$T$|$ D$$L$+ ǃ0dE؉$e[^_]ÁtO>ǃ땐t&f pǃ똍&~F\FDЈ&&PatEt9t x\F{KK a ut u a '@%@Ѓ@PC a|$Pa>D$4$@EFEƅ;%$|\0Pa\D (D$<$F<$lhD$$<$P$uNDž1Vu#=@Ƌut㋅uًD$$4$pu[1҉KADž ecFƅ<\/ 1D$D$ PaD$ZaD$@D$$ a!K a@D$ PaD$ZaD$@D$$ aݜ  l<\tE:EE;Eԉ$PE$4ǍsE]̋UEԉD$<$T$Rƒ )}uA]E}DЈUEEԄu]1tĀ?"0x\t)ẼUt$L$)E$D$ {x\tẼUt$L$)E$D$ u,4$D$MEEEԄڋ]̀}$E9ރE$UUe[^_]ËẼt$D$ Qa)ED$ E$Åu4$D$Uƈt&腉 |$GzOfEEE;EE:]̺[%Eύt&US$U E$bu1$[] at8D$D$ D$VaD$ KaD$UaD$@$ aÌsa룍'US$U E$u1$[] at8D$D$ D$VaD$ KaD$UaD$@$ a3sa룍'US$MU E$Du1$[] at8D$D$ D$WaD$ KaD$UaD$@$ a襋sa UE D$ $D$ED$ÍUE D$ $D$ED$xÍUE D$ $D$ED$HÍUE D$ $D$ED$ÍU8uu}} ]D$ D$|$4$~9$\$ |$4$D$EUt@]Ћu}]ÍvD$ D$|$4$t]1u}]1҉$ʌ1봍U8 a]]u}xu=at =dau]u}]Ít&u4$4$ $,Qa_@D$ |$\$$t?\$$@Qa/@$Qa#@ a@4$]u}]Ðt&|$\$$TRa?뻍v'UWVSduE-1   UE䍅 $X)> aDžDžDžDžDž DžDžƅDžhDžxDžDžDžDžDž$\Cu_ asa a$d[^_]ft887v-t%$t~:Df`at$\$!$  ah$虓D$`a!|$D$ RaD$XaD$D$$ aΆ t$D$ RaD$XaD$$ a衆 at8|$D$b D$XaD$ KaD$UaD$@$ a[Fsa:8 at$D$ RaD$XaD$$ ad at}MฤE‰TD$$lT4PD$ D$t$)T$|$D$ D$D$E$f@ $pޔxhGPt_UE1EEEEEEEEED$ED$D$ (D$$K " aD$D$ SaD$YaD$@$ as aD$D$ DSaD$YaD$@$ as av^x¡saht&Uȉ$%@@@FNfsS@@ymli@nkTa@ rget@NameF$p!lDfF $X1tAXEEЃ EEETEEUЉD$ED$(t$$D$ @D$D$D$D$T$ D$$] ,fE1$Ł xhMt&D$/<$tID$\$9C9rDtP9w:tփ[^_]f~:~EXD$\<$N9stxfuy"af"a.[^_]Ð?u)t$"a|$$"apfLJ"a.vfUWVS}<1$vD$6Ta<$D$/$D$\DÉ$9Cƅ9sFxu@D$/$UtoD$\4$?9C9rj9v6/9rS[^_]Ít&:_5H@[^_]D$\$9stxufS\t/t[^_]Ít&"af"a.[^_]À\glf.b)|$"a\$$"afǃ"a.9&U"a9Ta"a"a:Ta"a"a"a]ÐUVSPL T E¸tv#5tiiu&e[^]Á t atቅ~T$D$ [aD$/faD$@$ aW~뫡au4$D$~g Dž~DžDžDžDžDžDžƅDžPDž`DžhEEEE$`t$D$ D$ a $$ t$$ZaD$W $de[^]ÐfUS])a CCD$D$$!` ǃǃ] Ðt&USw2HPauQ[] A[]ËXC[]ÍUVSÃ0S@EᆳޅҋptJuB$D$_ ED$C$Ud U؃H auSe[^] atPt$T$UT$D$ [aD$faD$D$$ a3Ue[^]ËC븐UWVSÁ aS$ '@a蕍=Ta3m'CPa(~zfto=th=ta=tZE$D$Ga=a(iœUD$PUuiҜD}tpk^ }<$D$\-|$C4$,CX@ %  a^ \$$;_ $^ S^ t$D$ K[aD$eaD$$ aD$S$ @a=Ta TakCPa(r& a/\$t$D$ `[aD$eaD$$ aRfD$ [aD$eaD$$ aR&Ta [v'UWVSÃlaMԅʁ@Uu98;xEԋU%A@EUtarE%@ЃE`a taD$+C D$$EuEȋEԃ%EM̅UEuȉD$D$ T$UT$t$|$$[a]U҉Ch}U1ɅfPxt9ut209pt+ asa@Mą aCC$|\ $Z uNE}C e[^_]ËUЅ a09E$Y CEhC$[ $^Y }論M̉E!&uUEȉT$D$ t$ut$D$|$$[a[uC}$U1Ʌft$|$D$ P\aD$eaD$@$ aO9E$X CEtC$Z t$HX Ut處E} FPlD$D$$議C@D$ F\aD$eaD$?$[a1 TaW  aeUЋED$ \aD$eaT$D$D$@$ aM.PT$|$D$ \aD$eaD$D$@$ aMfCC Rt&EEE%@E.D$D$9D$eaD$ /\aD$caD$@$ a1M#E$\aD$ED$貂fM̅u}8E=$]ą[a/xSE҉tC$X P$V :@Pam|$$\at&UVSà @`a4"؉4$C aHPaD$8a$l a=("at:C@Pa$JCǀǀ [^]$("aEt$("aaaa a$a(a,a`E$p a褍Y a`a4"$C aHPaD$8a$\ at9vC@D$ )]aD$efaD$@D$$ aJ a[$蝙0fUS$EtiU za aB %?Bat4 D$D$ N]aD$HfaD$@D$$ aJ]1Ҹaa@ǀ(ǀ$ 1ǀ1aS $aW  au"aB@%?B]aaD$ ?]aD$HfaD$@D$$ a=Ia aB@t&UVSPtaD$\$'uD$`a D$D$$D$ D$4$Y D$ \$D$4$Z x0Et$D$$Y t  auDe[^] atD$D$ `]aD$eaD$@$ a v'Ut @t1]ø]Ðt&UE@D$$D$DK ƒ 1t$yJ  UWVS\Eԉ$輫Uԉ$MËAD$w_a$D$L D$D$$UEċB $ba ae 8"aE"*< |$+~=1D$8"a$N o8"a^aE9ōEuD$t$ D$D$UB$/| a et&Uąt5D$Eĉ$fI uV a Mĉ $H UB$H dMԋ@ $Ue1[^_] atD$D$ aaD$daD$$ a>넍UM”Q$f aGD$uD$ D$\$`a!$$EED$t$ D$D$UB$ׇn aD$ `aD$daD$$ a+> a`a _D$$蚭$BEEuD$t$ D$D$UB$0a aD$ h`aD$daD$$ a= a==`a1Ҹ ""JEу9EuUED$t$ D$D$UB$T aWD$ `aD$daD$$ a<. acMEA$`a; ""4F @\$4$P($躭E5 aFM`aEy$ "f"4]9|M܅fED$ ED$D$D$UB$J/ a"D$ $aaD$daD$$ a; atF H+4$Pv$;8tw`a "8"a$իUD8"aE9@vUBD$ aaD$daD$D$$ a::`a]䋀"40EEܐD$\$ D$D$UB$d aD$ $aaD$daD$$ a9v`a}܋ " "u9|E]D$t$ D$|$UB$`a "뫋uu}vl$[D$M\$L$ D$F$Vu a}&)T$D$ _aD$daD$$ a8 aED$ `aD$daD$D$$ ac8D$ saaD$daD$$ a:8tD$ `aD$daD$$ a8D$ `aD$daD$$ a7D$|$ E܉\$D$MA$. aD$ aaD$daD$$ a7D$ O`aD$daD$$ aY7;D$t$ E\$D$MA$蟀 awD$ `aD$daD$$ a6ND$t$ E\$D$MA$9 aD$ ,`aD$daD$$ a6D$ _aD$daD$$ ad6D$ _aD$daD$$ a;6D$\$ E܉t$D$MA$ aD$ PaaD$daD$$ a5D$ aaD$daD$$ a5f/$ED$ _aD$daD$$ ak5U1%WVHSׁ]M Ct~E ! auv|saCCC ht $R> `t $=> e[^_] atAt&D$D$D$daD$ /\aD$caD$@$ ad4O{sa1CCC DE܉D$D$4$@ 4$= ME\ula4D$w_aD$D$? D$ D$D$$LaB44E 1DžHujE(ED$`}D$|$ D$$|{t}t4[apEl!4$1s< Uu 41ɉ‰EuKD$`T$4D$|$ $z4tME)ȅEu+ 묋}t[afUS$Uu1]Ë ta1; tM ET$$D$L$ EUE뻐v'UHE]U u]}u]u}]Í&5a;t3M؉D$T$ D$ $1E܉E؋]u}]Åx}`a; "}p"4tcF @x(\34$D$׉$yF H4$P]u}]1 at=$"a$"aD$ "a$}'$"a "aD$ T$D$$4 x= "a_DTt%P;?1 ;29wB;R k1r\$D$$, ƅ AtJ$̀Q2;a DžAZt%t$a+ fFD$1D$ PcaD$caD$$ a!t&e[^_]Í9at $B$* 1Adt&(VD$F$%FkF8D$F $$F Vt$P@4Pt&$"a$# "at!&e[^_]1D$ caD$caD$$ aJ e[^_]$t#t@D$$T$h $x@ Dž(QD$A$#BkB8D$B $#‰A $"tgT$D$$螀$ZB ڋAADž뾐v'Uuu a]]nWt$$S҉Ct]au]X&UE E mUWVS}_t.11G ؋P9atilǃl@@@ @Kƃhǃaǃǃ[]ÐUWVS\u ]t}t E۸Dء`aD$ga<$ D$MɉEED$gaD$$DžUt  aE!@D$D$D$D‹D$<$@T$UT$  ‹EB}1 at4T$D$ PhaD$jaD$@$ a>e[^_]ËU aD$`ga\$|$D$ gaD$jaD$@$ aUD$\$T$\$D$ D$T$<$ 5 =  a(:e[^_]0"a@D$D$ga$| aED$\$D$\$D$ T$D$,& at:UgaD$ gaD$jaD$@ҺgaE‰D$$ amM8 at:UgaD$ gaD$jaD$@ҺgaE‰D$$ a MD$rga\$|$D$ gaD$jaD$@$ a &D$ gaD$jaD$@$ a 1 D$gaD$$et&1 a=D$D$ gaD$jaD$@$ a  a  at $X Ue[^_]f|$D$ haD$jaD$@$ a v=8"a҃! D$gaD$$e21D$ haD$jaD$@$ a t$D$ 4haD$jaD$@$ a &'UWVS\u]} t\ED$ED$@D$|$ D$$LaD$$azCEZED$ED$@D$|$ D$$@alKD$$ayESUD$$ayCF%u`ML$t$ D$$UԋMt$ D$@L$$ a1e[^_] ƋML$t$ D$$UԋMt$ D$@L$$1 att$ |$ST$D$ED$ ehaT$D$@jaD$@$ a EЍe[^_]1뱉Yfa됋E$6 E$( jt$R؍t&'UWVS|EEL$T$$t |[^_]Ð@aA`a""$T$Ui@D$`a"$2iEƉt$D$ha$aEUƃXSUƉ$|$D$fa<EUƃX. `aU"MEЋUMUM҉1yEtB @UE"QP B}@aA|[^_] akOsa@azA`a""$T$hEMƉ $t$D$ha9EUƃX+EƉ|$D$fa$EUƃX`aEE"UUȉUM҉1yB @UE"E au3N¡sa6}D$D$D$iaD$ faD$@iaD$@$ afD$D$D$iaD$ faD$@iaD$@$ atT UX]]uu}} ؉u aKu ]u}] att$ |$D$EL$T$D$ haD$iaD$$ aE]u}]US4]%u aKu4[] atD$EL$T$D$ haD$giaD$$ aGE4[]Í&'UVS0]u ؉u aKu0[^] att$D$EL$T$D$ haD$haD$$ aE0[^]ÐUMbWVSEM }E)‹EUi)iɉE!] 11E 9Lу9wӃ UčS? L$#ЃMЉM t$#Ѓủu D$#\$ $EȉED$fM̉\$D$ $e\$]D$$1eE ߺ@afD5`aM-<M; ""@a<D4߉uUuыUM 4tMuM t ߾Uȉȃ 49] 6uԋ]ԅ]qu 9uMEE]U1 $ۋ]I‹UD$E\$T$D$ VM ~EEt&7x}f tv`a@a:; ""@a;`a"$fGEEE9E jUUЋEЍe[^_]è4߉u@a;߅EfD 9] uԋMԅMMEu؉r*ur/uWfW.ufOsѡ`a"$]ȃtuWfWzfEE9E t&@a9zUЅEEЉEЋEЍe[^_]à D$# T$# L$#MEUEKfO EȃfUWVS d]}-1 pE  UE䍅 $0¸KCi)ʅd-1D$$l\$E D$E$Sd4$1T$4de[^_]Åt)d-1D$$D$yE \$D$E$뛐UVSÁ`T$4$D$`layt$u4$ E`D$EuE܍D$#$ĊED$ D$$EE؉D$ x e1[^] au"$B ݰe[^]ÍD$D$ |laD$qaD$@$ ab먍v'UVSÁ`L$ T$4$D$laet$u4$ E`D$EuE܍D$#$谉ED$D$ D$$EE؉D$' x e1[^] au$& e[^]ÉD$D$ laD$qaD$@$ aL뮍t&UWVSÃ\EСdaUEEExEt;F=ɚ;~De[^_]Ðt&oFd=ɚ;YEЉED$ D$D$$U *ED$4$EGED$DD$D$D$D$ D$$ WU$ Eă$! |UED$ D$T$$ UċED$ D$UЋUD$$ IXt& 葭Ѝe[^_]É$1  Uă$S EЉ}EUED$ D$T$$ +T cttDD$U$d UDЉU$' UЃ' 虬 }/& ֭‰to1_DЉ$ 蔭‰uptVt"fd-1t2,td-1hȉ}諘t&'U8EdaD$ D$$EED$D trt N1 atsaÍt&UWVS"LӉRnaDžDžDž‰DžDžDžDžƅDžHDžXDž`EEEE$XIM̅tq$laD$D$ [naD$D$O a}=sa1<$L[^_]Ít&tttM$maD$JdFVt'D$$mad aum<sa<$HL1[^_]D$D$BD$oaD$ laD$@oaD$@$ a[nat$D$ maD$oaD$D$@$ aT aD$D$Nwf֍[na+B;Es' au`;sa1[[wlalaE‰D$ t$D$maD$$35Bt$D$ maD$oaD$D$@$ a adD$[D$WD$oaD$ laD$@oaD$@$ a6#UWVSÁ'dE -1   UE䍅 $H%{2TvpC 3C9FN C @NF} V S Ct at8D$D$D$oaD$ laD$@oaD$@$ a9sa:8de[^_]ÃnNɉzFB D$|$$SEtBMFF9F Nn C $ V 肥B at at$E u a]x/sattDžDžDžC/1tL$$_tQG t$ u ?Gt $p Gt $^ <$x4${.sa .8DžDžDž&EUD$D$t$D$ D$D$$P9‰4${D$$lj@2Tv P ʉ[Džp-p-0$T#W-8t&&D$tD$D$@qaD$ laD$@oaD$@$ abS%Rc4$y x/AQ ‰|DžD$ xX4$D$T$Du!ЃmD$D$la4$fLD$D$t$D$ D$|$$N9‰D$$lj@2TvPB ABABBBE$ M1҉dPE$t1QD$T$ dD$CnaL$t$L$8XIBBX~FXtЃ|;uA||tDX DžiSFR#x4$D$訁t4$v1)Dž1D$1D$$@qap DžDžDž뢋H,aD,aDž@,aU(d]uu}} -1 E   UE䍅 $?uR~2Tvu}F <F1ۉBGBGB G F $ t#d؋u]}]f q atHT$$,|X@$5 u a%0sa1ttDž\ `E Et dfEt$D$ $m\uCt<$dxd $ksa1` v$F볍{81Dž\Od1fEfEEEEEt$D$ $Dž\dED$D$$MP\E狕dD$ Eȋ`T$U܉D$XL$T$ UԉD$E؉T$D$EЉ$2NjE Et dfEt$D$ $t@}d$lj&;8\Dž\t&D$tD$WD$oaD$ laD$@oaD$@$ a\Od $iE؉T}ȉ$2 T11҉Mȃ$BEЋd|$1UD$$ WDž\8TED$ X`T$dD$E؉L$T$U܉D$EЉT$ Uԉ$T$`dL$$s t&'U1xuu ]]} rE؉D$ EЉD$ED$E}ȉ|$$EfEfEEEEE\$D$ $tZ!U U0E$(hsa20]u}]Í&]u}]ËED$ D$D$$c!ЃtED$|$$;UtZ|U U0Eu$$gbsa20xfE\$D$ $E뽉1tE$i딐t&UED$$7Ðt&UVSu4$=D@, \$$غ(u e[^]É$ A㐐U$]`u}}a D$\$$ \$h$pG|$D$$ƍE D$ 2Etp\$ t$D$ra$@ra蟈4$D$D$i$% 6<E hD$ |$D$$2E\$ D$raD$ra$@ra+D$D$i$%TTUXɉ]Éu։}u ]u}]ÍED$D$$ E܃u |$t$$42]u}]Ív@tۋEԍUT$ UD$@D$Eȉ$g E܃@EǃEƉ|$t$$1U}O}EET$ D$EԉD$Eȉ$ ]u}]É\$D$$Lra&UHE]u}tiw]u}]Ðt&)؃~Ӄ ~uzCusKu ucCu\C  9s}Ћ CUSte ET$$ra&9FCUU9r]u}]8t0))}ԉ}U 9]Qf))}ԃ}tу t=uԹUj8ǀt́))}ԉ}ԋ))UԉUU2덉D$$raUxt&UTt&U{t&UHML$$R Ít&UE D$E$ȏÍUE$Í'UE$?Í'UE$Í'US]$y u []ËEB([]&'U$Gt&UE D$D$E$Í&'Udt&Ut&Ut&Uxt&UFM L$M$L$RÍ'UuFM L$M$L$RÍ'UEF$RÍt&'U%FML$$R Ít&UFML$$R$Ít&UDt&Ut&Ut&Ut&Ut&Ut&UDỦ E$|$=`,at$Ѝ)хʋ d,aYuhAM4Hsa<\sa`,a҉5t,a=x,a d,atl,a1h,ap,a؋t$$|$]Ë5l,a)4<>4HsayM<\sa`,a5t,a҉=x,a d,atl,a1h,ap,a뉍t&`,aUSud,aB B  u][]Ë l,ah,ap,a9rd,a[ l,a]h,aÃ9F d,a[h,a l,a]Ít&Ⱥ_ N )i)iɧAiyb UWEV5d,aS`,au21ۃ9|[^_]Ë=t,a~P\B t4_ N)ii)iۧAڍHЉ9ux,a5l,a4h,ar{'U8`,ad,a]]uu }zu{B?F p,aE^`,at,ax,a$d,al,a)D]u}]Ë l,a) BxlA1\$D$ sa@ $Ӱ봐Fd,ap,aE`,at,ax,a$*]u}]Ðt&vs`,a|t,ax,aE^p,aEd,a$l,a)E]u}]`,a<t,ax,aE`,at,a?x,aEh'U8]`,au}5t,aD$D$$3Ћ\$=~]ut&MuEE4"a4"aE4"a1ۉt$t$ \$4$D$ D 1ۉ$薗0t$$Hut(t$$HtT$ىu؋T$B$D$B $*L$Q$A 4uEQ$9V9>:~]:-"J9fz] Mz-L9"a8v]uE E4"aE4"a9w(w \$wډ9s9uEf9]T$M-u;u ]uE D$p8tE@tT$JL$111I8L$Pt)ЋL$;T$uу=uكluT$z,sE0L$+H <[^_] ^]-tEuE)uE1ɺE<[^_]Ã-UT$BEu&|$4$~UuE E4"aE4"a1D\$4$|$$ыT$ى‹L$A4D$A0$%t$V4F0<ЃEV4u1ɺE<[^_]ËJ4B$wz<mB(0\|$PEL$XX A(@$1t$F0$ F $D$9EhtM7E +L$9ЉUA8vV ]]U1D$X,*}E -U*'WVSÃxt$ t [^_Íx8K 1ɺj;kD$9t&l$<1ɉVVuF4"a5"a4"aF4"a,NH,$)NP)#NX,$)N`)nVD$ 1ɉl$1ɉV$F@VD$<D$?FT$D$<^D$= D$>]D$?:T$VFuF F4"a3"at&;\$(|$$\V{{tG}K^ud$F4"aF4"at;4"a1D$ ډl$Fu)$F 4"aF4"auD$ V4"aF4"a (t)jt&FP@Z X@l$hMV9sH9Y)\ FDHٺpV9s C9nuF4"anF4"aT&(1ɉV9{)3~9t&$V9&VuF 4"an4"aF4"aD$ S82D$L`YL$ @ =t&;\{)v<8\x):,-Z9߉RqaDL$L$9^uF 4"aF4"aA9v 9\H9v9s$x\t%H9w9rf8}uЋNF &nuF4"aF4"aL[^_]Ãn1ɺ FH @(FD$Oy}InD$ 1rFnVH @$l$4UWVS$$‰ǃG *4$$L蔣ø D@D$@$nD$DD$<_t$0\$LD$Pt$4T$xD$8D$Ht&@(9ut$01ɉC C{C C$C(C,C0C4C8C<C@CD#D$DCDT$49T$0L$8uD$8D$04"aD$44"a1ɺD$DCPSD$D$<$C|$8s<~1s8|$8C 1S@$sHEQY etwuD$8L$8D$04"aD$44"auW1ļ[^_]Ð ‰L$49L$0r$h9r)ļ[^_]Åt$$8jD$8ļ[^_]ËS11Ƀ%=Ht.=Pt=ut!C C 9Lōt&뼋C v$ԠC4tE{4uVk,1\$T)9 u\$s<<<$vD$,l<$bC8`~1ҍ|6)щ 9uT$ l$,ىL$$D$t$\$(D$ ;t$t}>T$(Z,< 38t,T$$T$38tL$9Nt;t$|ރl$ D$$|$ T$(RD${D$ L$PD$ W D$D$T$$9^D$tST$L$TD$(\$d$(D$,lD$;|$ D$,T$$9+D$9D$L$ |$L$ L$P L$L$T $L$PT$T$NjD$D$D$9F%|$ T$C|$11 D$|$D$$fuL|$_tE|$t!T$$E|$_zD|$L$ $u |$_}t%|$D$$uq|$_tjyL$T|$ |$ $L$PP l$qDž|$(w;|$ tL$$9L$t+D$9D$t&D$,<[^_]Ít&w뎍vD$@11|$ ti|$t9~7|$TL$ L$L$Pl$P <$ۉ׉ǁ~it&D$@t1Ɂ~́X(D$11FZX$~Kv|$ D$D$11|$tF*뉽z UWVSÃ,|$@;|$DT$sD$T$D$JXtoxLHt[|$t$Hte0(01D$t&;t$D L$lL$t$Hu|$fKD$T$t$$T$D4$T$ɉ9uˉ\$|$|$|$t&t&|$NjL$D$L$L$$:9uօpT$L$T$ $D$;t$DD$D$,[^_]Ít&%Ƌu|$ &KT$t$$T$L$D4$L$‰É9uˉ\$L$|$@Wt$։l$l$%|)Ww@<׋W%=DT$؉|$4$9uL$؉$T$t$l$|$hD$D$hX|$vKT$t$$T$L$D4$L$‰É9uˉ\$D$|$L$T$D$؃<$dT$؋L$<$T$T$L$L$Et&K%T$+S )D$ptx %K%T$+S 9t$DTjD$,[^_]ËT$T$|$vUWVSL$(> t&t&At& SȃD3E89\$t=pf=x=h8{a\[^_]ÉʉL$(sL$( $-‰VL$( $4‰9cD$0T$N$D$ D$,)D$.D$P?9\$t)t&ʉfT$01B\[^_]ÍvD$0T$$L$(D$ D$,)ЉD$D$D$N$T$$L$(D$,wD$N T$,% D$,L$0T$$)ЉD$D$D$NL$ $2T$$D$,>L$<D$NT$, % L$L$D$$@6D$>f(f=|$vL$(D$,T$L$ L$>D$T$ $\tZ@D$>f(f=wD$,L$>T$( $)D$D$T$ D$P|$T|$Fptx2DK%T$+S 9t$dTD$L[^_]ËT$$T$D$(T$>$D$ D$,)D$D$D$uPbL$(A|$D$(@|$|$5UWVS$0$@P 8eT$Ht[^_]ËL$H9EuY u܉|$0貪|$H |$,N T$HBjBD$8D$@$8$<$4$4q\$(t$4T$(9T$4OL$Hq,p Q4y8D$HX< \$(9\$4L$,v,|$<L|$449w;t$,L$HD$(t$0$4T$4$A0$$DŽ$DŽ$$$DŽ$DŽ$DŽ$DŽ$x)9\$(C\$(\$(L$@D$Dd$D$\$DL$@D${P \$ \$,$訾t$(;$D$,D$$9sl|$Dt$8?$$D$ D$t$<$0$9s#K$t$<$u$t$4$$T$T$ )։|$ t$$T$ 3C$f(f=$$\$($$L$@T$<|$HGDT$\D$h$<))ЉYL$Xt $W?D$lt$G?D$t$;?1pT$HjD$$$<))ЉY$t $>$t$>$$>1$44$\t$(D$8$4$4$4$4T$(D$47|$4D$,|$49 :t|$4|$<) 9 M 9\$4dT$4L$@T$T$h $?)މD$$$T$ |$ t$$T$ Ht$8ً|$D$$t$<$}\$8$$t$z=$D$ $Z=D$ T$8$t|$(t$8uL$HQD$|$@\$4T$8$$ىl$<$Ztۃ$8G$$z@t# 9AsD$H@Du$CL$HAH~$|$@ى$D$ D$l$<$y$9s`t$@:$D$ D$l$4$趰7$9sKl$4$Bu$T$(|$1D$P@@$$$$<))Ѓ$8^$$$< <ыl<։l;$89S@sۍB׍$B9$$$8|$HD$$$<))Љ^$t$P8$1vT$@ىl$$$D$Xt$ 8D$lt$7D$t$7 $@@$[8$C$8F$$$<))Ѓ$8Y$$$< <Ћl<։l;$8;S@vۍB׋\$(9\$4v<|$4 t&9v*8uT$HB<)9|D$t$$3u9\$48$L7$J$$6 1D$ \$t$|$8et\$t$|$Ðt&X t;EuCt$&6C tTS~E1t&C D80$5C D8($5C D8 $59sƋC $5C,t$5C4t -$5C8t$5\$ t$\$|$5UWVSPH!. EuӅEEE@uEED$`a $˩D${a$L$$D$4$B EȃD$\$<$MD y;D${a$PD$4$A EȃD$\$<$D e[^_]Í$D$`{aT$믐t&UWVSlE ]uE ECC}܉EFD$<$0A EEE}̉EȋEEED$EĉD$ED$D$D$ D$$+C ‹E;E t6U${@ UE^ aSuMe[^_]Ít&҉E9 aSt&t&1U} M볉|$D$ {aD$~aD$@$ a70e[^_]Ð&'UEU@T$ U$T$U T$cÐUVS0]uME CCx@ED$D${aD$ {aD$t$${E$@? Cte[^]ËUT$ t$$ED$E9t։$? e[^]Ív'UX}}]]uWt؋u]}]Ðt&E 0t$'D$E܉$E> EԍUT$D$t$ D$D$$A u~u^ U8]]uCuKEu4$EE D$r> ED$D$D$ D$t$$@ ]u]Ðt&Uh}}uM]u_t1Et$L$$؋u]}]Í&\ ؃]) E T$'D$E܉Mԍ]$ẺU= UЋẼ\$]ĉT$ D$D$\$$? UЋMԃuMzu%E L$T$$؋]u}]ËEt$L$$]1u}]ËEL$t$$뺍UH]]uu}CuJE }<$D$< 4$觲t$D$ D$|$DD$$? ]u}]ÐUS]KtC]Ív$< C]Í&Uuu ]}u]1u}]]t]؉$}$fEfEE1ED$"|a<$E4E|aE!UT$$ED$D$ D$|$$s< x$f}ur au$茖0&1 at1D$E1D$ <|aD$`~aD$@D$$ a$+$<]u}]ED$t$$9  atċUt$D$ i|aD$`~aT$D$@$ a*듍&UWVSuu4$~4$vD$|a$D$E$[D${a<$UT$$E؉$|$: U؉UEEE@ED$$E*D$|a$4EЉ$\$9 UЉUEUEEE@EED$$;  aD$|a<$_E؉$|$@9 $D$|aEЉ$\$9 UET$$s; < auS4$e[^_] atD$UЍE؉D$T$D$ |aD$ ~aD$@$ a(뭉D$UЍE؉D$T$D$ }aD$ ~aD$@$ av(4$莓rU؉D$EЉT$D$D$ l}aD$ ~aD$@$ a3(D$|a<$#U؉$|$8 D$|a$[UЉ$\$7 EUD$$7:  aD$UЍE؉D$T$D$ }aD$ ~aD$@$ a'UU ESJH?BH~@BHJ ZH X?BXH ~@BH XJHJHJHJHJ H J$H$J(H(J,H,J0H0J4H4J8H8J<HUEE))ЉC13%t&UVSd]u E-1   UE썅$kSt!d[^]ÍED$$¸xz9Uty at{U u@"asl"a"a"af"au"a$z < uՀ~Fá"a$vHT$$x&X?t$$a $a t&DžD~UHfVD$D$a<$Ra! t€DЍAD҃)L$|$4$諙E܉D$EED$$b$U:E]$U4$T$D$SE$U4$T$D$2E$׈U4$T$D$D$\$4$譐}]D$\$4$膐uD$\$$蹘} ufVU$v$azPh;T4p"a"a4l"a$3a@zƅf Ef[]8t$$a2@"a "ap"a@"a*늍D$D$a4$託fDžV#"a !%tDJD꿣"a$D$"aE$FU$z|$a3y$Ԁa"yxU$Pgn$ayUWVSÁlf8tRƅD$D$D$D$ |$T$$荥1l[^_]ËHuA@ u:{u1EEEEfEC]ԉEؐT$ƅD$D$D$D$ |$$1dU1 rET$EEED$ D$a4$1]&ƅD$D$D$D$ t$CD$C$Cut$<$裂t[uE$͟E$轟1 U1U ]h}߉uufht)Yj]u}]ÐDžlD$D$$k/x]fDžj\$$0tWj]u}]ËaSaS aSaS낿]u}]É<$WBfUWVS<u 談]1 rE EED$aED$ ED$$`UEMD$ \$L$$袞 u^t$=1t&@u]؉$;}D$$KzE܉D$\$$pEDžDžFUԉ$D$]D$$D$sFD$F$D$<$ݤW8pumW8oFt{WD$D$D$D$ D$@"aFD$F$dD$@"aD$a $!W$tvD$D$D$D$ D$@"aFD$F$~dD$@"aD$&a $jt&V8 t vrV8 rxV$D$aD$d $E$螛MD$L$$n<[^_]ÍƅFDžtUD$D$D$D$ D$@"aFD$F$MdD$@"aD$a $9tU$rvUUMET$E $juѥDžt &U$:UD$ D$4aD$d $~EmFD$Eԉ$kFED$$]EԍMD$aD$ $D$ \U !%tDJD+ED$T$$輎M1! t€D֍qD҃+9K9L@ً⋍߉UЃf]9u Dȋ Lȉ4SED$D$ D$D$ $~DȋR0oR$D$|aD$d $`$貟$襟M܉L$D$$ kE$迗<[^_]f\$D$ $Uf\fR1ɋ$^E8Uu$|M$L$D$VE${U$T$D$5M ${$D$ED$D$t$$调}u3M܉L$D$$iE${<[^_]D$t$$ZuD$t$$荋} uɃ};U$)Ƀ^$踝-D$\$$`"aE}M`"a&d D$*D$$aD$ dKD$D$<a$NJEAd D$D$$܁aD$ KO$ D$@aD$d $k$轜$͔D$ŁaD$d $- A_O$蕾D$ŁaD$d $ +O$aUD$ D$aD$d $d D$D$$eaD$ I$ٛ"d D$+D$$aD$ I~N$贽D$ςaD$d $E8t&'U(UE D$T$UD$ET$U$T$ UT$ÐUED$$Ðt&UWVS } ~ Ĭ[^_]ËE $D$ED$gMDžADžxU D$D$D$D$D$ T$$ɖtƅDžDž|D$4$D$`ZrD$ 4$s+#t t  t jt&G_< < t< t< j< b< u(+t&< < < u<+Dž <@DžU <+SCDž|@D$ ҉ub t= tPӉ$t`tt!$虈 ut& u<+<-U <+#<-D]\$U$rЉ|$YĬ1[^_]Ðt&@l$hYxU  1aE$@$D$r !%tDJD/.rhBostsB(NjC$D$a$ET<$LUT$$E%=3aD"a$QX&(SC@|H&U iG_< =< 5>Dž|aA$c uz$v_UT$$Wx[Et6;Ct1aaD$a$aREDžxtaLaD$E$olfU8UEEEEUUfED$$T$UT$ U T$ U1WVS\u }U rED$ ET$ED$a$(¸uF]u ]t&[t:E|$ t$D$CD$C$uԋE$91\[^_]ËE$$\[^_]1琐UE E EE^&'UWVSLE]$ )EE{EEEE/ aEEEE$e*Kt 4$ӅtދE9Eu^}܅qe܋U܍M؉D$ $t`E$EUԅtGǹEMMx$tǹEUM؉UKM $,U؅t*Etu؋]$uE؉$ atD$D$O뽐&UE )¸Jw$D$E$e Ã~1 ~1 ɍ'U( at[^]Åu&Pԅu Pfu@P릍vu P멍vP뺃[P^]Í&'UMU +uA+B]É'Ut+"art+"awuD"a"a-"a]è"a-uը-"a-u"a"a"a]úx名&UWVSEĉ$EEZU M̋E$豉t Uĉ$ZM̉ $qe[^_]ÍED$E̍ut$$ 0E5UUD$T$$( E E܉D$Ẻt$$ E܅TPD$T$$( ƅ| U$D$1 EMD$D$ $l PD$D$E$L Uĉ$ZEƅLD$D$$ $ EE }DžDž 4?Y 9E_؀sM yGvΉpMd ^ uV*Y tGU+$,U@1;H cfD$G$t D$ $Qg) ak3sat&U zEW@1҃ E؉D$taT$#v덺t&aT$U؉T$$  _ T$UءaT$ G A:PE؉D$ET$xt$ $*t|D$G$t D$ $euS a@D$D$tf뒺E؉D$PT$vT$U؋ T$E؉D$ T$t&=e=#= )*E؋ afBKED$ D$$L$H E̍U]E\$D$$m Eԃ JM̉D$ $XkẺ\$D$E$2  aU M̋E$͈v|EDžP'D$D$D$@aD$ aD$aD$@$ aT==D$D$ PaD$@aD$@$ aED$ ]aD$@aD$@D$$ aaޝ:a%vDa ]OaDUaڜ+aD$ D$$@a a脜 U8}}]uD$"aD$@<$WxXLu83EMU $VXƋ$P auO]u}] a.sa20$P& at&|$t$D$ aD$aD$$ a]u}]Ðt& au'-sa끐D$D$D$aD$ aD$aD$@$ aDft$D$ taD$aD$@$ aL at$D$D$aD$ aD$aD$@$ aU( at+sa  auuL&`a"H|$D$ aD$aD$D$$ aC H$Pt$D$ aD$aD$$ aUWVS} ]G1EEE EEEEEEK E3M&t5[^_]ÁuˋCU$)  9q}MtE[^_]Ítf}Eft- t8h}En}E[}EHt&}E0}E}uQE}E} 1Ҁ}]M|MlE0bEuQ}u@&})M1Eut&]uMu]k'UVS u]D$t$$.t)~%t$$D$ > aD$ C 1[^] atUT$D$a$ME!Džƿa]"a{:sXuJ{؉$j)r0 <:4$4? aRDŽsa1e[^_]ËX]޿"aJ=(a{:suJ{؉$({0 <:4$]> t& aRDŽsa1/a{:H&$=u9]aft$D$ aD$aD$@$ a&vED$D$$s>ave[^_]ÍUWVSÍE\E1]ÉUME$btZE9Ft]F t8t2]uD$$t)C 8uދ]$aue[^_]Éދ]Et$$<tED$ED$E$|=볍v'UWVSÃ,1t" t1ҋDt9tD93w1e[^_]ÍvtUD$<$ Uu93we[^_]Íve[^_]ÍvUWVSӃ,E ۋU}ExaD$4$D$<l&a@qa$<aaaD$4$D$I<aaD$4$D$< }t$tCu1 Du9r,[^_]1fD$D4$D$;FU,[^_]Ðt&aD$4$D$;^faD$4$D$w;faD$4$D$W;faD$4$D$7;f|aD$4$D$;qfxaD$4$D$:aD$4$D$:'UWVS\EaUM\9}t aUl&a1ۋ9@atuD$$TaG&wM sv$ljEZE1 @a@@ H 9vދUĉ2e[^_]Ëut aME1xEEE&}KME܍UT$UD$ MD$ $ utM܅t_1ۍED$EUԉT$D$?t4UąMċ1tYȋ}ԉMtE 9Hu;8u;]rE$F EEUE0;=}t&~U MĉD$ $vM؍4UF 8NVuEąu}kaM;]܉X1눍U܉T$ UML$D$$ NjEąt Eĉ$E$C~  aD$ aD$aD$@$ a aD$ aD$aD$@$ at&U( a]]uu u%`atQ!!]u]Ðt$\$D$ ǍaD$aD$@$ at`au1뫍UED$$gÐt&UWVS|] aUu }EUEEEuj\$$~5f$ [D$ލa$5t9z,e[^_]ÍSED$ aD$aT$T$D$@$ anE\$$4aE܉D$ED$ED$ Et$|$$D${ &e[^_]Ít&BE,Ċ8tAuIȻ\ME؈Ċ8tAuI9Ev7E)=~3E+E=$KZ]͋M$볍UWVSLE  }]؉$-$Ut$D$$ a$$M $9AfK1UT$D$D$ |$D$4$y an`aE!!`$ axu$}#e[^_]Ív attd$L$@芷 @u0;{4i눍vX:td$L$B sEH4~Y11ۋXt&09_4~;<uG8x,u`@@u1D]HD@$D$衶 ‰v'UWVS,] EE EE$@虞@J B,09uE1E EEEDŽ\rEapaDž\EEtED$DaEEExEDž|EEEED$D$ D$D$$蔄 a>$11|EEEEEDa7 a-9tuȉt$D$ D$D$$ =# aU{<MuL$}EMD$t$1|$ 1 $ t&M`a!!$E$ Eԃ$ 4$ <$ED a}EЋUe[^_]ËE$蔃  a$11E EEEEDat{ a9„ҍut$D$ D$D$$! =# aM1 {<MU1L$ME|$T$L$ M $ AUE܍*ڜ \$C҉tM110Dt9uExLE̋UD$EĉD$E$EMl&a@@tUD`TtD$0E؉D$,E܉D$(ED$$ED$ED$ED$\D$Eԉt$ \$D$ D$$蛲 4aTM'Eԃt $L t4$mt<$aE aeED$ ;aD$aD$@D$$ aqEЃ}U:2$諘e[^_]1UED$EuM\$T$ D$<$ &EЉD$ED$D$ D$@aD$$aT aD$ 'aD$aD$@$ a胞D$ "aD$aD$@$ aZYt&Uȉ$ljtD$Dat$T$ D$$谭 E uȉt$D$ 8T$D$ $l Q(,EUDa}E$ t&D$1D$ ԏaD$aD$@$ aVEL$$訮 DafŐED$D$$D$ 7aD$aD$@$ a躜 auUXD$ aD$aD$@$ axM $ aD$D$ aD$aD$@$ a3Da au$žD$D$ ԏaD$aD$@$ aÍvUWVS,uE EE$@耕@J B,09uEED$DaEEEEȁEEEED$D$ D$D$${ a6fE]fEE_a$_ E܃D$ED$$Ve  aamOEEtn$^d u`a!;!${E$٣  au_}EUe[^_]Ðt&Mt2`a!!${E$z  atED$ 5aD$ aD$@D$$ aÙE}Uvn$e[^_]ËE${N a[D$ 7aD$ aD$@$ aH2vˢ EԉD$EfE fE Ea\$$Qc  aUaM.D$ "aD$ aD$@$ a跘fD$D$ faD$ aD$@$ a肘& aD$ aD$ aD$@$ a?xt&&ED$D$$$EFpalaƅvfDžhfDžjEE DžpCygwfDžtinUx<EE{EU D$E]D$D$ D$4$ Il&ax1 a}u(t$D$ aD$`aD$@$ au a111ҨMtoUay,PaH $DD$Za|$D$aD$ aD$aD$@D‰D$$ a肖 aƒ0;]yuU11Dž8vz,09u0ɉ8,4Dž<SRE9}>H,ǃ0ux$f 4<89<}mu뫻߉D$D$ aD$ aD$@$ anrDž8Dž0Dž,Dž4EUD$E$EMD$]U$蝧 áa$苧 ơa$y T3,ƒЃ(譐 |$GD$T$<$ pMD$D$<$D$ 辥 DaD$D$<$D$ 蒥 aD$D$<$D$ f U$覦 M Sáa $D$E xa<< $n ‹EQ48(Љ$萏 $U\$G- EyD$EȉD$ D$ẺD$ C D$$D$T NaH $ɕgEU D$E]D$D$ T$$D$ aD$`aD$@$ a赒QD$ ːaD$`aD$@$ a茒 aJaD$$D$$ aMǃǃǃ(1ǃ@4$诤 R8T$t$$舣 U $舤 0Q@(T  ,D0Dž,1ɉ;8,Uk0U΃9,|2,2N0u܃,xo0DDl&aDx2$谣 R@0\$$T$胢 E0 $肣 0S> <4$ $J t]u}]Åt͉D$$Қ tdau…Iu;HUD$ $苚 Ut*a2x<$gt@떈U<$sUIA뾐v'US$] Eۋu 1]ÍtD$E]fEfED$$ ؋] ÍUWVSU }uE E e[^_]ËtE S-1-@$詚 @$D$ aD$^>413&\$$w 4$D$#aD$&>Ƌ$Z 9rE e[^_]Ðt&UWVSfxt71UԉT$t$$v x E@rE؃P9wˉ$p0f`PvfEufECUEEEEȉD$ ED$EuEED$@ D$D$$s 'E$D$ D$‹ET$UD$E$t EM$s MUFD$ aD$]D$ \$$D$u E at,D$t$D$ PaD$`aD$@$ abE$PFf atEątM$n Mx$Ee[^_]1fEEasEe[^_]1u EE~U8]]}׉ډuEEt!$]u}]t&E$E$V]1u}]t&U8]ˉuu }} t0t a]u}]vBtʍMEE$MtFq8XtdtdE$]u}]t&Eډ4$E$f]1u}]t&tE$;/aE$&'U8]U]uu }L$ \$T$D$$do x'>$o D]u}] a ]1u}] U8]U]uu }L$ \$T$D$$o x'>$n D]u}] a}]1u}] UWVSӁDEĉ$o aV M UET$D$EE<$m  E%уȃEDDEDDD8E98 ؀8E ؉%!Љ$ M1Dž(%!t$>8hJ(D$D$E$0[Dž, j84 u # (taD$T$$0Dž, D8 utC @9됃u at$D$ @aD$7aD$$ ay4e1[^_]UD$<$UED&t$CD$ %aD$7aD$D$$ a4UVS u  a^4\$D$ VaD$`aD$D$$ a3 t2C$d= D$$HC$R= $, aF4t$D$ jaD$`aD$$ a;3e[^]Ít&tyfD$D$D$ VaD$`aD$$ a2뭐&UH]]Euu }}D$D$ D$D$C$^B xEu E$]u}]fCڍv'UxEEuu]Ӊ}M E1EE\t1E؋]u}]ËUED$D$ (t$D$$A u#}um a@U̅tf atHED$ taD$@aT$UD$$ aT$j1EUfMЉ+U̅҉Uuv-% aHED$D$T$UD$ aD$@aD$T$$ a0E aT$HEL$D$ aT$UD$@aD$$ aT$0EtED$ aD$@aD$D$H$ aD$ED$D0 UWVS\}_NC09C,NtE a.ED$ aD$aD$$ a/Et&$5`aME@aFhM; ""@ahuVE$輮Eff f!ED$ ED$t$$ > D$$4~>ED$ ED$t$$= jGe[^_] auGe[^_]ÍvD$ aD$aD$$ a|.GƐ@agG 듋M#}uEӉD$4$|ED$$l`f}a+G>'UE 'UX]]u}C$;5`aEԸ@a4f; ""<@af{tb{uJED$ EED$D$D$$#< uW a]u}]ËUԍEED$D$ D$D$$; tuur1 atUԉT$D$ xaT$ED$aD$$ ao,EЋ]u}]ø@aeC ]u}]C a,UԉT$D$ baT$끋UԉT$D$ IaT$gt&UE 'UW1VSt&E1X[(tA{ auD$$EExt aube1[^_]Exuu$4 P atD$ aD$aD$$ a+D$ aD$aD$$ a*uUh]]u}C$;5`aEĸ@adc; ""@ad{t{uCED$D$ D$D$Ẻ$ t#C auu]u}]Ít& aC]u}]fUD$D$ D$T$늸@aUcC ]u}]ËUĉT$ED$ aD$ aT$D$$ a)E]u}]ËEĉD$D$ ȨaD$ aD$D$$ aG)/fUE ='UH]]u}C$;5`aE@aa; "" @a5b{{TEuS1{t;}t2$MC at&]u}]Ð1}t{u_fVG09G, aJCh@azaC ]u}]Ít& af.HD$ aD$aD$D$$ a't$HD$ AaD$aD$D$$ aj't&<$3D$<$4$Mtz aD$HD$ aD$aD$D$$ a&D$ aD$aD$$ a&C1$  at.HD$ /aD$aD$D$$ aH&1{tCf{Cf au$1{tC{[CpRD$HD$ aD$aD$D$$ a% UW1VSt&EXt&[(tA{ auD$$PEExt au=e1[^_]t$. EPxte1[^_]D$ aD$zaD$$ a$띐Uh}}]u_C09C,vG]u}]Ë|x a$5`aEĸ@aM,]M!; ""4@a]t*t$ ag]u}]Ðt&ED$$1 EăD$$1 |$- EЃD$Eĉt$$0  a- =P af1" a.ǃ|D$ $ - E܁ÔD$Eĉ\$$/  aKD$ naD$aD$@$ a""fD$ aD$aD$$ a"pfD$D$ VaD$aD$$ ah"G$t&@a[G ]u}]= aD$ aD$aD$@$ a!OUԅD$Eĉt$$. K+ =` av++ =ucf1 aD$ aD$aD$$ a`!1E{$ * 1n1ga h aG u3;D$ }aD$aD$@$ a E<$WEe[^_]Ë]u a}̅}E}lp|T$UD$$vpxD$lT$$vptT$UD$$~v}%El<$D$ ET$D$EE}  E<$E at-`dt&p($u`d}E a-$ amD$'D$ $T$ EE 19eV at&Eo1U U t<$T$xD$ |T$D$fEL}tOEEED$ aD$@aD$D$$ a}̅1҃} t'e ؃ډUUE1 F8[E}t&\D$ 4aD$DaD$$ a\'EE;E] U)U  au UΉE \D$ =aD$@aD$D$$ aU\ӉQD$ aD$@aD$$ a](D$ aD$@aD$$ a4 ad-1E}}E}  E a]t{($ uED$ 4aD$DaD$$ aD$ تaD$@aD$$ atE$EQLD$ paD$@aD$$ a+UWVSL] aDKMb;i)01҅ an}M}5U MU Et$<$ aU\$$D$ET$ UD$ aD$aD$T$U $ aT$UT$-Ee[^_]fUE\$ D$ GaT$U D$ED$aD$T$D$$ agCKMb;i)u 1҅‰ auK}MU Et$<$ ae[^_]Ít$L$|$D$ daD$aD$$ a  al&EP&%? |$7T$D$<$p4t&EP&%?U ET$7$U܉MD$D$pU܋MfEP&%?D L$7 $MT$D$fpMD$D$ aD$aD$$ a'UWVS,d}]-1 pE  U؉E܍$?¸EUJMbE)ʅۉUd-1D$$UED$E T$U|$ D$$d4$1T$Qde[^_]ÍED$EU |$ D$ET$$u뻍vtd-1D$$1벍US] S0t/C,@ a@ a@ a@$@ a@@[]f$ C0u㐍v'US] K0t/C,@ a@ a@ a@$@ a@@[]f$ tC0u㐍v'US] C0t/C,@ a@ a@ a@$@ a@@[]f$ C0u㐍v'US] S0t/C,@ a@ a@ a@$@ a@@[]f$ C0u㐍v'US] K0t/C,@ a@ a@ a@$@ a@@[]f$ TC0u㐍v'US] C0t/C,@ a@ a@ a@$@ a@@[]f$ C0u㐍v'UE uu]X,St+C a4$CCC؋u]]CP aC  a4$蓃뽐U(E @,Ht@ a@@ËU@P a@ ` aE$PEΐv'U(E @,Pt@ a@@ËU@P a@ ` aE$Eΐv'US] K0t/C,@ a@ a@ a@$@ a@@[]f$ C0u㐍v'US] C0t/C,@ a@ a@ a@$@ a@@[]f$ 4C0u㐍v'US] S0t/C,@ a@ a@ a@$@ a@@[]f$ C0u㐍v'UE U@,x@P aP@ a@ a@@@$]Ðt&UE @,Ht@ a@@]@P a@ a@$ aؐ&USU EZ,St)C a$CCC؃[]fCP aC aUE @,Ht@@ a@@]@P a@ aؐ&USU EZ,St $CCC؃[]CP aC aА&USU EZ,Kt $CCC؃[]CP aC aА&UE @,Pt@@@]@P a@ aߐ&'UE U@,Ht@ a@@]Ðt&@P a@ @ a@$ a̐&UE M@,Pt^@ at*`@@ttP@]Ív@@uˆP@@P a@ @ a@$ a닐&UE U@,Ht.@ au @@]úP@]@P a@ @ a@$ a@ auʃv'USU EZ,St9C p aC aCC$CC؃[]Í&CP a뾐USU EZ,Kt+C a$CCCC؃[]CP aC aō&'USU EZ,St+C a$CCCC؃[]CP aC aō&'UE @,@ a@ a@  a@$` a@@]ÐUS]D$ 8D$CD$$ aCxC C uC$C4C,C0C8C(daC.dl[^_]É|$t$\$D$ LaD$aD$$ a^dE-1  UE$-¸tdl[^_]É\$]|$ t$$$LtMu@ au_ut&Bsa20}Xu$ jc vEtE a$OED$ vaD$aD$D$$ a-u amt$D$D$aD$ aD$aD$@$ aAsa20}X6E a$U8]]U u}sUD$ t$D$$GU( aEuOM1Etff=wD$B4$D$C]u}]ÍvfC{E럍&'UWVS}] $Xa t$+EEEED$$AD$E$s*D$E$p4$D$XaT$$t$u܉4$ ?EUEE$D$ $ Cf}1D$1t$$= $$ Et&ED$D$E؉$ZE$e[^_] au$,?sae[^_]D$D$:D$aD$ @aD$ aD$@$ a랍D$`a $#o4$D$Xa T$$t$u܉4$| t+?t&E$EUEEt$D$  RR$ AtE1f}C<=4u f}LUla舫1vۿ2T$$$t 1t!D$\$aD$x Dž( a$vUST0at]Ë`a`a$D$p2a¬ =eaEl2aT$D$daD$ 3\$]$ EEE]hD$#D$$肂ED$$0aEE؉D$ x 0a]ÉD$\$$a+&UST,at]ÍED$D$ D$D$$ E`a¬ =eaT$l2aT$$D$ p2aD$D$a\$]$ EEE]܃hD$'D$$MED$$,aEEԉD$ x1,a&T$D$`aO,aD$\$$a)SD$(\$ D$aD$ D$$$D$X؃[ SD$(\$ D$aD$ D$$$D$ر؃[ l$`$$\$$h$x$dPk=La<$1aD$D$<$ E \$|$D$D$ D$$ U=1҅up$1atg (1aT$ $|T$T$u1T$$ai%',D$HD$D$DD$D$@D$D$=;@gdu axt{D$C$aD$4^`aC D$ t u\$Lt$P|$Tl$X\Ít&D$8$ uaD$8D$(D$a)hPFah0ah0a h0ahah0!ahahah`!ahPahahah`ahahahahahSauhf akh`J aah aWhaMhUaCh0a9h`a/hPWa%hahah`ah02ahahPahahahpah`ahZah8ah:ahah;ah@ ah`:a{h`<aqh:agh a]h|aSh "aIh#a?h#a5h a+h%a!h'ah a hah`(ah ah^ahpKah/ah@ah0ah5ah0ahpahah`ahahcawhpamh7ach`9aYh>aOh`2aEh a;h' a1hAa'hEahaha hEahNahOahpOahp$ ahpahahXahahahahahOahQa}h`ashaih a_h aUhKaKhaAha7hБa-ha#hahKahUah ahah]ahVahPWahqahWah@ahah`nahx ah nahnah ayh@naohaeh`Xa[hYaQh`YaGhv a=h a3ha)hahah`a hahahah ahpah0ahahr ahHahБ ah@sah  ah` ahahЧauhakh0aahaWh4 aMhp[ aCha9ha/h;a%h@ah2 ah1 ah01 ah / ah. ah0 ahP/ ah ahP ah0[ah`ahpahIah@ahAahBa{h`FaqhFagh@Ga]h`[aSh[aIh[a?hx a5h@ a+ha!h0aha h.ah /ah\ah\ah0\ah@]ahP\ahp]ah ah@ ah ah ah0ah ah@awh@^amh. ach( aYhaOhP aEh a;h0g a1ha'hah aha h^ah0 ah ah.ah.ah0bah#ahPah#ah@"ah& ahahah # a}h@ashaih@a_h0:aUh2aKh9aAh@8a7h7a-h8a#h06ah_ah`ahahahbahahah0cahah@ahPahЁahah/ahPahayh aoh0 aehPa[hS aQhM aGhP a=h`E a3hPS a)hR ahO ahS a h S ah0U ahahahahahahah@ah` ah ah>ah^ahbahPauhiakhjaahRaWh@YaMhvaCha9ha/h a%hPah ah) ah* ah+ ahKahPahpahahp5ah`ah/ ahahpjah! ahpfahja{hpa aqhagha]haShaIha?h`a5h@a+hpa!h@aha hah ahahahahahahah`ah ahb ahahahb ah awh amh achaYh@aOhaEha;h a1h`a'hb ahPa aha a h@*aha ahah@ahPah ah b ah aha ahahah 'ah6ah.a}hpb ash.aih8a_h01aUh3aKhPAaAhCa7h@=a-h>a#h>ah?ahCah0BahDahEah`a ahahb ahahahah !ahah@&ah$ah#ayh`%aoh`b aehb a[hc aQhaGha=ha3hPa)h(ah)ah`<a hb ah9ah:ah;aha ah@c ahpahahlah`oahpahqahah`ah DauhHakh@qaahqaWhqaMhaCh a9ha/hZa%h[ah ah`dahPah3ahp4ah` ah ah0 ahp ah ah`ah% ahaheahah`ra{h`]aqhcagh0/ a]haSh 0 aIhfa?h`a5h02 a+h2 a!hP3 ah5 a h9 ahp= ah= ah\ahP]ah\ ahc ahd ahc ahU ahc ahc ahc ah\ ahc awh . amh0 ach2 aYhraOhraEha;h0a1hP,a'hPah@)aha hP1ah 1ahah@ahqahrahp ahahah7ahP3ah1ah+ahP*a}hp ashaihxa_h *aUhp)aKhJaAh?a7h@Fa-h sa#h! ahP!ahC ahE ahpX ah@O ahR ah@U ah ah ah` ah0ahah ah ah ah ayh aoh@ aeh a[h aQhaGh a=hО a3h a)huah ah`~a h ah`(ah(ah&ah%ah%ahP"ah$ah#ahxah|ahah`ahahpauh:akhaahaWh`5aMhaCha9hda/hea%h0ah`ah`ah ah` ahhahahlahnahahahPahahah ahah@a{h@aqhaghpa]haSh[aIh\a?hpa5h~a+h0a!hmahoa hlahnahahzahahahah ah ahah@ahah0-ahuah  awh0amh0achpaYh aOh0iaEh`a;h>a1hHa'h@ ahah0[a h`ah?ah?ah6ah`ahah0ah ah!ahPahPahbahpahP4a}h`aash`7aihaa_haUh0aKhpbaAha7hPca-hda#h0zah ah` ah0dahdahahahahah ah ahahЄahPahahah`ayhaohaeh a[haQh aGha=ha3hpa)h`ahaha h0ahЊah ahah ah0ah@ahpahahahah`ahahЇahauh akhaah@aWhpaMhaCha9h`a/h`a%hahahPahahahah0ahahah@ahahaffUWVSÁ\EEd-1  UȉE̍$t&de[^_]Í&$C "a [ȅU܋PUHMH a{ rUЋVUԋVƉUuEЉV@MԉNK V…6EGGd1T$ t$M܋D$T$$\$M䋍D$ ԻaD$@aD$L$(L$$ a蟩l cEЋFEԋV5"aU…tE8x6px/ɚ;'}t!Ev}t}t؋u]}]E D$dEcD$ $T$ɡ Ӏ}M] ك aM]udaU>}1ۅtLu}D$D$ 4$|$K MD$D$ 4$|$ڤ UkdB a M11tMQT$(UD$$M BD$ \$L$D$ HaD$ED$aD$$ aD$胤؋u]}]Ít&UE1ۉD$$,EM؋89s}ȻigMŰUEUȺQM̋M܉)‰+UM̉UM at2Urt$|$D$ ,aD$aD$$ a迣daU1ud-1ru};P9U&E>ՁUޱZt&US$E D$$D$ ED$u1$[] at8D$D$D$`aD$ aD$aD$@$ aآsafU(EED$$EED$ ED$K1t 1}EÐt&UCS4MD$ D$$ED$Ui@B)iMu 41[]Ðt& at8D$D$D$@aD$ aD$aD$@$ aϡsa4[]Ðt&U(]Éuu}vT au]u}]&D$D$ }aD$aD$$ aH뻍dE-1   }E䍅 $pǸu-t1ttFt9$t$ t1d]u}]t&! fU8d]]uu }-1$Eىu auo]1u}] at8D$D$D$aD$ aD$aD$@$ aߟsa:8 at2f\$t$|$D$ aD$aD$$ a萟]u}]ÐU$]Éu։}n7؃^C@؅ aDžD@T$DD$ ļaD$~aD$T$D$$ aD$˞D]u}]Åu}{@ut a1]u}]Ívu aDžDtP1ɉ&Dtl a1DžD audsa1 aDž@DžDDž@@ a[vD$D$D$~aD$ aD$aD$@$ a脝[D$D$ aD$~aD$$ aW aDžDDT%TDžTDžX%3t&UWVS\ a1UEEEEEED$$}ME11EEE"a 9 9}vqE܋\0 [tUtŃ}~ E9 uˋU  a9atEE9}w]t TabUąw at;U UD$ +aD$@aD$ET$D$$ aD$蓛EЉ$}Ee[^_]ÃEnt&C atu@D$/D$a$T@$D$/UD$TUT$D$ D$D$ aD$@aD$D$$ a9a_U t&(9(K{U D$ aD$@aD$D$E$ aD$腚U aDEE~ at;5a aƉу11Ƀ=aƉ؉׋S|VP@SaL$M܉E؁|$\E4ED$a|$\SM܃t$L$$\ML$C$s\C $譍 t. aЃ1Ʌ&C D$ aD$aD$D$$ a腃륍v t&ED$ aD$aT$D$$ a9E Cƀ#v|$D$ aD$kaD$$ a aуu`v1t&hvaD$ aD$kaD$D$$ a胂 aу8]]UFҋX @$ F aHЃNRD$ #aD$LaD$$ a avЃD$ aD$kaD$$ a趁 aЃt&F@,# 1a\$t$D$ aD$aD$aD$$ aD$;lahD$ aD$LaD$$ a?Ѓ" aCCC g$蟊 la alaECMu~@ RD$ {aD$aD$$ ao aaD$ haD$LaD$D$$ a- a@sCL$D$ 0aD$LaD$D$$ aSD$D$ aD$LaT$D$$ a aBD$ D$D$LaD$ aD$aD$@$ adD$ OaD$LaD$$ a; a\$D$ aD$LaD$$ aD$ `aD$LaD$$ a~zaD$CD$ aD$LaD$D$$ a~D$ aD$LaD$$ az~D$ <a^D$ D$D$$LaICC gUVSÃU=Ta ~ e[^]Ív5lat at⸠aXa蝶 tɋFt 9tƋFuea[^]? $1 Fae[^]t&UWVSӁdaa-19la1)@ED$ @$Dž@D$D$D$跈 ډhaY aaPa\$$= À@aZ=Ta Taa,ڸa^'a1aut $ ډgtuB@at|$Džt$o ^`a !E؋ atl aaPa\$$P À$ED$D$$ @t&f=aua'aatbf=a=TaF D$$  au[\$D$ $aD$,aD$$ az,D$ aD$,aD$$ azvaaa'=aI t&UVS  aau4 at$D$ ?aD$aD$$ aDz [^]ú@a޲o a~Wa1atdaC@Cta$讋a9Cta$VN95aaa*4t&f=atiC@Cua9Ct$N95aS롡aD$ aD$aD$D$$ a2yaαa蔲aqad a`f=aHaaEa!&fUdatD$ D$D$$La DdaÐU1ɉS$`a D$$oD$D$GaD$ D$aD$a$Lfuraapaa$0܃@a@ a@ @$@,躁 \$$>aD$辆 ] É$ R$Pa!UWVSÁ =a:܉4,3EhC Cu AAu1u'~ CD$D$$@ Q UD$D$D$T$ t$D$<$ a+ a <$  a>sa ac3E؅M$ 4 aI2f=at;at `arat48a@ q aosa3 qEؾ>D$D$D$@aD$ aD$aD$@$ a usa a3uyE؅t $H~ 4tH aue[^_]Ðt&D$t$D$ aD$aD$$ attfut&릅t4B t $} 4AZ$} Jd-1;lax`a?cƅ*aUƅ+ a9+t"4E84%󥉅@aDu D,*ẺU3t4Ag8E܉D$ ED$t$T$$~ (+ aE$@| H| ma(3l,s,E4P | D$D$D$t$ |$T$$l| ƅ+ƅ*5 aEaO't&a@W9u* aED$`$g{ ÉƋE؃$z Etz5ata@  atED$ aD$aD$D$$ ajE$nt ED$ FaD$aD$D$$ aj4B$$$f L$/,ωʉ8tf,$Ɖ4ƨA$$4$ D$L$z $+,11`aE䋍4D$D$D$ aD$aD$D$$ aiD$ |aD$aD$$ aiUWSÁtu=au51%d؉ddDžhe[_]ft;t6B*w>haT$r Taa닍e1[_]Í&d-19`adfUTaE=daTau au_ ~/ atD$ aD$aD$$ anh auC`aD$ aD$aD$$ a'hvD$ *aD$aD$$ ag뗍v'U TaEu3d19latHat<a҃'t&Ua¸tE1ÍvUSd19lat¡a[]aTaTaat9tˋuPaTa[]ÉPaTa[]Í&UWVSdD$ D$D$-1la$La02 aha<Dž<4t&aU䍵E܅t a$o <C$at&Taaa1PataۉTatQ30ڋ;La+׉ȉ Tau;DTaPau31Ҹ" aa D$ aD$aD$$ aOd$>&1Ҹ a=e<]ؾaUTaat#ƅJt ufTa5PaS$=~TaPaLa Ta&D$D$ aD$aD$$ aXcEa1aut $l  aug$Cm `a@EEERt&aD$ 4aD$aD$D$a$ aD$b:t&D$ aD$aD$$ abp!i<aa4׹)Mǀa|aLat5HaLaHa a\$D$ aD$aD$$ aam&'UWVS,]UE MCfS`aCCC 7SdaC$C(S"aS l&aB (aC@HC0 atqCumC44bk [k Tk D$D$D$\$ |$t$$0k e[^_]Ðt&tD$ D$D$$Xa8,KC, a[C,D$ aD$aD$D$$ aa`+E(aEaE E ae[^_](`&US]D$ D$D$0$&CH[]Ð&US$E]D$dD$ E $D$f{t]Ë4"aCL=daCPt&at-@atJaCHa]Ít& atD$ {aD$aD$$ a#_aD$D$D$ aD$aD$aD$$ aD$^ut&D$ D$D$$La<*CPt=da0$Xa$t&U aɸd&'US]C($g C$aC(C$acD$CPa$g ]Ð&'US]C,tO$Gg C4C,tO$.g C$C4tO$g C(C$u=MfC4t$f C4C$t$f C$C(t$f C(]UDt&UVS]CTp t}auCT@ aCTf{Pt{$Cf CTaCPCTt$"f CPf{tmfC]e[^]eaCTf{tPt$e CT;aCPCTt$e CPf{uCtKLt 1Ҹ[a聕lUEWVSfxt[^_]@t=apTF~Ẁa1ɋZXXZX ZX$9Nu[^_]Ív'UWVSLEXTP4KUą~d1}̉D<$D$ D D$EĉD$3U܅t4pEtE܅t<$/;s|L[^_];s|L[^_]Ðv'U(]]uu C,Xath auu7]u]D$ aD$LaD$$ a{Zt̋C,$c C,]u]Í$d t| auu]u]ËC,D$ aD$LaD$D$$ aY aED$ aD$LaD$$ aY$aY&UWVSÃL@,UԋuE aEEt$ D$D$$vc w4CDD$$g  aCe1[^_]ÐED$ aD$ aD$D$$ aX1ҍe[^_]úEET$UD$ aD$ED$ aD$$ aD$XU̍Et$ $UD$D$b Ũ9ЉS9Eunf{CD aW‰D$CDỦt$D$ 4aD$ED$ aD$$ aD$ XUCDD$$f 1҃1뚍t&  aEL 4"aWỦ$!a U8&'U8]Éu@Dt| a~=t=wE=t4X=Cf1Ɂ]u]=Bti=5t=:uCtO]u]ÉD$UD$ caD$aD$$ aVCDU=MfK qɉs mCD$` CD]u]ËK ɉK yC 5& a$UD$ paD$aD$$ aVCDU=ka=i=E=t&US$E ]teUT$D$ D$aD$$ aS_ D$$` C ~_ D$$` 1]Ë[ 1]ÍU $] t$U|$i0uD)ljǀlt,hlt&$t$|$]Í&hluډh$t$|$]Ðv'UEtpt;ltt]Íptl]ÍU1Utɉpt t]ÐUWVSLt$hD$x|$tT$hD$D$d\$`E-؃ڋt$!1ۉL$!։T$t&D$T$<$t$D$T$ R T$aD,D$<$t$T$ D$P lj u9\$l~#L$p1t$lL)9|D$l)ŃD,EL[^_])օ=\$`1E+%UWVSӃ\l$x$$T$xD$D$t|$pf-؃ڋ|$!\$1ۉl$l$(!ljL$&D$T$<$t$D$T$ P T$fafD]D$<$t$T$ D$O lj u9\$|L$~&$ȋT$|f09|D$|)؍ AfD]f\[^_]f|$)D$l$T$l$|$p f+t&UWVS\|$x[ T$t\$pD$;D$<D$4t<%tPT$tuD$<L$4 $Z +\$p|$;t #a薊\[^_]ÍBD$tr%t:+tUN҃JD$tv3?D$t@CT$t`&%T$tG$4at&BD$tr랋T$tD$,T$tT$D$ $^T$tT$tËT$tD$,aoDD$D$@$^ T$@|$,1ff~w)ff9v{Bpf tfwщf a\CxaKaaKCKff9wT$tD$3 1D$3wD$D$l$ D$W$T$D$OD$,7GY V1VB<% tL\CxBaCBaC 9|$,u D$3 1D$3wD$D$l$ D$$D$L$lD$3 1D$3wD$D$l$ D$$D$L$*D$3 1D$3wD$D$l$ D$$T$D$D$3 10KCxD$3wD$D$l$ D$$T$D$D$3 1D$,D$,|$;u$a#aI迄D$;"at$D$$(W  aDD$3 1OD$3?L$,ى$ D$D$D$l$ |$D$RT$t|$,D$3 1L$N$wfD$ND$JgD$JT$Ju~D$,oT$@$D$aZ RRT$@t&D$3 1D$3wD$D$l$ D$W$T$ D$<~ , erCrno C`D$D$D$D$ $T$ D$.:Jf|$;t0"a<$Mf$a#aL$(tL$(D$;먽D$,y|$fS Jg4[]f$֐UWVSӃl aM3EЉE$U$ZMuăME+D$a4$%EYEdaE EEEċUD$/$诫wMD$ D$$L$D@W9 ET$+T$UL$ D$$UMEUE aME܃MUE܍ED$;D$$"^U tMz.a\t$$_ a$UM؋E$o5 uCt U9UMċr1AMĉ $膭PI>‹Eĉ$UD$赫U aE 7M ҉9CE$U$D$a4$EuEdaEMډ$aUą}M@Uĉ$袬Pe=Mĉ‰$UL$ѪU aM tWE ҉8toM $ Ue[^_]E1E. aM t M 9tEU$˥UЍe[^_]]t at>U\$D$D$aD$ oaD$ aD$@$ aQ:UU6 saU{t&t$UD$ aD$aD$D$@$ a9U"vD$D$ aD$aD$@$ a9vEt&E$t&Et&yE8jPUxZED$:$AE7},D$\4$$St ~:E11H@ ȅE8BErMčED$:D$ $Y 9Eb/t$$Mċɉtt9=Mĉ $莩PQ:‹Eĉ$UD$轧U1D$U$U*E.@/Et$$pEMNd$0;  au11>#4$k= uFuja%t 2a:Gu u11ۿaM E@e[^_]ËE 8UۉBtD$\$$aML$t&EċEEPaEȍED$`@D$T$ D$D$ $@ EMЉL$$> }&azkU11D$ aD$aD$@D$$ a/>#Z119!Gσ<$D$aŤD$a߉$誟 @+ T$+L$$D$  tDu< t< uy<$D$aǀ?tOucN~ZFV ЋU?B U4$: $8 d1v 8 = aD$ aD$aD$@$ a?.E؍Uv߉%t 2a:Gu u1Éȅֿa%t 2a:Gu u1؅ֿa%t 2a:Gu u1‰ȅE$$= 8ae[^_]Ðt&="u؋E u@tƹuU@t&$6 뒉4$8 $p6 UB au(ssa1UD$ aD$aD$@D$$ a|, atD$D$D$aD$ oaD$ aD$@$ a7,]1҉M$stM@^EOUWVS| ҉E8U  a EEE0EEEEE a$ _EЉEEEEEDžDžDž DžDžDžDžƅ DžpDžDžDžDžDžDž$脕$vDžljd-1   $[ Džr>1ۋBTt u E]E+UET$t$$$MC }1E D$ ‰T$D$<$T$Euk@`a!!$l$aD$`a a!osaE$Eb$I+$]\d$荓$5E^$*UV]~1ۋ-U;]|-Ee[^_]Ðt&n8 N  ath!9`!!!ED$$D$T$ ED$D$D$ LaD$LaD$T$$! (‰ D?ƀ,D$D$B($! D$D$B4$! 0D$a$[5`a1ɋ D$;D$$՞ljT$`a $|$ D$D$$ $ xD$ aD$aD$$ aDžED$(D$ T$$ED$D$D$LaD$ LaD$T$D$`a!$ ,‰4$U $ $U $T 8D$D$ 0D$D$$F# H at$D$ _aD$aD$@$ aEUa# $/jPa_ at^D$D$ $T$ UWVSp u $4$FD$ED$Ha|$ D$Pa$躼$ 1Džt=a=da;=aD$\<$B9t D$$7D$.$tD$^a$!Z~ Ba@aDauԉD$D$ha4$ڻfDa|$t$ EÉD$ED$E $謻U҉tE t]l>&Cps<$&`uD<_t><$$a$D$(ruED$$r9]sv9t8 SB9Er1Ҁ8*Ћl9sщƉ9wl):B Bt+lDtUE T$U$T$|tU 9U sJBtq tO BBa+E e[^_]Ë 9"a؉$#9E sHPt^ t딉a+E e[^_]Í& uD$ka4$D$Ĺft&멐t&pwt&D$߉\$$ D$/<$8…ҍ@D&UVSE5E\$D$ E s 4$D$paD$4$s$D$vaD$C $G e[^]ÐUSD8t]ÉU Uԅt]ډT$ D$D$~a$聸$ t&ULWVS]h EƉ$4 ED$E|$$D$ ED$}oE uHu4$ e[^_]ËE |$$T$ D$4$ e[^_]$ UT$ D$|$$T$ $ $ t $e $ $ (D$D$D$D$ @aD$D$$a ED$ $D$D$|$ $ D$$a轶$1 U(ED$ED$ ED$E D$E$ÐUSÃ$aD$ aD$D$D$a$D$,aD$(aD$zb2aD$ aD$D$D$`2a$D$f2aD$d2aD$.l2aD$ aD$D$D$$$[]Ð&'UPE]uÉ։}8t ]u}]; tt$uʉ\$ D$D$a4$4$v ;t a aJD$L$ zD$ a4$D$趴=a$D$ 0aD$D$ t$|$$D$ _aD$D$$D$@&aD$ saD$D$$D$ 0aD$D$]u}]ÉD$D$ -z|$zD$$  D$a4$D$迳 v'U(EĀt'UT$UD$$ aT$ U T$  auɐÐ&'UWVS,}tY5Dat#9@atO1 9@atB4Dau|$L$T$D$ aD$D$$v,[^_]É|$t$L$T$D$ aD$D$$>,[^_]ÍU]ÐU(]Éu։}}MRSڋMtv@t:P3P4P5@ U >utf9uupÀP,P-1҃uP/@$81a8D‹U &P0P11҃uP2@$8tXU >t9t?u]u}]Ð@ U ЍvP*P+1҃uP.@ fE 81a>u-'UVSӃ0uUt$Mu4$1Ut$UkU}ƃE<t(|<v 0[^]ftE$k40E$k0[^]Ð&UWVSEEQUM ]EUщEƅ EEMt%<%t^U9UMMuۋEE 9EfM]$mE$bE+E&CK<%vE t&<+H>Uҋt U$Et M $>ļ[^_]ËE9EsU%U⿉UEt U$E@TMA $Eg@UBUE]E鉅dvM]؋}x'EU4UNjE})ǸIljEMt E$MPUP҈pu pP҈Uu PU}EU}UMMUltQM1ɍP}w>Ux9] <)uݍBxMEU$D$aD$ D$EED$ DEU܉D$$E\$mM܉\ $Xlf$<GhD$\XxEfx}9 Džt1`)Éǀ< t]`tU~GU+EE+UEL$$\D$U\pJMBEE}lU<Eplf;E~+uMU)Ɛt&]܃9u)E)EmM] MEUA<pUfD90Euu#t& 4tpЅD9uҋ}uu+}} 9}@t&;ED?0}uu z4tpЅhD9uҋMuu+MM +M9M8;]MyMA$E@UgM)ME}܉L$|$$S}tt~t)UMET$L$$@Thx+EMDD$xL$$SE܉$ED$E$EMUEMU9U9}9*P S $%t&[8 E@ug@)E}#EE`}plt(~&MUt&E܃uE)EU)t@(E)])]m]EUE9]4~܋uUE)ދM܃9  uUuEt;})+U9։U`E B;}M]]9 )9ꋍd]E}Mtu?Mt+;}]]9u]}fEMt.;}S]] v9@u]}.};}rU d;}]]9 u]4EE8xdE}UU1DžtC}5Mt(;}r^9}OuU }Mu;}rU}YMu;}rEU)ƉD$T$$OMt$47D$ $PduEv 9;}Z} ;}f2 U;} ;} }tNMt&;}rt&9}u}(;} ;};} UXɉ]É}}uu]1u}]ËEt!t{u&xsf19Ɖ]u}] LGD$E D$T$D$ D$$h뤍U뀋E }FuT$L$UԉMD$t$ D$$UԋMЃR}tME D$T$D$ L$D$$GvUSÃDfMtqfw ]ÍED$ED$EED$D$T$D$ D$$1 ~Ut1]Í&UEM 9w!vfw`af9s]Ã9s]Í&UEMEU vUSD] EfEfw]Ðt&ED$EED$D$\$D$ D$D$$Q3 ~;Mu4uSxʀSC]Í&1]ËE\UEMEU #vUEMEU vUEMEU vUS]MEU ]]E ][]CvUX]]uM}u} u]1u}]fɺt'_u)1f;‰Ћ]u}]ÐT~tJFUD$|$D$ D$D$$QUԃ둺>FFFF<FщT$ UԉMD$|$\$D$$Q UԋMЃD$|$D$ \$D$$QEf}CF1T9vvs~FI&US]MEU ]]E ][]vUS]MEU ]]E ][]vUS]MEU ]]E ][]vUWVS|]EUM6-uEEEt-M1҅u+U -] saU|[^_] E1҅tϋE u}։]EEċEӉ%=UdM]L$T$-0\$ |$$U U9UMt~1  9uƋMf9t M9Uw:]} E;UCЋEt&EtmU$x-f`av*U9U]ֻVU:fEUD$dM|$T$ -0L$$UtU9U뮋U:UtrE׋]D$dMEL$T$ -0\$$7!t*XEt}uEUt.EUEU9UtD$UD$dML$T$ -0$ mÉ$U(]á`au։}}P@L$ى|$4$]u} ]t&'U8]]}׺E1uΉ$taEt6UUt7U]u]}]Et&D$$Uu1t&]u}]UWVS|UȋUEĉM̉U)UEEEE̅bu]̅} EEE?{OG<<EȀ8UED$EȉL$UMD$BD$ d\$-0$UM}-EЍKEMM̉D$EȉUɹD$EM+EЉL$D$ EED$d-0$YUM̻EɋME]ȉE}̅fEtEԅt#}̅tEUM̃9UBEԉEfA'Msa Eԃ|[^_] EMȉD$dT$ UL$-0|$\$$UċU|2tpENjM̃ED؃+URUE̅t f fEEE몐t&E뚐t&E&1}̅tfEEEQ}1}=EU(]`a}}u։L$4$S|$]u} ]'U8]]}׺E1uΉ$taEt6UUt7U]u]}]Et&D$$Uu1t&]u}]UVu SE]u [^] 8tu[^] U1WUV1M }S}t7_)ø~5wӃ af\Fuf 1[^_]UWVSÃ,E U؉M܅tn0xU@]E x?E<<$-O|$D$ËE$Puԉڋ]9uv1ۃ,[^_]119urE؉0PЀ w׋M1̉ʍ tHЉ ;Mwt<9wMËu1tU ỦD$$1uĉt1tM U̹D$$ }̋uă -G!E1tM ỦD$$;lE 8uĿia1t} U1ɉD$$=uĉoa1tU D$1ɉ؍U$5uĉ<MY1I;Mt ME'Elwދ]̉Ѓu$1ɍUD$ŰuEEËE-lBM؍UD$$M̉ËA kU A1lEd1TFM1tM D$؍U$D}̋uĉËEWM1tU U1ɉD$$uĉ}uEUعED$$nỦËEBdMu(P1A1.M1Et} D$Uع$ %ŰuĉËEB_MMM1t} U̹D$$ uĉM@D$D$a$E}̃uG EuŰrlBEM̋}̋IwMȋEȋOl+ aO ẼH E1t} D$1ɉ؍U$c}tuU̹dBkdEEM̋uEEALEE EP);UW1@EEDdE돃}1}tMJr urDE)BƋẺp1;r b;rDYÚlEԉrJM뮋}1ҋOlu.ʉdUк}ufҸJ;9 t a9}ŨB!0}1EE\;u]UM PXL$M̉E܍E܉$AtȋUË0uduf}duf}tB1 \9v4VTM$U@U$T$D$EuBMu]uЃ}P1!UU:D$ $>ƉEED$;$(=*M01*E>y11]EE؍}D$ |$$OCED$ |$$OC CCCEHP-+u z*5MD$ L$$HOCDyCDE؍}D$ |$$OC@ED$ |$$OuC<C8C0;C4;D$:4$;)E؍G$CT|$t$$bACT8|>D$;<$;Eu)F$CXSt$|$$ACX0E؍47]}8PEUU>UK\ML$<$U E]1U>+DCT$D$ 4$MM؉CED$ L$$MC C z*/{0 s pC CCD$<$d:EE]}M9UM]Љ E؋]щڋ]BT$E}ED$$‰F}1Uщ $UljFtWM$L$5;1N<xD$;<$U9Uu׋F<} Euĉ$4$Eҋ}CDpC@ C<C8C0;C4;&UVS MEU D$E$EEEËEt6qutF$OF$D4$< [^]Ívuu됐UWVSEM EU1tIU1ME z9t!t9tuE z9u߅tE8E[^_]f1ꐐUS]tJa1 9tAu aD$d\$-&$(d[]-&1ɐt&Iat&UWVSa} s t|$$`8u[^_]fUVS E ]t 8d $t$$( Aw6vTC D$CD$ CD$RaD$d $sd E E [^]f uBtC D$CD$CD$ CD$BaD$d $뎐CD$ CD$7aD$d $ְ^D$dD$2a $谰d1PÐ&'SÃ(ut!S u&C t؃([CT$D$ D$D$$LaC T$uT$$a,l$(d-\$É|$$׉t$ 19htZucK1ut/C |$$t1\$t$ |$$l$(,Ívu C@kCCfC@u댐&'d19PÍSƒd-19Bt$ 1[Ít&Jt=ɉJu'BBJuBHy*8!t5؃[$ 1n؃捴&B $؃͋B $S؃뻐4$Ɖ|$%t 2a:Gu u14$|$Ðt&VS$\$0$o#d1 9t a$1[^Ív atV aaDC @T$D$ aDD$D$aD$$ ad1 uJfc 1$[^É$"t$D$ aD$aD$$ aD$$1[^fK @1$[^à $1ۉt$|$t M׉Cǂ84Ћ$t$|$ Ít&'VSP@$@$T щL$D$a$P\$ \$#$D$ ع$ @D[^fVSÃ4D$$D$ D$D$D$D$D$ D$D$?$O (y  au74[^Ðt&{ $蟌 4[^ÍD$D$ aD$@aD$@$ a럍UWVSÁ|$;EUD$(D$$D$ D$ D$*|$D$D$ D$D$$,vturNjuED$(D$$D$ D$ D$*|$D$D$ D$D$$,y1e[^_]Ít&NjGUE]EfEfE؍G E܍E؉EȍEEET$$=4t=Vt=:uR% azU$t$D$ aD$@ aD$@$ aD$A> aue[^_]ËEU$UD$ <aD$@ aD$@T$U؉T$D$$ at&VS1f$fvL f9.t؃$[^fD$Ta(afD$t$L$&t(D$D$4$ tܻ$[^1ۃ$[^Ðt&U8E܍A#]u}waA\$EЃE%t 2a:Gu u1tEED$T$$kUT$$b/E܉ڹ$,]u}]Ëu|a%t 2a:Gu u1uL$뎍t&'L\$<Ét$@։|$Dl$HL$,D$"aT$$a/gL asa*(<$P at>a\$D$l$D$ aD$`aD$$ a詾\$'UWVS a$0DŽ$DŽ$Ƅ$tG1t Ɖ$mt$D$ 8aD$ aD$$ aD$豟$%%@ D$8tO=TaDŽ$DŽ$Ѓ CDŽ$$Ct$Pa$!l&aD$XxC $D$$D$ D$D$D$D$D$ D$D$?$g (  a DŽ$D$XD$8$D$l$ D$D$$D$DD$$$蓮 aa DŽ$DŽ$DŽ$D‰$$D$$D$$DŽ$DŽ$DŽ$DŽ$DŽ$D$D$ ($ЭC $H $CDŽ$DŽ$aDŽ$$DŽ$\D$HD$@D$\2$D$H$D$XD$@D$\D$DD$8D$l$ D$D$DD$D$@D$$$=U1=C|$t $)D$< D$81 D$LD$@ D$PCtD$T&D11$pt$$D$$D$ D$ l$$襫 a$ӧt$D$ @aD$ aD$@$ aD$f agC1t Njtt CiD$8D$l$ D$D$DD$D$@D$$$$$5TaDŽ$CDŽ$$D$TDŽ$$Pa$$$کD$LD$l$ D$D$DD$D$PD$$$<x t& aDŽ$t^$D$4KT$4D$ aD$ aD$@T$$ aD$苙$tT$H$$l$HtMl&axyBC tD$EĉD$D$ aD$aD$@$ a[\ , a$$$4$($0$ t$D$ aD$aD$$ a[\$@D$D$D$D$ D$$D$(D$,D$0DŽ$DŽ$DŽ$DŽ$DŽ$DŽ$DŽ$$"a׭^$h$ $$$(,ÍVSӃB BfVtQ TB ɉBtsC u-fVt#aT;(C  tj[^ÐVF u FX$)g1҉$1mFVCS udt=#at&#aoTbfC[^ÐD$#a$a#a뽍vft=t=t ==fC:,$d$$$(Չ$ -1 DŽ$T$0T$0  $$ D$4$ua;T$,$NT$,t4 aQH4$P au7dT$0$$ $$$(,f$Xel$|$D$ aD$@aD$D$$ aX돍 atL$f0 ʋL$0fT$ T$ST$ ST$$fS T$(fST$,fSf0 ʋL$DfST$8KL$LST$@K$L$TST$HK,S T$PS(T$XS0T$`S4x[ÍD$(D$D$$$t諙D$ Ív', a$$$4$($0$ t$D$ aD$aD$$ aJR\$@D$D$D$D$ D$$D$(D$,D$0DŽ$DŽ$DŽ$DŽ$DŽ$DŽ$DŽ$$"a'$_$ $$$(,ÍSxD$$D$$$L$f0 ʋL$0fT$ T$ST$ ST$$fS T$(fST$,fSf0 ʋL$DfST$8KL$LST$@K$L$TST$HK,S T$PS(T$XS0T$`S4x[ÍVS$t$4tg amsa at/t$D$ 9aD$aD$@$ a0P$[^ËD$0D$"aD$@$<1ɉ蹚Ƌ$P at댍t&D$D$gD$aD$ aD$aD$@$ aO芖sa aK'VS$t$4tg a-sa at/t$D$ 9aD$aD$@$ aN$[^ËD$0D$"aD$@$vƋ$P at뉐D$D$D$aD$ aD$aD$@$ a_NJsa aK'UWVSEЉ$xDžDžDžDžDžDžDžƅDžDžDž DžDžDžDžDžDžDžDžDžDžDžƅDžDžDžDžpDžtDžxDž|DžxDžDžDždƅDžDž-1 DžDžDž  DžDž`DždEDžhDžlEEEDž|U$i}U:t E 8 attc4$D$"aD$kt*xX$4$T$Ë4$PdT$ ؁[^ au{saD$D$ D$aD$ aD$aD$@$ a4 au'r{saSD$D$ D$aD$ aD$aD$@$ a$4fd$ $ $$$$-1$ DŽ$T$ T$  $$D$$$&e au:T$ d$ $$$Ðt&D$a|$D$ aD$aD$@$ a 3T$ d딺@akxb`a; "}U",tHE @E,$E H E,$P@al/ aup{ysa  @ak at$D$D$ aD$aD$@$ a%2D$ D$D$ aD$ aD$aD$@$ a1O`a""$$ ;$(`af1"$4$D$!S(D$0D$ D$#a$0ø#au([ at8\$D$ D$baD$ aD$aD$@$ a0wsa1맍S8\$@tTa(x'D$D$$UD$$D$E؃8[no tfCtyC8[Í&d(&띐,iaa\$$T$0t$(wL au1\$$t$(,Ðt&T$D$ aD$@aD$$ a0Íx_`a; "}R"tEC @C ty1 aC H~K\$$t$(, aM1T$D$ aD$@aD$$ af/f$P뫍t&<u a}T$D$ aD$@aD$$ a /Kt&T$D$ aD$@aD$$ a.vS(D$0xE`a; "}7"t*B @Z$B H~v؃([ au&ausa ([Ðt&D$ D$D$ aD$ aD$aD$@$ a.f$P뀍t&T$8CCT$ST$ST$$ST$ S T$4ST$T$8CCT$ST$ST$$ST$ S T$4ST$$D$,RD$,8[Í& auH_sa 18[ aub^sa8[D$ D$D$ aD$ aD$aD$@$ awD$D$ D$aD$ aD$aD$@$ aR]'D$ D$ D$`#a$1Һ`#aDƒ \d-1$L$`$T$d$X$h$P DŽ$4$`$`  $8$<$d$Gu ;tS$T$,袇T$,=d$`Ћ$L$P$T$X\ at a[saT$,4$"T$,W%= =A attc`a ad!u]؋t$@\$<|$Dl$HLÐ11ۃt<$ ‰tu at`aaT$d!D$ aD$aD$@D$$ al`&`a9d!&4$wʼnaHD$,T$($OT$(VD$,D$ aD$aD$D$$ aT$( T$D$ftft5T$D$ AfȉET$D$ T$D$ v'WVSP a\$`a;D$$5`aD$ |$ D$LD$$街<$D$}aD$ p!l!D$T$$(V`aƆ!dž!! _D$ 0|$D$!$`aD$ 0|$D$!$DaD$ 0|$D$$RHaHa$p `a!! $L1St&a\$D$ aD$aD$D$@$ aa;u1ۉ؃P[^_ÍD$$5`aD$ |$ D$LD$$ԕ<$D$|aD$ p!l!D$T$$(Ɔ! `adž!!D$ 0|$D$!$`aD$ 0|$D$!$y7 at.D$D$ ,aD$aD$@$ aFDaD$ 0|$D$$RHatHa$t `a1ۋ!!b$NR aD$D$ aD$aD$@$ a adD$D$ daD$aD$@$ aK7džl!B attc`a ah!u]؋t$@\$<|$Dl$HLÐ11ۃt<$ ‰tu at`aaT$h!D$ aD$aD$@D$$ a`&`a9h!&4$wʼnaHD$,T$($OT$(VD$,D$ aD$aD$D$$ avT$( T$D$ftft5T$D$ AfȉET$D$ T$D$ v'WVS0$@\$ D$ D$(D$,D$0D$4D$8D$<D$@DŽ$DŽ$DŽ$DŽ$DŽ$ DŽ$DŽ$$M$D$ b$11Ҹa1|$$D$ $D$$D$`a $ a t$D$D$ aD$aD$$ a$01[^_ aKAsa at4t$|$D$ aD$aD$$ a$o0[^_Ív= a@sas&11amD$D$z D$aD$ aD$aD$@$ ad at8|$D$v D$aD$ aD$aD$@$ a @sa:8t&D$D$| D$aD$ aD$aD$@$ aD$D$x $a U'D$$D$D$D$ $Í'$c,, atsaXX,Ð&UWVS\D$xl$p|?D$,)L$t8a9D$tL$8D$8D$<D$@D$DD$HD$LD$ $p|$Ll11D$(D$D\0t&*D$t;9|$LwT$81ۉ$t$(D$LHD$8$\[^_]f aY=sa\[^_]ËD$taD$tT$t; WCD$$D$z tyD$,$T$$D$T$$tKD$x$9|$LL$t9t9|$LD$( 뵐t&D$(vT$ta D$t aunr<saL$( aD$tD$D$ D$`aD$ aD$aD$@$ afL$(D$ D$`aD$ aL$D$aD$@$ aQT$81ۉ$jD$LT$,T$$tLD$x1ۋa aD$D$ aD$`aD$@$ aZD$ D$ $`aF UWVS\t$pl$thtTua9uK,v aj:sa\[^_]Å&D$8D$8D$<D$@D$DD$HD$LD$$|$L6T$D1ɸ(&u ;+9s0Ztu; u⋛9OÃ9r׍&T$8D$,$D$,D$L(T$8D$,$D$,\[^_]9y땐a aazD$D$D$@aD$ aD$aD$@$ a=U-D$8$D$L atD$D$D$aD$ aD$aD$@$ aw&<$,$$4$L$0$8$8?dDŽ$ -1 $8$8  $$$<$utCd$8$>$,$0$4$8<É$>tf at,$D$,<$D$_fD$D$?D$`aD$ aD$aD$@$ aD$D$M$`a,$7f $$$$$9dDŽ$-1 T$T$  $$D$$t9dT$$J9$$$ É$L9$$$0tdT$$8뛋$4$D$͉' $$$$$f8dDŽ$-1 T$T$  $$D$$t9dT$$*8$$$ É$,8$$$tdT$$7뛋$4$D$荹͉' $$$$$F7dDŽ$-1 T$T$  $$D$$t9dT$$ 7$$$ É$ 7$$$ tdT$$6뛋$4$D$$D$b&' $$$$$6dDŽ$-1 T$T$  $$D$$\t9dT$$5$$$ É$5$$$ tdT$$t5뛋$4$D$$D$rb&'$ $$$$$4dDŽ$-1 T$T$  $$D$$%t@dT$$4$ $$$É$4$$$ $ t!dT$$64딉$W4$,$($; u|$4$z멍& $$$$$$3dDŽ$-1 T$T$  $$D$$t9dT$$S3$$$ É$U3$$@ tdT$$2뢋$ 4$D$ $D$$D$뷍v $$$$$f2dDŽ$-1 T$T$  $$D$$t9dT$$*2$$$ É$,2$$$ tdT$$1뛋$t$$=Y͉',$$$ $($8$$$31dDŽ$-1 T$(T$(  $$D$,$yu1tg a saT$(d$0$$ $$$(,Ð$0$4$0$utT<$K뉍&D$D$D$`aD$ aD$aD$@$ a%<$g32&aÍv'ShD$(D$ D$8D$$}x" &a1҉5&a1҉D$Th[ÉS a9y au׉\$D$ X aD$ aD$@$ aA VSTD$$t$`D$ D$,D$$xj tX} T[^à t% u &a1҉5&a1҉D$0T[^ËT$H1t tuuT[^D$LT[^f1 a?x at\$D$ aD$ aD$@$ aNVt& h¸Oƒ Ít&,D$0|watzte ate[^_]f,2au ,2aEu,2a EUU1$1k$EF&UEۉt(N ft<%um/%&et&Et$D$ aD$aD$D$@$ aUD$D$ aD$aT$D$@$ aݱe[^_]Ðt&1(2at$$~舭D$3E$2atD$D$3a$ut&1у=$#aI(2afla$2aa$D‰D$ouEȉ$Uȉ$$EED$`aD$ D$D$ D$ D$<$D$ED$u$u- at$D$ taD$aD$@$ aY<$QqEȃ$cEU$D$U;t t&;uzt&D$t$$1D$D$Ya$p1Balag$#au 9$#a[E}D$Ta<$D$EEE} !%taDU aD$ [aD$aD$@$ a } 2aD$|$$32vUED$E D$E$1 UWVS,Eu } D$D$Ta$dڋ !%tDJD$|$t$\aaD #a$ #aw$b5 #aڋ !%tDJD)ڃT$\$4$a e[^_]ÍvD$D$Ta$cڋ !%tDJD$|$t$v[aa' #a$8t #atb$0tQ5 #aڋ !%tDJD)ڃT$\$4$ ae[^_]f #aD$D$$R8_D$D$$aB #at$t&UED$E D$E$A UBalaa $#at% 2ax$? 2a$#aɸlaUWVSD$aD$ aD$ aD$@$ a\Gsat&'UWVSeh#a$詗ۋC B t&US]$][]US]Ca$ Cp#a@t#a1ҹKx#at/Sx#a9tx#aBtt&9t|‹Bup#aHtt#a$̖C aC]øp#a@tt#a1贱t& x#a`덋CB념&US]$][]хUS]Cxa$ݕL#a@P#a1" T#at/SpT#a9tT#aBpt9‹BpuL#aHtP#a$袕CD$C$ aC]øL#a@tP#a1{T#aUCpBptUS]$][]鑄US]HaX#a@\#a1ҹ`#at44`#a9t `#a4t9tf‹4uX#aHuX$*CL$C$$C ts$ aC]Ë44f\#a$$CL$C$$|C t $蝓 aC]á`#a,US]$][]!US]Ch, a$-CL$#a#a@#a@D#a1ҹFH#at/STH#a9tH#aBTt9‹BTu@#aHtD#a$ǒC`$AC  aC aC]ÐCLt $A#a#at@#a@tD#a1x H#a-Wt&CTBTGt&UEa{v'US]a$X][]kv'US]$.][]AUS]C, a$M|#a@#a1蒬 #at+S,#a9t#aB,t 9tv‹B,u|#aHt#a$ aC]ø|#a@t#a1t&#aj듋C,B,닐&US]$][]!dU]-0UE]fUE]fUSd#a@tVh#a1ҹel#at$[ ud#aHth#a$]Ðt&l#auȍt&dU1t]Ít&ǂ#a#a#a#a]Ð&'US]9tCC<CC>CL[]US] q;EuP\SX\[]$aUdU-1BH]Ít&UD$ D$D$$LaPUBLt fD$ aD$'aD$$ a1Ð&US]E S`USt []ÅPMSP ɉSPSPS$P@ S(C,d-1  E U싀 E$迵uEExF du9ǃ$t,9Und au C\$D$ DaD$'aD$ $ a衃Ct&UE@<aPB]Ít&UHu1]ËHLt1z@]EÍUS]C\C@tD$$P$K\u[]Ðv'UE]@XÐt&US]{<u]9tC$/]Ð&'UEx<uË@$Ð&'U&aESR)@H ha@@ @@HP @[]UE@K  a@@ ]ÐUD$ aD$D$$La\Mat au $aID$ yaD$ aD$@$ a腁ΐfUE@O (! a@]Ít&UD$ aD$D$$LaLat au $a詶D$ yaD$ aD$@$ aΐfUU S]tKC9u[]Ð&'UVS] utgF@t^F 1oNt$V9tVtf9t<‹uFHtF $e[^]ËVuӍ&ƍv'UWVSu] F@tF 1Ҥ~t 9_t?uFHtF $~e[^_]Ð&US]E CG aCfCt&l#aC l#a9C u[]Ðt&C[]ÐfUD$ aD$D$$LaJat au $(a艴D$ yaD$ aD$@$ a~ΐfUuJv'UVS]u CaC CCCCC C$D$ D$D$$LaICt,t2~t"F CF ߉C x#aCx#a9Cue[^]ÍvCF ؐUWVS,]} CCJ ߍsDxaCC CCC$D$D$4$ClCptW S WUE䉕d-1  E U܋ $Ek7E䋍xF d-1 u䋵C<6t@ E M܋ $E:d-1҉ CdD$ D$D$$LaNCtT#aCpT#a9Cpu9f at'D$ aD$&aD$ $ a{vCe[^_]Ðd atՉ\$D$ taD$&aD$ $ a]{Ce[^_] at\$D$ taD$&aD$ $ a{hExF td-1&d1-1&'UWVS,]} C$CN ߍsLHaCC CCCCC $D$D$4$tD$$Xǃ4CD$ ED$D$$LaEC Lt .MtRd-1 E U؋ E܍$zd-1ɉ  CD}uf E U؋ E܍$蘪xJ d-1 at(\$D$ XaD$&aD$ $ axCe[^_] atD$ yaD$ aD$@$ asx at\$D$ aD$&aD$ $ aBx at\$D$ aD$&aD$ $ ax[E1ɁxF wd-1ɉ ɉMtL E U؋ E܍$ d-1҉ z`#a4`#a94u a~\$D$ $aD$&aD$ $ awQd1-1ExJ td-1_d1-1Mv'US&a] @)ʉC,C`CE h, aCCH C haCCCC$S(C C<C=C>C@CDCLCPCTC\D$$c#a#aH#aCTH#a9CTuÈ\$D$$J[]Ít&U8d]u}-1CHPCXySD$D$D$T$ |$t$$tg$tgC<aPB]u}]Í&$nÉ$:t1d-1CHH$aa$aU$aI&UVS]d#aD$ D$D$$La?h#a_d#aB1ҹ$5l#at4$Bv ud#aHYCI@#aD$ D$D$$La[?D#a@#aBq1ҹ舘H#at$[Tu@#aHIp#aD$ D$D$$La>t#a3p#aBa1ҹx#at$[up#aHtt#a$|L#aD$ D$D$$La/>P#aL#aBt 1`T#at$ [puL#aHtP#a${X#aD$ D$D$$La=\#aX#aBt 1–`#at$4uX#aHt\#a$_{|#aD$ D$D$$La<#atb|#aBt 1+#at$8[,u|#aHt#a$ze[^] at$D$ yaD$ aD$@$ ap$a_5l#ah#a$gzC@#aD$ D$D$$La;D#aZ@#aBt 1#H#aD#a$yp#aD$ D$D$$Lar;t#ap#aBt 1裔x#aU#aa$#a#a$xa$xt#a$xh#a$xa$~x\#a$fxa$NxP#a$6xD#aáat $ xt#aGh#at $wat $w\#at $wat $wP#at $wD#al$w@#aD#aH#aD$ D$D$$LaM9D#aL#aP#aT#aD$ D$D$$La8P#aaaX#a\#a`#aD$ D$D$$La8\#aFaad#ah#al#aD$ D$D$$La/8h#ap#at#ax#aD$ D$D$$La7t#aaa|#a#a#aD$ D$D$$Law7#at,$#a#aa#a#a at$D$ yaD$ aD$@$ ak$aUH]]u} ƸC @tO{ t:;sC1ҹ aCsuF]1u}]ËC1C1s au]u}]Ít&1CD$ C D$Ct$\$D$ 8aD$D$&aD$ $ aj머C HC -uC uf1CgfUH]]}uS tTCt9Hv79t8 a]u}] a ft[C1tWCuMCC HtC$os a&]u}]Ð atCt$(T$$ST$ S |$D$\$T$D$ aD$h&aD$ $ a)i뗍& a3D$ aD$H%aD$$ ahS &S fD$ {aD$H%aD$@$ ahS UVS0d]-1CHs`4${d4$ au C4$S0$D$R 01[^]dD$ aD$%aD$@-1D$$ ag atC4D$$C0\$\$D$ aD$ saD$%aD$ $ aD$d-0D$gMSP[Pfv'US]CCCCl$CD$D$ D$D$$La9Ct]$,a蜜U(]]u}} sD4$_CS)t*tgt;CD$T$C$Fs u]u}]7&CD$D$C$s 뿍C$CS)„t널&'US]CCtCtB$][]fK tCL$D$$][]D$$릐&US]C KɉC tSt7$][]/tCL$D$$u][]D$$RU(uu}} ]^`$v$]u}]ÐEtFDU~D$]1u}]ÐU(uu}} ]^`$@v$S]u}]ÐUtF@U~@$&]1u}]ÐUVS ]E$D$fsu1e[^]ÍE s`C0EC44$CXD$D$C,D$C(D$ C$\$$aD$uCt@C<aPBKHup蛪CHtK4$Te[^] auC1ۉ4$1=\$D$ taD$ 'aD$ $ aRc뾋S뽍UWVS}G GGD$ D$D$$La.G t>_$<$t9pt!$\ue[^_]Í& au $a7D$ yaD$ aD$@$ asbΐU8]]u}9s$4$St4$]u}]ËCEt4$E]u}]Ðt&{E׍t&U8]uu}} 9u@p`4$UC\t u@C\u]u}]PPE$E$a$t&UWVSu} V\F@tvD$4$P$F\ud#a@th#a1l#at$[ ud#aH^`${;vPtfF<~8$dd0$aPJtrvH;5`at$jv4$Pd-1xG$릡h#a^`$j$;vPtF<~8$$輔ǀ$Dc`aǀXUED$$GU$US]{@t{>u]D$CL$RiQQ$&U8]]}uu {<$C@t09slCH<$]u}]fsl<$F4$U CɃCDUE$VUCHCC<$GE$<4$1n]u}]Ð<$F4$ U C<CDUE$Ut&D$CU$gUDиCHIEU$4$sUntF1t]D‹u}]ÐEU$R4$*UnUW-VSL]Js$4$EE9CtD$$8t4$L[^_]fE܉EčEGEE܉$E܀a]賐EԃCD$t$$k$訐Cu{t}Ĺ1뤋E1Ck&'U]]u}fs`4$ {<SDtp{@tj9C$gD$C$f=tw4$CLC>$eC$zg]1u}]É4$CLC>$e]1u}]É4$w]1u}]Í|$CDž$f|$CH$"P|$CDža$f/4$$n&'U8]]u} s$4$E{t4$]u}]ËKu݋E$D$uʋE$D$t+Pt#P4$e]1u}]Í$ ?TvEKBBt&C9u1MUWVSL]s$4$EEԉ$D$t$PP4$L1[^_]$ SE܉EčCLEЉUGEE܉$Ea]bEЃC D$t$$7k $WSuCt}Ĺ1뤋U̍KEBBC9u14$L[^_]Í&1 4$ؐU8]]u}s$4$|C9t4$]u}]ÍvCSu9K 1tLD$$4$8]u}]ËC1uD$$jȉ|$$7tPf1҉PuD$E$tE$iQ[t&US]豊1S tS u;Kt[]CK[]ËS tBC1[]US]Kt[]Ít&$xuCvCЋ$P1҉ǐUE@I  a@@ ]ÐUS]D$$vE  aCP C C$[]ÍUWVSPMD$E<$L$ D$҉1ut$R ]u}]Ít&$Nlj$>P1떋xH t$d]u}]1&&UEtwdE-1   UE$tK E M܋ $EnuxE d-1ɉ }9`$RxxP@`$O1ҹ@~auRB81 $Q[^_]ËED@P@<$5t&`$s-iod1-1&US]tT tNdE-1   UE$lt[dɋu]`$xtMx<u``$t1$R1%vxE tYd]Ã`$鍴&D$@$D=t|1?t&@P@`$71땐fUS]tTtNdE-1   UE$kt/dɋu1x=t31]ËxE t7d]Ðt&@=@$E11됍US]tTtNdE-1   UE$jtCdɋuEx=t@$xD@=1]ËxE td]Ð1떍U(E]] u}tNd -1  E U <$Eit&d]u}]fEdxE 1 utG;tB E E <$ECid1ɉ uVPVP VPV PV,P $:D$D$ D$D$NjF$7HxRWJH+JH1]u}]ËxH tMd$+T au5V$PV(P1]u}]d1Ɂ1t&D$D$ TaD$%aD$@$ ax6롍aU]Ít&UUdE-1   UE$gu>EdxE ߉u?$R(E 1Í&dÍ&Љ'UMdE-1   UE$fu4EdxE ߉u/U P E1dÐ݉'UVS]$f.ƋE 4$D$3dE-1   UE$eum1ɁxG d1u [^]Ët$R [^] [^]Ðt&뚉'UEdE-1   UE$du3UdzG ߉ut$P1dfUUx a1]ÍUVSU]tNdE-1   UE$'dt!d[^]Ëud~E ߉uӃ} uȅ۸tD$F$?uV [^]ÐUVSM] tNdE-1   UE$Gct!d[^]Ëud~E ߉uӉ\$F$>u^ 뻐UEdE-1   UE$bu>EdxG ߉u?U T$@$>1ÍdÍ&щ'UU}dE-1   UE$au/EdxG ߉u&@$=d11䐍t&U]]u}tX3tRd -1  E U <$E`d11 t_3tY E E E䍅 $`uxJ d1ɉ uJu$P1]u}]ËxJ tnd 1ɉ t E E <$E_F2d1Ɂ1>1t&UVS] tbd-1 44 Dž 8$_u xK t"4de[^]f4da@ta1R$t&1tD$]4$%ut[d-1 44 Dž 8$1^d4-1ɉ   EUE$]Et$RaHd1ɁxJ LEt$RaH Ua${5؃e[^]Í&UEaH1ۅla$;5Wt&'U8҉]Éu}t` tZd -1  E M <$Ex\t(d]u}]Ít&zF u͋dxz tLJɉ>v zt a1Ƀ;ut& at?D$BD$ aD$ %aD$D$ $ a)ɸtLtFd-1  E U <$E[Dždd uD$$VddtY   E E <$EZu xJ t]d1؃ ]u}]ËDž.xJ d111 aGD$ {aD$H%aD$@$ aY( at&dHt&1 aD$ aD$H%aD$$ a' afU]]u}tX3tRd -1  E U <$EXd11 t_3tY E E E䍅 $XuxJ d1ɉ D$$ȿ1]u}]ËxJ d 1ɉ t E E <$EWM9d1Ɂ1Ft&]u}]1&U]]u}tX3tRd -1  E U <$E Wd11 t_;tY E E E䍅 $VuxJ d1ɉ D$$ؽ1]u}]ËxJ d 1ɉ t E E <$EUM9d1Ɂ1Ft&]u}]1&U(d]]uu}} -1 E  UЉEԍ$!Ut'd]u}]ÍvV Sɚ;ED$@ $Et9ScD$dD$ $T$ӸӉM؉]܋6~ igE䉕QE)‰+)ډE؉U܍E؉D$4$D$d]u}]ËS9U+>ՁޱM؉] U]]uu yU؉uD$D$$d]u]Ív'US]tX tRd-1  E U E$Rd$@K  a@@ d-1  E U E$@Ruw1ɁxK d1tHt$R []ËxK d[]ù됐&US]tTtNdE-1   UE$UQt0du@PE 1[]ËxK t0d[]Á[]f1떍UVS]u tTtNdE-1   UE$qPt>dɋu@w;u7@1[^]ËxK t!d[^]1뗉'US]tT tNdE-1   UE$Ot0du@P E 1[]ËxK t0d[]Á[]f1떍UVS]u tTtNdE-1   UE$Nt;dɋu=tu3p 1[^]ËxK t!d[^]1뚍US]tTtNdE-1   UE$Mt?dɋuAt$R1[]ËxK t!d[]Ð1떍U]]u}tX3tRd -1  E U <$ELd11 t_3tY E E E䍅 $yLuxN d1ɉ uJ]u}]ËxN tmd 1ɉ t E E <$EKR>d1Ɂ1K1fJ^z SrH$P13vUVS] tbd-1 44 Dž 8$Ju xO t"4de[^]f4da@ta1=$81tD$]4$ut[d-1 44 Dž 8$Jd4-1ɉ   EUE$IEt$RaHd1ɁxN LEt$RaH Ua$K!؃e[^]Í&UEaH1ۅla$ !Wt&'UWVS]JtXtRd -1  E U <$ENHdd uD$$dd 3  E U E䍅 $GxN d[^_]ÍxN d;d t E U <$EG^t&d-1ɉ u$[^_]Á[^_]Íd뾍vd1-1뱐1^T UWVS]tXtRd -1  E U <$E#Fdd uD$$dd (  E U E䍅 $ExN d[^_]ËxN d;d tz E U <$EDdd-1ɉ u$[^_]Á[^_]Íd뾍vd1-1뱐1i_ UWVS]\FtXtRd -1  E U <$ECdd uD$$mdd 3  E U E䍅 $eCxN d[^_]ÍxN d;d t E U <$EB^t&d-1ɉ u$膳[^_]Á[^_]Íd뾍vd1-1뱐1^T UWVS]tXtRd -1  E U <$EAdd uD$$Bdd (  E U E䍅 $:AxN d[^_]ËxN d;d tz E U <$E@dd-1ɉ u$v[^_]Á[^_]Íd뾍vd1-1뱐1i_ U]]u}tX3tRd -1  E U <$E?d11 t_3tY E E E䍅 $9?uxN d1ɉ $`]u}]ÍvxN d 1ɉ t E E <$E>T@d1Ɂ1M]u}]1fUS]tXtRd-1  E U E$=d$ @O (! a@d-1  E U E$G=u}1ɁxO d1tMt$R []Ðt&xO d[]Ð늉'US]tTtNdE-1   UE$Udɋu@w;u7@1[^]ËxO t!d[^]1뗉'US]tTtNdE-1   UE$:t?dɋuAt$R1[]ËxO t!d[]Ð1떍U]]u}tWdDžH-1 tt  LPx$9t$dt]u}]ËU1dtzE ߉ÅuɍTع%z<E Ta\`tM t#JH1ǁ]u}]D$B$7]u}=@]É'UHd]]uu }}-1$ىOe at6E\$t$|$D$ aD$$aD$$ aE]u}]U1]]%uT}t];tWdDžH-1 tt  LPx$7t{dɋtu}z<tpE DžXTEha\JH`1;]u}]ËxE t$dt]u}]1T&UE 9E]Ð&'UWVS ] u}tYd-1  E U܋ E$i6u xI t$de[^_]Ívda@ta1j)tXtRd-1  E U܋ E$56dtzaHta$ 1 a |$\$ D$ aD$$aD$D$ $ a $($1t$ D$貄 ҉URdDž-1 $$  ($t4 ExF d$-1 t&u"TfUu B  U䉕 E U܋ E$3t$PaH0a$ Dž1ɁxF t$PaH a $;  t&dGB B 'UX]ÍUWVS]tXtRd -1  E U <$E32dd u#D$$D$dd= -  E U E䍅 $1d-1ɉ $h[^_]ËxF d;d te E U <$E0JxF tUd[^_]Ívd[^_]þVd1-117&US$] at3a@D$ aD$@(aD$D$$ a]$[]pUWVS]tXtRd -1  E U <$E/dd u#D$$D$dd= -  E U E䍅 $/d-1ɉ $8[^_]ËxF d;d te E U <$EN.JxF tUd[^_]Ívd[^_]þVd1-117&Ut&U]]u}tX3tRd -1  E U <$EM-d1 t_3tY E E E䍅 $,uxF d1ɉ $轐]u}]Ët~tyttxF tvd 1ɉ t E E <$E ,UA]u}]þ1d1Ɂ1*t&U(E$ auÍt&a@D$ aD$(aD$D$$ aÍ&'US]St1[]Í&$Ct$1[]ÐU Ct&U]]u}tX3tRd -1  E U <$E*d11 t_3tY E E E䍅 $I*uxF d1ɉ u$Ϡu t&]u}]ÍvtltgtbxF tfd 1ɉ t E E <$E)B.v1d1Ɂ1't&Ut&UX]ÍUWVS u $(}2D$É$x aCP C s$]tWdDž-1 $$  ($(t+$d$P  [^_]Ð1ɋ$xP d-1ɉ u  EU܉E$'u.E1 au-d [^_]Ë$PӉt$\$D$ &aD$@$aD$ $ a뙍vUS]tTtNdE-1   UE$'t.du@$v[]ËxP t2d[]f[]f1떍US]tTtNdE-1   UE$5&t.du@$v[]ËxP t2d[]f[]f1떍US]tT tNdE-1   UE$U%t.du@$v[]ËxP t2d[]f[]f1떍US]tTtNdE-1   UE$u$t.du@$[]ËxP t2d[]f[]f1떍US]ttydE-1   UE$#u+xI tPd[]ùdɋXuҁ[]Í&1эUS]tT tNdE-1   UE$"t0du@PE 1[]ËxI t0d[]Á[]f1떍US]tTtNdE-1   UE$!t0du@P E 1[]ËxI t0d[]Á[]f1떍US]tXtRd-1  E U E$!d$ @I  a@@ d-1  E U E$p uw1ɁxI d1tHt$R []ËxI d[]ù됐&US]tT tNdE-1   UE$t?dɋuAt$R1[]ËxI t!d[]Ð1떍US]ttydE-1   UE$u+xI tPd[]ùdɋXuҁ[]Í&1эUS]ttydE-1   UE$u+xI tPd[]ùdɋXuҁ[]Í&1эUS]t tydE-1   UE$u+xI tPd[]ùdɋXuҁ[]Í&1эUS]tT tNdE-1   UE$5t;dɋu=U u6@1[]ËxI t%d[]Ðt&1떍UVS]u tTtNdE-1   UE$Qt7dɋu9w4p 1[^]ÐxI t%d[^]Ít&1뚍US$E ]UCL , aC SCCCC(t]XaE\aE`aEED$ D$T$$膻Ct3#aC,#a9C,u]fLaEPaETaCUWVS<]M}UE K u,{ϋMSCL , aK$M C sCK(|$K$D$T$ D$?aL$<$蘞|$ D$t$$Xa謺Ctb}=t&#aC,#a9C,ue[^_]ÍvE$t׺M XaC$C뱐C땐US]D$CD$C$ tC]ÍUVS0]D$u C$u.ED$D$C$E1 e[^]=th atՉQޱc)ʉ ECUU tkrF= a Xad5fk1d [^] atxuh$R1[]ËxL t9d aup4%sa1끍& atD$D$D$#aD$ aD$ aD$@$ aD$D$ US]tTtNdE-1   UE$t>du@xtf$R$x1[]ËxL t9d aul#sa1| atD$D$D$"aD$ aD$ aD$@$ aD$D$&UWVS,E}$6eD]u }|#a@t#a1#augt&R,t[JxJB11 u9z$uߋM(|#aHt#a$R(e[^_]ø|#aHE($6$0M$|$\$L$$M T$$L$ Mt$L$ML$L$ dE-1   ME䍅 $F ul1ہxL Ëdu"e[^_]á#a$Cvt$Q$1븻 atQC$t!u4$aC@a4$ [^]CC [뭍t&'Utu $aÍvD$D$$a4fUH]]}} uS$CS W$ a"D$ D$ $T$-KQu-E $D$1d[] atQu9E$D$ ED$E D$Id[] atQu4$fa9tP‹B@u auYTsa4$J1d[^]ËC@B@$$evD$D$gD$*aD$ (aD$@*aD$@$ aԾf atՁޱQ]Uuu]] }NtSEȉUQ)ʉUME>ՁUޱUES]u}]C]u}]t&UM]] uE UiEUE>ՁUޱUES]u]UEu1]PѺ1 t(*!NbD$D$ $L$菮]u]vU1҉(Eu}} ]X޻։ t[*!Nb$t$D$D$ ۱kdG$t$D$D$ ]u}]G]u}]U8E]u}}$]1ҋE޻։ t[*!Nb$t$D$D$ kdG$t$D$D$ M]u}]G]u}]UHE]]u}1$)Eu¸ tw*!NbD$D$ $T$ۉtV at.\$t$D$ ,aD$00aD$$ aS]u}]Ít&1t at몉'UWVSLu} @aEE0aE`a "9ȉE}z"txiB @tR\4$U-Má`a"X$Ủ\$T$$輿 u]`aE "E9|1ۉ4$BELUЋEЋ QpۉEu0UЋ$P#`aU"qQpEԀ}EXat @aN at;4$M|$D$ ,aD$0aD$$ aD$EԉD$芮Eԍe[^_] auwU^Ủsa2 at8\$D$OD$0aD$ T,aD$.aD$@$ asaE1T$D$ ,aD$0aD$@$ a׭E aLKT$UD$iD$0aD$ T,aD$.aD$@$ a膭U*E܉$E'UVS0UDžDžDžDžDžDžDžƅDžHDžXDž`EEEE$"a"E U$D$k$0[^]Ðt&UVS0UDžDžDžDžDžDžDžƅDžHDžXDž`EEEE$"aBE U$D$$0[^]Ðt&UHuu}} ]`a; "}v"tiS C @C @"CXU|$$ U a Ia$ERE]u}]Ív auGsa1  auatS J~]u}]D$ D$D$/aD$ T,aD$.aD$@$ adxD$E|$t$D$ ,aD$/aD$$ a,ۋEeo QpvBt&'U(E UD$E$PÍ&'UVS0] utn au5EEEC4$EED$=0[^]ÍD$ ,aD$@/aD$@D$$ aV럍t&D$4$뱍&'UVS ]E$zue[^]Í$D$$ɲC$3t4m=0a[赲t$$葲e[^]Í&蓲t$$odUSD];tQ|]E$輷twEU+CS EUmK}E޴ fEm}mދEU]Ít&$y aujsaXX atD$XD$D$/aD$ T,aD$.aD$@$ a葧D$XD$U  9u]ÍUH]]u}t ]u}].$.ED$$E$Mu}*!Nbu}  9uUЉE+u}s{ 谰ỦT$$艰]u}]Ð&U(Eu$E$趵EU*!NbÐ&UWVS} $ aD$ D$ $T$<Ӊ!ډƃD$@BD$ $\$UD$@BD$ 4$\$螥UBtT=D#at- <"a$<"a)ʉG1[^_]D#aŃ[^_]Ív1֍US$]ED$E$¸x-EMbMEfCE)fSfC1$[]ÍUWVS\duE-1  UEč$t#de[^_]Ít&$ a}]D$'D$ +(a,a$T$f_U؉T$U|$\$ T$$ٲ a 1҉1҉F a >ՁޱUԺEЉ$ aF | >ՁޱU̺EȉFde[^_]ËD$D$ ,aT$D$D$0aD$$ a訢 at\E؋UD$ -aD$0aD$(ET$,UD$$ aD$ EЉT$$UԉD$EȉT$ỦD$T$C1҉1҉F a >ՁޱUԺEЉv aF | >ՁޱU̺Eȉ Fd'UWVSUЃtN1f a-sae[^_]ÃE }1ɉEEEEEEE$ME_ attD$$@sm aD$ 6aD$`9aD$@$ awD$$D a;D$D$ 7aD$`9aD$@$ azwdžVSa`a!I!d!9\!O$葀!!v9n;!b$^!]$E!Y$,a`a(!ǃ!d!h!`! \!ǃ!ǃ!ǃ!ƃ!ƃ!ƃ!0!,!D$T$$(蘇X! [^CVv!!t/d!9\!uh!9`!8$0P!!t9t;!t$ V!t$~Q&!t $~a`a(!ǃ!d!h!`! \!ǃ!ǃ!ǃ!ƃ!ƃ!ƃ!t50!,!D$T$$(NX! [^Tǃ,!`a $+!!!$U[^Ë!_ꐍ&'U(]]u}Ct ]u}]D$$~ODo|$T$<$~%C$OC뎐t& at$D$ d7aD$8aD$@$ aqsCR&S\$D$ S,шĊ8tAuIȉC,8t C,[ÍS(D$0D$:$D$ ÍD$D$$T$4D$9t8t 1([Ít&([Í|$|$$t$1\$\$ tJ{,D$ <$te9sx tTC09C8}UCu+Sډ$ЄtC8\$t$|$Í&Sڋ $Tu@C09C8| {C0D$$vCu덐&UWVS$$D$|C(t$qtC$C(C8K`as$¬T$;|$$;C$4$D$bl$\l$CD$\D$`D$h@t$dD$lD$p$ aCD$tD$ D$|D$ @D$l$D$$8D$@D$D$tD$D$|D$D$ $ـl$HE$sC(uD$D$tD$D$|D$ D$l$D$ D$D$$Ȁ$hD$HS(C(D$$ku aD$<ae<aTEEUE9PU׉?v" auZ'sa1L[^_]]܋d4$R\ى]D$ <aD$`<aD$@$ a[ auD$D$zD$`<aD$ ?<aD$<aD$@$ au[4UH]]}} uC]SD$$T$üE$E$]Mu63bECC$]u}]ÍD$ D$|$$EUD$$Uԍp9s/V<a%t 2a:Gu u1tA3X]1u}]ÐUH$]ÉuU}@d &a@<P`ʃ!}x49}v(xPEL9! щ au']u}]Ë}! щ atًL$D$ <aD$`=aD$D$@$ asY]u}]ÍEd UVSPUEE]9]w 19]ED$D$ D$D$$ixVED$$D$b t2D$D$ \$D$$i4$bEe[^]ÍUX]]Uuuȉ}D$t$$a } t1]u}]ËE1=wED$t$$a 9Euہ}uEt̋UȋED$t$UEč$uaU 9EuEE9Eu}u}u&aD$ D$ލ243D$4$aLED$ D$D$+Eĉ$`d{`add5&'U WVSREuD$\$$` 4$=f`$ed`UԉT$$t$ D$D$|$D$D$ D$D$$a(u`\$$=aD$ڋE؉$_EԃD$$_tEED$Eԉ$dEԃ$q_]&`\$$RaE$`E$0=aD$YUEU tt ɉtAP]P]fUEtPt ҉Pt]ft]ÐUWV1SL&5#a#a(D$<9s6 h#a8#a9rC9r[us D$<@#ap8#aD$8tv|ƒڃT$(T$RUT$0T$(L8T$09:T$;#a_JT$L$4R 9T$T$(\L$Q9#a+L$(J QL$4L$IʉL$,HL$; #a#aL$4T$,9T$;QT$(L$4QT$(tWL$,9L$(L$4T$(JT$Jt;L$,T$(JQT$Jt;L$,qT$(JQ|$$ur|$8)=,#autS {s{݅uT$8T$D$DD$@,#a;0#a,#av0#a#a 8#a8#a=<#a499t$<oRt+*zt=9t$=<#a~=@#a~=D#a~ |$@-8#al$D5@#a=<#a|$L-D#aw9w9 ) փap>=#aͤ#aBB P P #a5#a9##a)ى #a#aJX-#aX l$< #a9O#a9#a)أ#a  #aABZv#aT$DT5#a9 L$) ׉ʃ~SL t]t_F]t&\$ Ћt$|$l$z D; qW1tF؍T!ƒ)wډ)^ك)uu>Z ˉZL N NLJF։ʃ؃1J)qt&VS1ۃt؉ ȩu5t @u@u\$D$4$[^É19E빍v'<\$,Ét$0|$4l$8p95#aFǃ,>9E J CЉT$T$t:FuC)9G|$\$,$\$,t$0|$4l$8<Ív o9r0)σvf ȉFBЃL:tG^F;-#aE-#a95) ȉFB#a-#an[t&A9)ȉh#a9v\$,Ћt$0|$4l$8WJaw=]$F']E$]AE}E$>JD[]f=AQ=@~$]&E$]]EE$D[]$&$حJaUSD]%==1mEJawLE]E$w&]E$]貯E}E$KU]ED[]Ðt&=MZ=@~E$&E$]]LEE$2E]ED[]E$%$ JabUVS EUuD~?E؅HKa@Kaك [^]Á?>hKapKaxKaKaKaKaKa%Ka%Ka%Ka%Ka$ KaKay4t& [^]Í&PKaG$P$?.?`1%XKa\Kav뚁@ `KaXKat&=dKaU4UԲUVSuP~5KaKa]E[^]Ð>0EKaLaLaLa LaLaLa%La%La% La%$LaM$Kae,KaUK]CE]E[^]EKaBE$"?=/?x1%KaKa]&Mm]@(KaKa]t&=Ka]]UhEU$<=2atE$]EuE$!ErvNEU]=2aEE(LaE]tPEЉ$LtAEuJEÐt&EUU50La=2aEE(LaE]uL!벍vLU몐UXE$/=2atE$]XEuE$ ErvQEU=2aE]E4LaE]tSEЉ$(KtDEuME]EfEU=2aEUE4La5I La La La)EE=La`[^]La%La%La%LaMaMaMaMa Ma(MaLa`[^]Ít&$xm@ Na%(Na%0Na%8Na%@Na%HNa%PNaXNa`NahNapNaxNaNaNaUEE%Na$]]]]荵]EEEE$hMEZ-LaLa|$f0Ma8Ma%@MaHMa%PMaXMa%`MahMapMaxMaMaMaMaMavMa%Ma%Ma%Ma%Ma%Ma%Ma%MaMaMaMaMaNaNaNaNag&U&-MaAv%La1vUxEuU؋u܉]}?~,?;@؅vo<?La%La%La%LaMaMaMaMa Ma(Ma^t&1u}m=La]u}]Ë]-Lau}]Í$l@؁@ Na%(Na%0Na%8Na%@Na%HNa%PNaXNa`NahNapNaxNaNaNaLaUEE%Na$]]]]]EEEE$ֱMEiNa$0Ma8Ma%@MaHMa%PMaXMa%`MahMapMaxMaMaMaMa-Na&iNa Ma%Ma%Ma%Ma%Ma%Ma%Ma%MaMaMaMaMaNaNaNaNaI&Mai-Na\UVS`uhW?~0?@ك`[^]Á1LE NaE Na Na)EEE=Na`[^]ENa%Na%Na%NaNaNaNaNaNaNaNaME`[^]E$m6@UTOa%XOa%\Oa%`Oa%dOa%hOa%lOapOatOaxOa|OaOaOaOaE%EE%Oa$]]]^]EEEEE$:MCu-NaE NaEE$tNaNa%NaNa%NaNa%NaNaNaNaOaOaOa OaOa%Oa%Oa% Oa%$Oa%(Oa%,Oa%0Oa4Oa8OaNa%Na%Na%NaNaNaNaNaNaNaWME1u}mE=Na]u}]ÍvE-Na]u}]E$ l6@U؁@2TOa%XOa%\Oa%`Oa%dOa%hOa%lOapOatOaxOa|OaOaOaOaNaE%EE%Oa$]]]׬]EEEEE$賬MPuMOaE&E$ NaNa%NaNa%NaNa%NaNaNaNaOaOaOa-Oa Oa%Oa%Oa% Oa%$Oa%(Oa%,Oa%0Oa4Oa8Oawx1=24EhPam]EÍvE]EÍv=rBhPa]PaE Pa]뼍t&=?buOE%pPadPaMm]EE]]t&EpPa`PaE&e]MMm]fE tPaXPam])EEm]MMm]]UE}EUÐUE}EUÐUm}EUÍUm}EUÐUE]EÐUE]EÐUm]E Um]EÐUE]ÐUE]ÐUm]ÍUm]ÐUE]E%EEÐUE%EEÐUE]E%-ÐUE]%=ÐUEUU]]u}Q! t+Pa1!։u}E]u}]Ã3~ =utPavRxi]׉!߉u]}uE}]Pa։v11yΉо% D뻉֋}봍t&Ft4)Ã뀃uUEt$$Ɓ=ɉxUtEPav\xk!ډUE$t$]ÁvE$t$]E]EPav1҅yD‰U$Et$]ø느UhEUEU\$$=2at)E$];Etf ؍E$EtEzuɡ2aEUE]EԬPaEt#]u(!EuE]EЉ$o'uӉ'[(UАUXE \$E$ȣ=2at#E $]EtfE$EtE zuɡ2aEUɅEEԴPaE]t.]u''!Eu&E]EÐt&]EЉ$&uu'UΐUS MEUU]%=D t@= PafUU%?]UE []ÐUU]] uщЁt+#~'413?U]Eu]ÐUfiE Pa]EUhdEU$-`/D$m=2at$]EtE$sEt؋2aEUEPa]؅EPa]E$qEzt6f؃=2aEt`EЉ$$tQEuXEÍvrʃ=2aEtEЉ$m$ud%!Pa]rI%"뢐;%U뜐UhEEU$D$E=2at$]aEtE$KEt؋2aEUEPa]؅EPa]E$IEzt1؃=2aEt]EЉ$}#tNEuTEr̓=2aEtEЉ$J#uA$!Pa]w&$"$U렐UXdE$-`/D$P=2at$]\EtÍvE$CEtE$Ez^udrb2aUEEPaE]Pa]EЉ$b"EuuE]E t&ء2aEUEEPaE]uPa]EЉ$!uPa]u"""U|Pa]P"!SUXE E$D$=2at$]EtE$Et؋2aEUEPaE]Pa]E$ Ezt7؃=2aEtkEЉ$ t\EueE]Erǃ=2aEtEЉ$ u!!뺍Qa]kf!"뗍v{!U돐UhEUEU\$$=2at$]EtÐt&E$EtE$oEtء2aE]EE]EQaEt,Qa]u' "Eu,EÍ& Qa]EЉ$uȍ UȐUXE \$E$=2at$]EtE$EtE $EtE2a]EE EQaE]t+ Qa]u&"Eu'E]EQa]EЉ$ufU͐US E]U~"  []ÍMӸ tuɸ~ِt&Ƀ ~҃벐UUt~B]~t&҃~҃ڐU(Qa]ÐU0Qa]ÐUE]MUɉ؁  к)‰ ÐUE]%=ÐUE]MEɉ%  ¸)ÐUE]%=ÐUhEU$<=2atE$]EuE$@QaEvEU=2a]EE8QaE]t EЉ$UtEuEÐt&;"v+Uڍt&UhE$]l=2aE$]!EEtws@Qaveڃ=2aU]EE;QaE]EЉ$Ut UEÍ١2aUE]E;QaEu(HQa]EЉ$$u!냍vLQa]t"`UXE$菧=2atE$]EuE$XQaEvEU=2aE]EPQaE]t#EЉ$htEuE]EfK"ߍv;U׍t&UXE$蟨=2aE$]EtsErj١2aUEETQaE]\Qa]EЉ$Mt UE]EXQaEvU=2aE]ETQaE]tCEЉ$At4Uu:E]E`Qa]\!_"UUhEU$蜬=2atE$]EuE$pQaEvEU=2a]EEhQaE]t EЉ$etEuEÐt&K"v;Uڍt&UhE$]謭=2aE$]1EEtwspQaveڃ=2aU]EEkQaE]EЉ$Ut UEÍ١2aUE]EkQaEu(xQa]EЉ$4u+!냍v|Qa]t "`UXE$/=2atE$]訾EuE$QaEvEU=2aE]EԀQaE]t#EЉ$xtEuE]Ef["ߍvKU׍t&UXE$=2aE$]EtsErj١2aUEEԄQaE]Qa]EЉ$Mt UE]EQaEvU=2aE]EԄQaE]tCEЉ$Qt4Uu:E]EQa]\$!_"UUSd]E U\$$Բ=2atE$]Eud[]E$QaEv؉]E]E=2a]EEԘQaE]tEЉ$ctEuEd[]J"f;U܍t&USd]E T$]$$=2aE$])EEQavuɉ]Eă=2a]]EEԛQaE]EЉ$&Ut tUE؃d[]f١2a]E]؅E]EԛQaEu(Qa]EЉ$u!zQa]t"ZUSd]E \$$=2atE $]pEu d[]ÍvE $QaEv؉]E]E ]=2aEE԰QaE]t%EЉ$3tEuE]Eăd[]"UUSd]E \$$W=2aE $]蜹EtyE rz١2a]E]؅EEԴQaE]Qa]EЉ$tMt `UE]E؃d[]ÍQaE vɉ]E]]=2aEEԴQaE]tNEЉ$t?UuHE]Eăd[]Qa]H!K&"봍vU묐U(E$]Et z u Í&E$D$ $]Et zu]+E"U(E$]Et z u Í&E $D$!$]VEt zu]E"UhdEU$-`/D$M=2at$]EtE$Et؋2aEUEQa]EQa]E$Ezt6f؃=2aEt`EЉ$tQEuXEÍvrʃ=2aEtEЉ$u!Qa]r"뢐U뜐UhEEU$D$%=2at$]EtE$Et؋2aEUEQa]؅EQa]E$Ezt1؃=2aEt]EЉ$ tNEuTEr̓=2aEtEЉ$ u!Qa]wv"iU렐UXdE$-`/D$@=2at$]EtÍvE$Et؋2aEUEQaE]Qa]E$Ezt9f؃=2aEtcEЉ$ tTEuZE]Erǃ=2aEtEЉ$j ua !Qa]oF "9 U뚐UXE E$D$=2at$]EtE$nEt؋2aEUEQaE]Qa]E$Ezt7؃=2aEtkEЉ$ t\EueE]Erǃ=2aEtEЉ$G u> !뺍Ra]kf "뗍v U돐UhE$]??Ehb=Ra]f=Y%=5?ME%RaRa&؅]t6UERa Ra]&E]t&EÁ01؁$ERawE Ram]Ð jA= jAwtEUEEEuRa-Ra]EE]CE1 RaMERaRaRaRaRaRaRaRatSUERa Ra]EÐ?M)E#!UERa Ra]UvmmUEUUE&؉ tOuU~yUEÁ~uRaUE=Ra ~v҃EERaRaÐUE%tP=)~]UE]EÍ=t)EE]EÍv=Ra]ERa]Ra]믐UXE$`=2aE$]质EtoEwb١2aUESaE]tG Sa]EzGuEEtqEЉ$tbEuOE]ESa]E{Et!0LSa]ETE DSa$]胳E{unE\$E$D$Y\$D$$YÍE\$E$D$YfE\$E$^XE\$E$JXÐU(E%=I?~M=~EÍEED$$Ytct>unED$D$E$ ^E$D$D$^ÐED$D$E$]fED$E$\ËED$E$\ÐUhEU$,=2at$]EtE$Etء2aEUE]؅EԸSaEu%EwWSa]EЉ$#u&Ew%Sa]u"EuESaِt&SaUڐUXE$诸=2at$]EtfE$Etء2aEUEESaE]u%EwXSa]EЉ$4u&Ew+Sa]u"EuE]ESaSaUِUhE$]C=2aEth$]ՐEEt[vWɡ2aUE]ESaEt=]u6Z!Eu5Et& ؍]EЉ$u빐& U뷐UXE$G=2atvE$]訐EtaEvMڡ2aUEESaE]t2]u+!Eu*E]E ؐt&]EЉ$`uUUʐUHEUE%=!?~E=~ÍE$D$PE\$E)$T$yÍ&\$D$$ZÐU(E%=I?~K=~EÍEE$D$+U)‹ET$D$E$ٸÍ&E$D$D$赸ÐUS$EU]%=~x^$[]=5@~y$[]=<~B=?~K$$蹴Sa-Sa&$[]fSa뎍t&$踻 Ta$jSarUS$UЉ%=~xYUE$[]=A~y$[]=#~D=?~P$U$۶Ta-TaUE$[]Í&UETaE뇉$ Ta$臶TamUSd]E E\$E$\$ EE$T$]]E$E\$] E$E\$] E-TaE[]UVS@E$E D$ƉӉ$T$&4$\$] 4$\$] E-TaE Ta]ԋE]ԋUԃ@[^]ÐUVSĀuE ]E$\$T$ ]]]yEEEE$\$E\$ ]]ME\$E\$E\$ E\$$覟E؃E$EE\$\$ EE^e[^]UVSPEE $T$]]]sEȉÉE$E\$Xt$$T$ D$EEĉUEEE]] P[^] U8EE$T$]]>E$E\$] E]]JU(]] uu\$4$4$\$] ]uE] ]] UVSuE ]E$T$ݝhݝx݅x$݅h\$] $T$T$T$ E\$]]]谝EEEEE$T$ݝhݝx]]݅h$݅x\$]g ]݅h$݅x\$L $EEEM\$\$ EE$EE\$\$ % \$$\$E\$ E\$輜EE^e[^]UVSpu] 4$\$&4$\$] T$ T$T$E$]]]YEEUEE$T$]]]E$E\$' ]E$E\$ EeEM$\$EEUEEE$\$n D$ D$T$$蒟pÉщ؉[^]ÐUVS@]\$u\$4$E\$ E \$@E\$E\$ 4$\$4$\$E\$ E\$EE[e[^]USE D$ ?D$D$E$Ǟ$T$ D$ D$T$$蟞Éщ؉[]ÐUSD]E E$T$]] E$E\$]eEztX- TazLuJ f,Ta0Ta[؃D[]t&w뜍t&\$$]]x $Ta$ E% TaEzt Ta$]]E$](TaEE[GUVSPu] 4$\$ 4$\$]7Ez u w$z8u6ػP؉[^]Ív\$$]]X 8Ta$EEzt4Ta$]]E$]]ċM4$\$]$%EEE Ta]E]UP[^]؉4$\$=HUST]E E$T$]]E$E\$]%E$]] E$]]}EE$]zE$]E$]EEE Ta[T[]UVS`u] 4$\$4$\$]E$]]BE$]]菀EE$]E$]E$]EEE Ta]E]U`[^]ÐUE\$Ta$ÐUE$ AD$ÐUE\$Ta$uÐUE$@D$ÐUS4EE]$]kEu 4[]ÍE$kEtt'EvE4[]뻍&Ta몐US$E$]kEu$[]E $kEtt+E vԍE $[]Ðt&Ta묐UEME]ÐUE ME]EÐU8EE$]]jEu$jE؅EtÐUE$ju E ÍE $jtEE ] E E] E U8EE$]]iEu$iE؅Et ÐUE$Oju E ÍE $5jtE E] E E] E U0EU؉uu܉]}}؉Eԉ%Y؅ٿ)1ɋEMԉEʉE؉U܋E؋U܋]u}]Í>wk؃31҉u؋uE} 4EE)ىu11 }t1}؋M Zv}E fEm}m\t&11 EE ߉ t&EEUԉU؉MU0]]}u؉%H>d~oj11 EE؉E܋Eω}Í4؉]u}]Ð}]EE fEm}m]uʸ@1)ȉ됍v11u뜐UE$说5TaÐUE$5TaÐU EuUu]}.؅ٿ)Nj]u}]Ãw ؃3~D獊U }]u}E fEm]mE]Ðt&U14) E sv]E‹u}]ÐUuu]K*xg~?j]‹u]}]uuEE fEm]mE]Ð@)ˉ벃]E‹u]ÐU4}UDUE\$Ta$%ÐUE$ AD$7ÐUWVS\EEUɋMEU}uʁU1ʉU }  ځ1ρ9]}|91ۋME؉ME$]ڑUaE t&]E3EԋŰ}EEE؉\[^_]ɋM\[^_]9D}-}}E~}҃}M؁}U}]M}1+}u6)Jt!у+M9yډQu߉+M9x)ʉ M؉ƃV~M؁}VM؁ щM&}E҃ Uaw'%%t&؃f؋Ḿ؅E؋EETa\[^_]f}UsUE)UЃ}b ‹}+MM Qt&}E)}Ѓ}MЉE )MMM ߉},fMЉ1 +u؃lj ) }ԉ}& E}t&҃mfUE $҃fMЃ u1hlj ) U؃}ETaЋUԍNUUWVS5=#UaEÍt&UaÅE Va$]] ]E%EEEUaUa%UaUa%UaUaUa%UaUa%UaEMEÐt&EUaUa%UaUa%UaUaUa%UaUa%UaUaM-Uam-VaE Va$]] EUaUa%UaUa%UaUaUa%UaUa%UaE%UaVaÐUHEUEU=?~W=A~=~YÍv t>=@O%Va$]TE]Vf$HVa$]]EE] U(EUE=?~Z=M~=|E=?=@3E%$Va$]E]!E$]EEE] E$  VaÍ&ÐUVSPEUu?~? ]P[^]Ðt&??>,8Vaw$~ VaHVaPVa%XVa`Va%hVapVaxVa%VaVa%Va$]]]+23?EEEkUEE-0VaVaP[^](Va 0VaP[^]%0Va(Va뼐t&HVaPVa%XVa`Va%hVapVaxVa%VaVa%Va@VaP[^]ÐUVSPu?Y>#1gEVaE$| VaVaVa%VaVa%VaVaVa%VaVa%Va$]]]y?UEEEzʋE%EEEE-VaVaU]fE]t&EP[^]Ít&Va-VaE VaE Va]EP[^]Í&EVaVa%VaVa%VaVaVa%VaVa%VaVaME]EP[^]ÐUWVS,EUEU؉G% ѻ uԍAE1f<9]) Gu1E E}')9M)]܉mFtAu943|9w9u܍<}̉Mu}́σ} uJEMEE‹UԉE?UE,[^_]ÍvA}E܃E뤾1۩ ut )ى) | t1u3؉Ѓ t렍t&,[^_]ÃE1"CU1҉SEUEM=) 8 VaUE=% d_ Ӂ? ÍH]]E%VaFمt؉UEWa Wa[]ÍQWa)U􍘆 E Wa(Wa0Wa8Wa@WaHWaPWa~]Å Wauvp=Va[]Wa-Waun;&tWa Wa Wa Wat&5VavUEWa WaUWVSEty% E1M194)ut<8E8?EE[^_]EE]E[^_]f1ҩu&t)WE]뫐US E3=z=Eh `Wa]E%э JӁ? ‰UPEك%dWaxWa5)‰M0\ E|WaWaWaWaWaWaWatWa=\Wa []z8u:؅t؉MEhWa lWa΍vE5XWa []pWa-tWatMEhWa lWayE []ÍvhWa lWaFt'hWa lWat& UHEEUɋUMUu]]؉ Ё =}}%E  E= Eԉ E ] }U)<SH}}Eԅt%Wa%Wa t&ً]u}]Ð}tz~}`Waf ؍WaWa]ًu}]]]u}]fLWa? ؍WaWt&}tn}}vtă}A%Wa-Wa ]E-EEt&$Vq$K؃}tN~W}t;}vWaUԅ-WaWaxMԅWabUHU Eu}UUlj]ցE?  Åu,WaEً]u]Ћ}EЉ]Å)?< 1ۉEtWaEWa] EE]EЋ]u}]f?UЅEWaҋ]ًu}]EЉ]ÐI@E봍EЋ]u}E]KEEWa-Wa]}thtEE]K?EX-E1vEu$o$:K]ԋEt?t-IEEWa]IUU@EUS$EUM]؉ ȁ =?w[?/>QXaw/]UE-Xa$ XaxA$[]$[]]?UE~-Xa$א Xay$[]Ðt&5Wa$[]ÐUS$]%=?h=1nEXaw:EE-Xa$ XaUx\t&E$[]Ðt&E]E$[]ÉE=>E~-Xa$蚒 XaUy]E$[]E5Xa]E$[]ÐUxEuUu}]]!?Q{@?!?%Ya_Ya[]u}]Á!9A?]E}Ɓ]E)EƉ}E fEmUmƋEEEUYamUmƋEEEUUUɃzuD{ D$XaD$D$ L$\$$趄y$C[1[t&؋]u}]Ð1S琍t&%YaYa$jYa}EYa fEm]mƋEEEYaYaD9<Xat; ɍt&SQ[AUU)у~YaYaUU)׃1rYaYa=t&!?Yat9Ya[t&ظUYaYa뿐UEEUE%=?>q}E fEmUmEZaZa% Za(Za%0Za8Za @Za-Za=23?ZaZa% Za(Za%0Za8Za~=?=- EEE-Za @ZaÐt&ZaZaÐUEEUE%=?>}E fEmUmEtUEɅHZa%PZaXZa%`ZahZat$ xZa pZa%pZaÐUhE}]] uljƁI?G@MEāEā?%^aH^a[]u}]fIC&}ց)E։}EĴ fEmUm֋EЉEEU8^amUm֋EЉEEUUUɃzuD{D$[aD$D$ L$\$$ԇy"C[1C؋]u}]ÐE1ES% ^a$^a$e(^a}E,^a fEm]m֋EЉEЃE^a^aT;|ZatCUf ڍe̅S@[0ŰU)у~ ^a$^aŰU)׃s0^a4^a9EāEā?^at5^a[sظU ^a$^aÐU EE %=1x}EE fEm]mEEL^aP^a%T^aX^a%\^a`^ad^aM-H^afE=>L^aP^a%T^aX^a%\^a`^a~=H?--EEd^aMÐ@^aD^aÐUEE %=1 }EE fEm]mEt[EȋEEh^a%l^ap^a%t^ax^at1^a |^am]EÍ%|^aE]EÐUS4EU]BB.?~J5@A.@3@UE~[3@tL^aك4[]f$a$Z<~̍t&=}w$a^a$]lE؃4[]$a$O^ar$ba$* ^aWUS$]Hr>~PA~xrBԲB^a ؃$[]ÍE$[]Ðt&E$`$m\#~뵐E$`$=^aE$`$ ^asE$t`^a$]EE@_a@_aUEUUЉ%=A.@v$=vG U=B.?1=/>w~^avzf^a1^a8^a}E^a fEm]mUUE^a ^a t&_a%_a_a% _a(_atgɁ-0_a-_a}j]E>UE 8_a=?-͠^a)ʃͰ^aM%0_a-_aÍv]E‰UE^aÐÐ_a_aU U%==rB==B=r>;=?~E d_a}EX_a fEm]mUUEh_am l_a] ɐt&Et_a%x_a|_a%_a_amE-_a-p_a]E2UE _a]t&E]EE]EÅ]Ef`_a]E1=1E`_aE]E%_ae-p_a]fE$H_a)ʃP_aUU9UWVS$EEUɋUEUu]с1ʁU ډM}  9u 99uw&؁}UU܁.ۉڿ~ v҃}MMԁuMu܋Uԉ})})؉ J)9؃y҉Qf$[^_]Ít&ULE"҃M}%UE)U}J +MMUԋU UEŘ_a$[^_]Éы}+M9؉Uԃx)؉MԋM tˁ}UԉQ~UԁUԁE U UEE)}}pUE )UMM UMUE ҃ ҃M ]1M E1)~-EƋEԉU ) UEUEƋEԉًU ) ҋEԍKUŐUEU WVǁ1=S9=f~ Ƀѻxy% )t1 t<)у}썴&EM ]E[^_]_a]E[^_]É)Iu=~|Z-  ؉E뱍 v)Xf)3fv) EXUEE$D$x*]UE D$E$1]OUS$EEUɋEUU%9} ؉Љ]E)EɁ]UE1=0_ 3BUM ts]EE]EE$t?]]Mvك$[]Í=}U% EtU Uك$[]Ã$[]UUE]EE$ K-%%]XEE]UE%%]XEE]UEUS4EU %9}ЉʉE)EUE=X1ہ&!t{؁_a~UEEE$Qt?]Mك4[]f=~Y=tك4[]Ã4[]%EE$농&-""EDEUE""EDEUEUWVSEUE%=@=.@=l@caaahaaEaa`aaXaaEaaPaaHaaEaacaʋEEE[^_]ca`ah`aE`a``aX`aE`aP`aH`aE`acaqca `a_aE`a_a_aE`a_a_aE`a/ca aa`aEaa`a`aEaa`a`aEaacav'UWVSEUE%=@=.@=l@0dacahcaEܠca`caXcaEcaPcaHcaEca daEcaʋEEEE%(da[^_]cabahbaEܠba`baXbaEbaPbaHbaEbadaEba]ca(baaaE baaaaaEbaaaaaEbaEbada(cabaE cababaEcababaEcadaEca'USTEU]~=ca؍T[]$rO??,8dav?>~ @daf?HdaPda%Xda`dahdapdaxdada~ daʃT[]%@da$] ]E$3E]E~$qE 0da$]a3EEEv\m]H$]]]E$]E$EMEM 0daSvE맍&USTEUEUÁ 0?@>dada%dada%dada%dadadadadaca$]]M]E$M daET[]=daT[]=caT[]$ da%daҍv$]%]E$1E]E~$$vE 0da뀐$]a1EEEvTEH$]]]E$]E$EMEM 0daE]륐UWVS E%=@=W@=g6@faeaeaEeaeaeaEeaeaeaEeafaEʋEEE [^_]ÍvtfaTea@eaEPeakav kafka%kaka%kakakakakakaHka kaP[^]Í&$]~]E$%E]E~($TE ka$];%EEEvfE]H$]] E$]]E$EEEM kan&E띐t&USdEUEUÁ> t*1?<0kad[]=kad[]=Hkad[]lala%lala% la(la0la8la@laHla$]]]J]E$MEE PlaEJ$]|]E$#EE~2$]UEkavt&$]],#EEEEvZ]H$]]]E$]E$EEEM kaemU룐UWVS E%=@=W@=g6@ma malaEmalalaEmalalaEmamaEʋEEE [^_]ÍvtmalalaElalalaElalalaElaxmampmalatlaElaplallaElahladlaE|la-|malalaElalalaElalalaElama&UWVSE%=@malmaTmaEhmaPmaLmaEdmaHmaDmaE`mamaE\maEʋEEEEmau[^_]Ít&maD ME=na%na nav'Ãw ٍv9GEE9~ˉU$]]]/5$WUE(naEE>EEnau $]]UUEEv]\[^_]1ك!c nafɉEE9~4$]UbE$]qUEEf$]UbE$]UEE t&ɍ M9E|EEnav0naw$]UpE$]yUEE$]U[E$]pUEEt&UVS@]E UUu؉ Ё = CRY($]oE$]EE$]\Ena t&مt&=8na@[^]@[^]Ít&]@[^]2f۾؃)$뽍v$]E$]'U}EEbɸt&}SʍU9EU|3@$]nE$]WEE$]nE$]/EEf$]E$]wnEE$BuEUWVS\E ]Ɖ׉$0!߁t1t6]E0zك! vu\[^_]ÉEE\[^_]ÉEہE]EdE\[^_]qE\[^_]UEHna%@naLnaw 1ăw9萍t&EE9~$]]]B/$芹EPnaEEEEHna"&Tnawϐt&$]!E$]EE ɍU9E|! DnaɉEE9~EEHnafu $]]XEEyUVS0]E UU%=؅=E$E$]U}]Et6 9}-EE]UEuM]}u؅E] =Xna]E0[^]]E0[^]]t&E]0[^]۾ڃ)&]뭐E$EuE]딐paUxEU؋E؉uu܉}}] ؋U;   ? ?´? -naXpa`pahpappaxpaoapapapapapapa naw&ف/C=naً]u}]Ð]ɋu}]مx/$]u}]ٍt&y$떍t&U؋E%=?a$]]ȉEU+EUEESQ=?C=/Cna]؋E؃EE%naUD$ na\$$]UE=na@}E fEmUmEEE naPoaXoa`oahoapoaxoa%oaoaoaoaoaoaoanaG$`naoanaoana$]] EEʐoa렁C$]]ʯE%naoaoa%oaoa%oaoaoaEi\$UnaD$$]UEɉU$]]'=na$ UEEwô?%nana%nana%nanana%naoa%oaoaoa oa%(oa0oa%8oa-@oa%Hoa;$]]-Ci?EE-na$]]%naEE naUD$\$$]]UE$tna-na-naU na\$$]UEM\$U%na na$]ȼUE  naU$]]~&UE}E na fEm]mEE%na papapapa pa(pa%oa0pa8pa@paHpaPpanax`?{%naUHuu}} ]ZtA~`x%@t?uuمy#mJt&=pa]u}]Eȋ]u}]ÅE$]u}]Í&?fff?~?E-qaqaqaqaqaqahqaqaqaqaqaqaqa paE$@}EE fEmUmEEEpaPqaTqaXqa\qa`qadqa%hqalqapqatqaxqa|qaqapa$pav>E$]$Epa]܋E܃EE%qa paD$D$$L=paqapaqaqa$]脬E;qaf\CE$IEE%paqaqa%qaqa%qaqaqa?VE%qa qa%qaqa%qaqa qa%$qa(qa%,qa0qa4qa8qa%E&qa pa$] E}Epaɴ fEm]mEMU1҉8EUEM=)  raUE=~Ð% U)E ]UE$]Era ra (ra=raf5 raÐU8E==Eh 8ra]E%U)E] ‰$ E8taw<$]/$E@ta؃4[]Ã4[]ÁA.@Ɂ3@UE~,3@t 8ta4[]4taM=}w$] 0ta$_E؃4[]f$]s$+?E8@ta4[]Í$]3$E#U8E]u}Á?EAe1EHtaw6E$$\}]LtamE]E]u}]ÁrBԲB~5E Hta]u}]E]E]u}]E]ÐE$EuE$ŧ}E]zvE$$?5]u}}E]E]E$$[}E]US$MEEUU%=/>B}] f]mUm]uM EQ ]=Tta$[]='?~%I-Xta-`ta t&='?htaptaxtatatatatatatatatatataMUEE=TtaUEEPta$[]ÉME)ʉEE$[]Í&$=Ptav떐US4UE M%=1R}E] f]mUm]ubٍQ ؃5E=ta]E4[]Ðt&=?,?~+eE-ta-ta] &E=?,?Etatatatatatatatauauaua uauaEU]؃E%EEE=ta]E%EEE]taEM]E4[]ÉMEɃ)ЉEEmE]E4[]$=ta]E]E]뎐U(E$]]]uuuaEs1$]E]u]Í&$E$i@]u]Í'UE uasE%ua}E fEm]mEEE(ua0ua 8uafua빐&UEE$T$]]Y$E$E\$] T$b]E$4]E]&MMMM$]]]]]]@uaEEEEEEvÐU8]]uu }}$Huas4]؉$E]u}]Í&؉$$"E +!E !E!E!E!E!E!E!E!Eu!Ebm!EOZ!E1t)щL9tɋTtݹ)щL9uዅ~tud?u؍W9Љ1 T9~XLutO9щUxC1à 9uʃ;~؋ $ݝxD$݅xuLdPyaDžDžu=؃|uE t󉕘$L$@yaEуu؋11 t&9ya 9}ݜXu؃}}aXЃuM ɅݝpptQܭX~XЃ9}E XĜ[^_]A}u؅XBZ9uTBZ9uu8M ݅X݅`YYH$؉D$Dyaٽ @ya f٭۝٭ۅ٭\٭٭\٭a}x,XuU cٽ f٭\٭U ݅X݅`ZZUWVSEMuDž]`yaVAHЍxM11H]+dمdx9}ڋxZ1ɉHȍ1t& 9u9}L|xلٽUya ft&٭۝٭ۅya٭٭Du؋$D$ya$ٝh yaٽمh f٭ە٭ۅWT+)‰Ћ+D1Ʌ~>1tf)щL9tɋTt޹)щL9uዅ~uud?u؍W9Љ1Ґ T9~_Lu|t&tO9щxUHvx؍1 9u;~$ٝhD$lمhuLdyaDžDžtP5؃|uE t󉕈$?L$yaEu؉1ɉ1dمd1 f9ya 9}ٜu؃}}FuM Ʌح~9}E XĬ[^_]R}u߅BZ9uTBZ9uu8M ممYYN$؉D$yaٽyaɃ f٭۝٭ۅ٭\٭٭\٭i}x,uU iٽ f٭\٭U ZBU1VuS] t11Ҁ<9ډu[^]ÐUWVS#aډ$EU؃4$ T$Nu1fraD$#a$(ډ8 ũ,[^_]D$/4$XuCSE눋Uĉ}Аt& << }|Mȉ\$ $UuȅIM\$ $U}IUdUǀ]fd US0i-QXi-Lø-LЉ%[]ÐU UEU f `#af b#af d#a fJfRfǀmfǀfǀffǀ `#a]fdUU-0f `#af b#af d#a fJfRfǀmfǀfǀffǀ `#a]ÐUEU fǀ3fffǀmfǀfǀfǀ ]Í&UdU-0fǀ3fffǀmfǀfǀfǀ ]ÐUWVS1ۃ} fU$$)uu؃[^_]ÐUS]u# !ʁ t8t8uU $T$؃[]UWS1ۋ}] t7t{8t}Gt"tf8thGt tQ8tSG ˉ Ӄ!€u1ٍ!€tӍG@t8u8t1e[_t+tGttGt tG!€t딐UU EVS u>Ƌ;u4!1ကtG!ˁ u<; tut&t: t)[^]Ív1[^]ÐUU EWV ƃSt"1Ґt&  u[^_]Éэ!ကtƐUUW} VSքt3ut&t8t t&8t uu؉[+E^_]ÐUWVS}Mu tR9teG:tu))t1t:t u)؃[^_]1ۉ4$~[^_]1ۉ1볐UMVu Sɉt/Utut t&[^]t&tuڐUWUt%GtVtGtGtGt8&!ȩtGtGt GtG)׍Ge_ÐUVSut$Au[^]ÐUWV1SE}t81&t)9]t!$U $)tӃ[^_]ÐUW}Vu S]u2ȁ!ȩuf !ȩt:u1 tuD u[^_]ÐU1WMVU S] ΃u^vY1;2uS!瀀t%v;u*tj!Ɓ怀uXw؅t]E.&t.]عEg&;Mtv;MtCvMӹMӹ!UWVSˁ\uM؉{14=ut*Vf1)9Ɖwꋽ$D$E؉D$VDžƃ)DžD$)D$<$"D:;C9vK 8 Tt& 8 9wꋅ9sH 8 $ 8Lxu9r9E䋵)Ƌ1‰1\[^_]ÅtU䋍)9B1뱉+;BDžEF)DžD$)D$<$?3D:98 u`  8 u;9rt 8 t =8u4u\[^_]ˉ}⋍< 돋9\[^_]Ðt&UWVS\U] t9ދM vt.8!u>tEE\[^_]Åu)މD$E$Et9t4E+}9EGv"Ẻى4$+E렍ẺE뒍M$EԉD$E؉D$4EԹ1+MEEĉM֋UD$U)ẺT$$HEȅE;uC9v1ŰM 8 UU  8 q9wE9v7EċUUЉU 8 tMPL8Lu9r9fEE)ƋE3M̉+E;EBE1MԃMȋMԉE+EԃEĉ׉MЍ&7)ẺUL$D$$?U;uM̋EMMȉE 98 uoEUM 8uU9wUMMЃME8 uUȋMU v8u<uM&UE}ĉ}-U1U‰UU}޿0MMmEM뙋EEЉEUdD$ -/D$E D$E$ÐUWVS}uOE t 9utEtO}} u q9uۋ}tE0[^_]1E[^_]ËE1ՋE81rĉ'UED$ D$E D$E$)ÐUWVSM 5qaDu-+E0}}UU}u1-1uE1U?09]~`;E;]~ ;Et EuTutW7E)9]tn]څE‹UtUDM [^_]Ív0t^}0ЍTUU#qE}U-"XtxuYEEEEt&'UED$ E D$ED$d-0$"UED$ E D$ED$d-0$UWVSM 5qaDu-K+EM}}E1҉EuUE11u?09]~`;E;]~ ;Et EuTutW7E)9]~]څE‹UtUDM [^_]Ðt&0t{510TEDEUEЍTUULfE"{EXt xtYEEEE&UED$ E D$ED$d-0$UED$ E D$ED$d-0$UVSut$1u[^]ÐUWMVuSU ~)&|\9F9uD[^_]UE]ÐU(]]ux"qaS DDډ؋u]]ÃtauqaDuӍEuEE]D$t$$xE$34$D$`u]{U(]]ux"qaSDDډ؋u]]ÃtuqaDuӍEuEE]D$t$$xE$:4$D$u]{U1VuS] ft f9t)[^]1[^]ÐU1Uf:tЃf8u)]ÐU8ED$EED$ E D$ED$d-0$ÐU8]auu }d=kt$0/|$D$ ED$d-0$Ӌ]u}]ÐU1VuStR:u19r;A|FɍY9֍s& Z~Yv19֍r፴&[^]ɍYčt&/t|р9ɍY말UED$ D$$Í'UE D$ D$D$E$ÐUHE]u}tau܈ED$D$4$v=at$D$ D$ED$ED$d-0$UFډ؋u]}]ÐUS] Ut D$$][]tzt&UWVS};=saWLt611ut&؋$4zuWL u։$zG@t$ zHt"L9u ؋$y9uGTt$yG8u[^_]É<$W<t<$D$[^_]Í&'UWVS }tBHt^x Ty6uGa/a asamajaga [aCaBa" a aa{ala]1aNa?a0a! ana aaGa8a5a&a&a a a7a|#@am/a^;aO8a@+@a18a"*aaaaa އȧaUU tE t@t8t0vv_ t 10]ø]ÐUUB v"v) (  ]Ít&]ÐUE U v1$ at&U' &U&UG&U&UW&Ug&Uw&U&U&U &U &UW UE]0 ÐUS]$N1u[]É$ []ÐUS]$,9[]UMSBP0B̓$` T* YMt& xtHw3sA`a9s+8t)8r 8u:Hv߃t1[]ø[]Á t7et&!tfu {aX%t{vg?3KGa #<#r at&y a = aj b`a>$ !a,~R*(f&&'#atfwAt*Ja]:aNGa?t*]TaNa Qaa+aaDa.ВaqU`ab$t*4Ēa?a0a!OatR6a0`awDt'aa&aa| ѐam/t^w=-ft'. EaG a8% a)1t8r'2Kla Na Ta]aaat*Haa4a~tqwAt*oaQWaB]a3 t5 aۃ aGuaaa aǒafaaxatHajthwAt*~a=a.at;w*; ёaˑaa ڑat\w=ft' avaa t' Pala]4aNra?Aa0a!! t&-a qa Yaaʒat5ْaۃaGpӒaaaR#t$~ Ȑa8a)Őa*a eaUS]$1t[]É$X[]ÐUUBvU tPtHt@v.v%( t_ t) t 10]ø]ÐUS]$~9[]UEPvPЃ vA]ø]ÐUWUVSdҍtPс'/?`a҈tփ?`at u[^_]Ðt&퍶UWU VS]ҍtKй?atփ?at u[^_]É򐐐UEt#D$ E $D$ED$Ívd-/АUH]]uu}}ۍD؅tKaE\\$|$4$D$ED$ E D$Uu ]u}]Ë=a\$D$ D$ aD$4$D$밍U8]]uu }t_=a贵\$t$D$ED$ ED$d-0$׃udǂ]u}]Ð5aU\$D$ D$ aD$D$d-0$뙍vd.KUUt1:]ÐUWVS\uE] U} EEۉEM1ۅtt u 1ۉU#Uĉ U ҺD;]tG)NjEU|$ L$D$t$$UtPt]E.&t.]عEg&;Mtv;MtCvMӹMӹ!UWVSˁ\uM؉w14=u~tf1f)9Ɖwꋅ$D$E؉D$菼UDžDž)щ))񉍼;C;sD 8 Tv 8 9rꋅ9vE8v 8Lpu9w99\1[^_]Ë1‰Ʌt ;B1뮉+;BDž)Dž>9sK 8   8 us9rt"8t& 8 uu\[^_]f+9.{&‰Ƌ\[^_]Ë&'Ux]]uu}}ۉu]Ћu}]Ív1;] ww(E D$U4$D$[UEuU뺋U $맃t)u 9uwMډL<$EԉD$ED$褸؋u+E;EBE1ɋUUԃEEEE)uăỦE;]v2EԋỦE 8uuUЋEM  8 uY9wMuEE87u$EЍEM 8 tMME)9s1MEMMuԉًEЋUEuċu)щUU)U)މM1EEuȋE;MC9v1uЋU8UЉU  8 uo9wE9v6uŰE8u\uủ]f\0P8\u9r]9wAuűME9Ei1U1U‰U؋EË]Ѝ UUUMUWVqBS] t)1tN8ЉuDt&t:8t=Buw61t 8tt&8t u1[^_]É[^_]Ít&  Nj21!𩀀u w두US]D$$[]Ít&'Ud-0$ÐUg*g*S] t;Ⱥ_ N)i i iɧAy%[]ÐUU EVS u1 Ӎ! t XɈt XɈu[^]ÐUWMVuS] tpts~tmDžtWG҈ut1f9uȅE[^_]ËЍ!uw뉉[^_]É뫐UWVS;s/2$9$,9t99sOf9se2$$9tɋ;cEM)t&뿋 v\[^_]Ët UM)9BDž떋DžsE+;BUE䋅Dž)DžMD$)D$4$裮D$D9sS;s+2$$9t9wpM <3$2$|9tЋE߁\1[^_]Ë\[^_]Ív'UWVS\U] ;t[׺މ]Љ>tP$E$9E!uljڋ]Ѐ>tEE\[^_]Éڋ]ЅuE)މuԃ}Ev Eԉى$EEE\[^_]ËUԍM$EĉD$E؉D$,UE)UEEvEED$E)uD$4$9U.E9EЋUƋECu9uԍ<v4}9uv'3$ỦD2$9t9uwwEċUЉE9v@ƋUE<} 9usMũ3$VUȉD2$D9tӋEЃ9EUEUE)‰UЋu u֋EEEEߋUċE+E;EBEE)UEEUt&UUD$)uỦD$4$ܪE̅uċUE9uԍ<v7} v9uv'3$lUЉD2$Z9t9uwNut_UEȍ<}tI3$'UЉD2$9t֋UUȋu3EEE޺8EEȉE6EEE(US]E $D$臷t[]É$赺[]ÐU1U Mt"9t t&8tu)]ÐU]Éu@օtCt$։$K]u]Í'UEU tÐU1WVS] u}u [^_]Ët4$D$׃t|tЋ4$D$׃u[^_]ÐUUME t tÉEFEw&UE D$ED$d-0$ÐUE=w#@vPv (w ]=.,"&=0e3vbƒ]=wr=r=p=vo(wzya]Efƒ]Ív=w~ v4 0.=? ƒ]Í&]==ExiZKx<h-XPE]Ðt&vvvh`Xv]%`%G=qCƒ]ÃP]Ív= ]Ƀ]Ív=+wcJ=+!=&!=*!kD]Ƀ]Ív]à ]=,.bli$@a@]ø?]øR]øP]øq]øQ]Ã]ø}]ø}]øk]øa,]Ã]Í$= $xa]ø]ø]øf,]ø]Ã]øe,]Ðt&Zw~Y YYvuX vjX =D]=$wu/PЃ%F]=]ø]ø]ø]ø]ø]ø]ø]ø]ø]Ã?]ø]ø]ø]]ø]Ít&%]=wK=y=}_^m=`D]ÃP]=rcTE6p'`wa]EÍt&=/=N!=!`0}.zwbw=v,=s,=,=,bw%Z=e,>=f,K=a,`,D]Ã]Ƀ]øc,]ø}]Í`Y @Y1Y"X X<X=|=z=]Ã]ÍsP؃'F]ø!]Ã]ø2!]Ã0]øI]=Y=D==h=Swt&(=@=t}=?~,U=&==w==t%wF=tw!=t=t =MP=t==t]=tw!=t=t =P==t=t]=Qnp,o=Po,Z=YW=V=W=T=&==]= =qwV=k=ou=i=`s=c^=[=u\=}G=r\=tXw+=nD==(=M=g, =:]úS-`]ø>]úzpf\RHb,>4*d,  m,n,EU(]ÉuΉ}׋Ptdt$D$$׋Ct Nt$D$$׋Ct Nt$D$$׋]u}]f@uL$D$$׍UU EuÅt1BUESU t& Xffu[]ÐUVUS]M ЅtS1Bff2tK t.pffutىfu4^D[^]Ðt&ƉԐUX]E]uu}} fEօۍD؅tEaEt\$|$4$D$ E։D$UЃu ]u}]Ë=a1\$D$4$D$ EމD$빍vUX]]uu}} t[aEۉ\$|$t$D$ d-0$Uԃudǂ]u}]Ð5a腉\$D$D$ EމD$d-0$d.[UWVSu] fu4&ft$$z9t$h$[[)Ɖ^_]ÐUES] f8tf:u ftf  fuf[]ÐUM Et&f9tfu1]ÐUES] f ft&f  fuf[]ÐU1W}VSftAE 0ft f9t+U f9t fufuАt&)[^_]ÐU(uu ]}4$覷x?$5t|$t$$B؋u]}]ÍvUED$d-0$ÐUWVSMu }f9tstWGt f:u))t8ft@t f fu)f؃[^_]1ۉ4$ö[^_]1ى1먐UMVu Sɉt4Ut'ffutf)[^]Ðt&fftfuӐU1WVS,}u] u ^t5ft0f;t*$jE$\9Et$I$<)Ɖ,[^_]UEVMSu f8t f:uuftfuf[^]ÐU1UW} VuSu"ft$t f9t)[^_]f1[^_]ÐUUVESu t;Hfftt#ffutfu[^]ÐU1MU f9t#t t&t f8u)]ÐUWVS\}Eu MD E1ҋ]ۉE1҅u M̍]ދGUMċ aEȉMMЉ|$D$ \$D$E$UԋUtp 9MMrPM t~1ҍv  9u֋EMf9tuM9MvLE̅tEEʃmevMċEȉG\[^_]ËM\[^_]ËUԃ\[^_]ËEEEU t EU\[^_]ÍU(ED$ED$ED$ E D$ED$d-0$TÐU1UW} VSft:7ft f9t+ &f9t fufu1v[^_]ÐUUM f:t&Ѓf8u9wfuf9t 9v1]É吐U(ED$ D$ED$ED$E D$E${É'U(ED$ D$ED$E D$ED$d-0$3ÐUUW} VSft*7ft"ff9u'&f9t fu+E[^_]Ít&fuʼn+E[^_]ÐU(]] uu}f;u]u}]Í4$$9s1f>ft;ftt&f;9u+1&tf9uTfu됐t&fyAtUWVSL] f$uh#a}l#a]D$ E؋EU܍U؉T$|$D$$H $M-Mȅh#al#aL$ |$E؋EU܍U؉T$t$$UED$t$$hEt^E]ȉ$$9EvoU]ȉ$4$D$裤EtLU9s)U)SU4$]H,EȃL[^_]ËUtUL[^_]Í&U뾃L[^_]ÐU(ED$E D$E$q$]VEt]EÍ&EpUE D$ED$d-0$Í&U(E D$ED$d-0$$]Et]EEpUED$ E D$ED$d-0$ҤUWVSutz} Nt 9uvtCuu t&u y9uۋutfE8[^_]1E1[^_]ËE01wАUWVS;]~ ;}Et}E<;$utA09]~_;}vE؃01҃0LM؉Mfv$زt$l 7)9]}tF]ԉ؅DNjMtUMDu u 1<[^_]Ðt&E}U-"fXt fx8^EEMMt&UED$ E D$ED$d-0$UWVSD$|$ D$CaD$Ya$^aDž&D$|$D$ CaD$MaD$Ya$^aDžED$a$]D$$D$nD$ $胈t$rDD$F$:DžFAD$$D${nD$ $ t$:^a$aӋ}uPUЃE .u>tӃ}9}M}Ā }kE8ttu9]M]Ā ]ĉ+}ȉӃ0tIVЃ vM EDžXDždQ Džhf\QTQf^Q pQ(D4$xP`$D\$]|$D$ $x |$$VD\@tE fH @4$ȃd$ E P vEM D$EDL$$!Du/(#M fI @t&t$ E @ tLEЍUЉT$$ =M A @D[^_]Ív $M8d$H막Ѓd$9MD $s_@H$zLE$Q_LҋD@TyqT9bVHЃ Bx|1ɉӉt&;  NwЃ v쉽x$|"Dž*G7HЃ Džw1t&AHЃ v쉝ɹIO:E++|]܃9É{2EP HXUE܉UM]E$ E#&|aÃ|A^$xcE0E.Džmƅ۽y ƅ- (|Fƒ|fʉu$|Et |e,UĉT$ UȉT$UԉT$U|$\$۽8D$$ڔ|Gۭ8t |g""؋E+t|Gt |gn#Eԃ$%9%;tDž|g,PDЉ%h%TDžpDždt(9~!)Yqډdu؉hpdLT"1DžEIC|9u.5Dž|  9uA55vy  ~-M܃9$/EPUʃM܉H |6g;u55ځ 1 |I;ud55 1IËh)Ås5E}J aBEE~ҋM UT$<$L$|t0E(멋] MEL$\$$JBE獽(w  (LDžt؉*$t$D$ D$ _щ D$ D$ $t$B0ttT9tu<tw {LHL$D$<$kTTDžtzD‰T.0'P'X(ڃ u勍4)\tbT}J;aBEE~ҋE ML$<$D$IA0E( 9u5]D$D$$MX?11ۉ &NjEfD$EUT$ L$$99u E1DžDžDžpDždDžhzBJEEEtM U]T$L$$}0E(?U EMD$T$ $}|0E(E ]U\$D$$O}G0E(r U܃9 KE1HMU8 M܃9 EPUM1 + U܃9" E1HMU<σaZ]EL4+<0^04)щEDD$D$$TҋDM܃9EPUM܉‰D$E]\$ \$$`~1I1EDžDžDžpDždDžhEJaZ]EE ]U\$D$$z|EJaZ]Eh)U;t l`EY]Et))9؉N؅~E9Y]EQ1IÉ)Å9"Eu} Q[aAEE~ҍUT$|$4$yyq0E(묋U EMD$T$ $Gy?T(NjpzpMpLHAEEET)9N؅~ E9Y]E3ۺHډ)څ҉`EfQ~TaAEE~֋E MUL$D$$=x5E0(aY]ETM U]T$L$$w(TdU܃9wEHpЃM UrU܃;2\EXp]U܉U܃9.YEHMU܉U܃99EHpЃMUl@9uj5ۉD8@b9u5fjU܃9EHpЃMUE܃9mEHME܋ M܃9EPUM܉,U܃9#EHMݔU}DE MUL$D$$btZT(cDžU$D$D$HME̋D$UML$\$ $D$苾91IEDžDžpDždDžh|WE*E ]U\$D$$gs_(n;u516;u5;u>51Z9u5 9u5@;uE555O;u`݄59u757 9uw5ۉ%55 U܃; 55' ;u5R ;u51 ;u:51%55 M܃9l.EPUM܉J$]REI1hD$ D$E܉D$E$EM؉L$p E؉ىD$D$E܉D$E$EhT$ phD$ D$E܉D$E$EM؉L$pD$E܉D$E$EU؍hT$L$ AphD$ D$E܉D$E$EM؉L$D$E܉D$E$EU؍hT$L$ Q;UF gU Eۋ E-jpEJaBEE utu `lAEEEZ ۅ>[}u 7aAEE~ՍED$t$<$rmj(E벋E ]U\$D$$Fm9J׍t&FDžDžI1DžpDždDžhDža  mvE-Dž`ada|GNE牍DžDžDžDžpDždDžhڄt80UUĉ] MEL$\$$k( |Gt |gDžDž|F |f Eԅu T1-E-DžۉIM U]T$L$$jE(tY]E]WEaY]E($wRIElaDžha|GNEvYM UET$L$$i(|1||AM1ۃ|aà D|ɈE E+ gfff)) A0шٍC09KUsU 9rE)‰\tttDžpDždDžhhDžpDždaY]EM܃9W EPUM6EE909‰EwE ]U\$D$$g(=Dž4+.E$D$a(aٽ,aDиҋEEԄۋEԸpaEδ fɃ٭۝٭ ۅ Jt{ɉu0a؉񋵜zux109u+tEPUpLU܃9 EHMU܉ 9u85TU܃9M EHMU܉-]MẺL$D$ D$D$$HUU܃;59u 5EPpUEX]U܉ZEPUKU܃9EHMU܉E0U0 :M A u ȃd$EЍ]Љ\$$3Dž0EPUEPUpEPUU fJ @EMM UET$L$$cxt(+U}hD$ E܍M؉D$EL$L$M $"hD$ D$E܉D$E$EM؉L$;E؉ىD$D$E܉D$E$EhT$ 1UY:Au0EčPU@:t<9l U EMD$T$ $Ab9Uԍ( ] MEL$\$$b ]ԍ(T tmU EMD$T$ $a=hD$ 1D$E܉D$E$EM؉L$rwM U]T$L$$baZ]ԍ(EwzD$E܉D$E$EU؍hT$L$ D$5D E1PUEPUEPU,DžDžD$E܉D$E$EU؍hT$L$ #HXE؉ىD$D$E܉D$E$EhT$ hE牵E1PUQEE-sU~EHM \MDž|f8D$E܉D$E$EU؍hT$L$ D$E܉D$E$EU؍hT$L$ EPUhD$ D$E܉D$E$EM؉L$蓾@EPU/EPUU܃9EHMU܉U܃9! EHMU܉EP UHXU܃9EHMU܉yM܃9EPUʃM܉tEPUU܃;v5EX]U܉U܃;~{5E؉ىD$D$E܉D$E$EhT$ 螼edy9B0EPUQEX]U܉YE؉ىD$D$E܉D$E$EhT$ BEPU2z)؉EEPUqEX]U܉}EPUMD$E܉D$E$EU؍hT$L$ JM܃9SEPUM܉2EPUD$E܉D$E$EU؍hT$L$ hD$ D$E܉D$E$EM؉L$脺-uDžE؉ىD$D$E܉D$E$EhT$ qEPUHЃ 1ɉk |0 vӃ|$, Q;URM܃9렍E؉ىD$D$E܉D$E$EhT$ 蹸hD$ D$E܉D$E$EM؉L$~X Dž鳿E؉ىD$D$E܉D$E$EhT$ EPU A EPUD$E܉D$E$EU؍hT$L$ 詷EPUs)QE@D$E܉D$E$EU؍hT$L$ CLEPUEPUM fI @4EPU)E fH @|EHMEXE؉ىD$D$E܉D$E$EhT$ qEHM Dž锽hD$ E܍M؉D$EL$L$M $ UED$ E D$ED$d-0$ҺU8uu]]}tF8tp}|$$C tGE 4$\$D$C u d$E|$$r]u}]ÍvCd$U묍v4$8농U8d]] u}-0tP8tzut$$C tQE\$D$d-0$#C u d$PEt$$]u}]fCd$뢍v$yUS]D$$膅{aB͋E $/x5@`xaffuE뤐U(]] EuuD1u]u]ÍMtxf1]>u]Ðt&E$x.DaffuE끐랐U1 M $Ut$]|$tf;vdrvs(w;(Ӄ Ӄ?ʀˀYQ$t$|$]È$t$|$]ÍӃ?ʀQ$t$|$]Ðt&$@Cs - f ؉f ΀A?ȀA SSCs ‰%% ȀAЃ?%ʀȀAQ&U(]auuUt$T$D$ E D$E$Ӌ]u]Í'U1U Mtw ]ËE] U1(uu ]]}}tہw]u}]fE $rx>@1xa <`t, 9u`]u}]Ív댍t&'U1(uu ]]}}tۃw]u}]Ðt&E$xPa9t]ʍ  a9t.u]u}]Áyڃ€o퐐UWVSÍU$aÍUVSuF8^F9C @fC D$ D$\$4$C뤍Cd$U`Cd$l뚍ut$$BfC d$1϶JEt$$UE D$ED$d-0$IÐUWVS<}]MtEP8ED$$0C @U LC @tpCC t\$$).  t@CC tˆ uC d$E EMt&9Gt$D$ $Ub UЅ)s3Eԉt$T$$3u)t+suE\$$us뙋E9E EC WED$E$E <[^_]ËE\$$Cd$葭C e$p8E E <[^_]ËE\$$Zft&)։E)st$T$$U E0C S;U C u d$qED$E$E v봍&UED$ E D$ED$d-0$"UH]] }1uut F8ED$$OCdC E\$4$SNjC0tS 4$T$ЅHC C4tSD9t$tC4CHt$^CHBEfC $AEԉ$ƲAED$E$]u}]É$舫f{ >E1$ED$E$^]u}]É4$7fC$赬&UED$d-0$ÐUWVSu] }t F8ED$$C %=S,@t C1DžpC ftu#aKtfC d\$4$KdE|$ D$C 4$D$҃C4tSD9t$gC4Cfc CChD$D$$ C aED$E$Ĭ1[^_]C LED$E$hĬ[^_]Éd\$4$fC dKXHM;CC)M1DžpCd$C %=0\$4$4$vEfK CPEtpC4pWClC@hC<+Cl)hh9t)h9tth)ʋK)ЉCpщ t CD9ptp$vC4fc t&{4+Kt+K@CC aKXC)lC4pC@h)%fED$Cd`4$D$ Rd`EEtd$轫C d$裫KPD$ #tL$C d`4$D$ҋd`CCC4lt,CD9ltl$(`dC4tfc )d\$4$`d`C9) CqD$ D$C d4$D$ҋdC vCfflED$ld`4$D$fPd`uE%=C ftHvd`\$4$h`d&D$ D$C d4$D$ҋdoCl+CDžp)lhC s&UED$ E D$ED$d-0$UWVS,u] t ~8}|$$C tkK,tdsXt+S4+st+s@t-E|$$6,[^_]ètދt+SuӃd$荨ƍCd$C D$ D$C 4$D$S,t+C r\$4$C U4$C \u d$E|$$t9 UED$d-0$ÐU8d]]u}-0tP8tbut$$C t"[Et$$؋u]}]Í{d<$ĢC ft[uʼn<$*뻉$dǀ ՐUED$ E D$ED$d-0$UWVSS4C0)uKHtG[^_]9F)ΉC0ЋCGfGfGfGG <@q<G  fGfGfGG fTGSUGCUfUWfUUf#U5 -уfmGOCECfMEfU! GfGfGfGG hGfGfGfGG 9DEE)GfGfGfGG G fGfG@fGG UWVS E@y4UEE=)EEX.)1fG u9]J}}!EUUf VL9]!E41҅ϋE뾋E11҉t$$D$ [^_]Ív'U@VS~4tzt@qua1 Vf P9[^]Ãti5uaՍff@f@f@t&fP u[^]1fPu[f@^f@]þana_UVSf8rt5PHffSSfyt0AYf 9u[^]PHfSSfyup1҅ufS uf[^]Éز[^]&UWVSÃPt 1CfF uP[^_]Éqt1GfF uP[^_]Ívueu{u wtzÉ9øD1fVfF ufNP[^_]ft#aDu?t#a#qى؍Uڍ]lcU}f҉EtCft Xf`d$\c`z\$GX40at\da5`zad$ffMfDžJ+f8P48Pu!U '"T|MU U|UTT+*LTTVXdETÍD$a$農DžX'D$a$虲DžX'<-tX¸*+Lƒ \\ƅ1ƅ.ƅ0\XfJtND$a$DžX'TF1X$U 1ƅD$a$诱DžX'X\V1`CfF ulZfDžr@FDždafDžBDžX`4`z$dg1t&EzfTEȃ uUډ%-?L)1t&TEfG u~I~-DMHf9uD)ʉ af!fLx^1Gf9Ezu+ u0EzfF uBXfѭBdНad1Gf9TE ufDžFfDžHfDžJfDžLfDžNfDžPfDžRfDžTfDžVfDžXrfEf-@fr1FfC u0afEz u艽L\fDždfѭdНat[НaHvы`$N`z$&dX떋Lzot#az\O1ҍG.ʃ|F؉&`DžX^1&GfF ufDžx0)fbfdtfbfdufxu?bf9av/1FfG uXXfDž^FCl`aht<1afG ulDžXF`!Lt;4uaKtR@1҅t%apDcL9Dt=afW uZCt#;4u&l,a7*,ЉL.+Lf@f,fD1ɍLMfH u싕L0fDžLM,fM u苅L0fDž*LHfM, u싕LfDžDډLo},,f@D@f;,V`LD$@T$D$t,<<f;twfDžFfDžHfDžJfDžLfDžNfDžPfDžRfDžTfDžVfDžX,A1)fDfnDžD1ҍUf P ufDž0U,fU ufDž*0 PfU, u,fDžDDžDf@:fEu uLfLUS0E]֋PHUډMEEU1uЃ0[]Í'UWVSEDž<Dž@$X[tDž<XEDžP8 u1҃8 tPۋX~,Xt1҉ t9@uDž@}܉@t&f9uX1fDžJDžDDžTdDžLDž8Dž\dʍAЃ ` T \ `\tmuiZЋd wYЀ vɃEte&x0Hu&z90tdz}f}\LN1FfTE uEfE-E%EEf9u`fEE,fzk@J@fU;f}$f}fEEč]fEuE%=Ef9u$D$"<)tAG!E{ M\$D$ $%=l  6D$$) ؋ 92EU x<9}싕 }ҍDpd-0U$T$ U T$UT$ÐUdU -0T$ UT$P$T$UUET$ U T$P$T$ÐUE fEEE$EaEEfEEEED$ ED$ED$E$O9Í'UED$ E D$ED$d-0$bU8]] uu}}E1tG4$PЉD$U$.Uɉ tMT$t$ $܋1]u}]ÐU8]] Euu}E;D$ ED$EED$E$U1u]u}]Ðt&T$$-…҉ tϋE<:<$D$ED$,]1u}]ÐU1(]]uU }uu]u}]Ðt&:;D$${-…҉ t̋E<:\$<$D$謊]1u}]ÐUWV1S1ۃ,}Et$e\Eu$=,U EU t?1ۍ&$%PT$UD$E$ UU9|1,[^_]ËU 퐐UWVS<}uEt?uE1<[^_]ËE 1E<$Et3EЉE$聙DED$E$]u׋$I+‹E҉ tEЉ$*<$3ۉEEЋE0tD1ɉ]ԉˍED$E$K]$EỦ4$T$x|$;]|ËEЉ$8*<1[^_]ÐU18]]uu }}tS$蚘P L$)ȉUD$$ˈU)ЉD$$+…҉ t0t]u}]fE$)E]u}]ÐUWVS,ME}U ɉE7999tyYu{Ct9uEU܉$裗U܃ED$$:*U܉ɉ tC))؉D$D$E $詇ED$ED$$EU܋E1,[^_]ÉE,[^_]hUWVSL]}u$EȋE$UE+EȉE̋U EUEU UEt%|$t$$UtEŨU׍vUuL[^_]ËEЍ}u$^(UEUԉUU UEUEti|$t$$tE+E+EȋỦD$Eԉ$D$EċU+U+UȉD$EỦD$$UUUĉŰUU됋UU +EԋỦD$Eԉ$D$EЋUD$$Y(‹E҉ EЉ$D$ED$胅EЋU tU$&L1[^_]ËU$&EӐUS]MU tu[fE1EEEEED$ EfE $D$ED$1x EEĄ[]ÅfEUUy1Ą[]Í&UVSĀ] d Utu[fE1EEEEED$ EfE4$D$ED$ 1x EE[^]ffEUUyǁ1[^]ÐUED$$ÐUED$$ÐUVS d]-0tP8taut$$^UC t-fC u d$'Et$$/U [^]ÍCd$#C &$e땐U(ED$d-0$kt EEEEÐUED$ ED$E D$E$ZÐ&UdUT$ U -0$T$UT$"U(EED$$D$ED$ ED$U(EE$D$ED$ E D$Ð&U(EED$$D$ED$ ED$U(EE$D$ED$ E D$Ð&US$]EEv -SD$ d\$T$D$D$g-0$1EÃ$[]ÐUEE$D$ E D$ÐUWVSӃLMEU\$D$ MӍML$ML$M܉L$JL$$kÚ}'1ɍsE tCC.Gssщu1tDuԃDփ}g}G~109uEӈM܃xlF+c~ ȺQ)B0kҜщȺgfffF)B0kL 0NL[^_]EeEӈM܃yF-كEErD$$ ĉ0UWVSluE}Ud-0v w~ML$M\$T$|$D$ L$$,j;Es89Ew9M~1t&0<9}])ؐl[^_]ÉT$UML$\$|$D$ T$$idM-0#9HP~pT&M$L$@T]UMЉ$@!UMЉ1Exd-0HPXT벐&UWVSLuEd-0U]T$U\$D$ $\$T$UT$h1ɉ;Est&89Ew9M~1t&0<9}])ؐL[^_]dU-09PP~pT_}|$@T]ȉ$5 1Eȅtd-0xPpT&t&UWVSl}E u]Evas]ȈEĉ4$cEETE܉D$ED$ED$\$t$D$ <$gM'8ɉ~REԉ} ZMu~! t&~0MM u 89.MEԉM~4t)NjM t0EM}u ~uE t~109u؃l[^_]ÐU D$N$T$ cl[^_]R0Cl[^_]ÍE܉D$ED$ED$\$t$D$ <$#fq&0D$$i넉UWVS\M EE]Q"`$ at&ۺDU$\$\$D$ U$U܉T$UT$UT$$eu'E8U M~S}ĈE fXuu}ą~#E1&:09uEEu$9M.EۉE~6ut*΋E t0E1t~u~109u؋E \[^_]ÅۺDڋU$L$M \$\$ $T$L$E \[^_]ÍvU$ɉL$$T$ U E \[^_]À9tu$}ąf0UċM T$ $1TMċU UHU E}}]U܉EET$Uu|$E$E<$膈ƋE$yE؍D$Zø tUt$|$$Sx3=E؋UD$D3T$$2xUE܉\$$D$$EmEԋ]u}]ËE܋U}]uE }U]UW1VS1ۃvEU\$D$$[EuI$i!D$=Ɖ$7tU t$UD$$\tb4$눉$ !D$=Ɖ$1҅tPT$ E Ut$D$$8A[^_]ÍE U\$D$$널UHuEu ]}}D$D$$T[ti$薆Eԉ‹EȉEEԍ9Et'EU܉$))ЉD$D$vU܉EEU܉ $)ЉD$U܉)]u}]ÐUWVS1ۃ<}u EfD$=$谂t<\$L$$ZuҋEtD$$k<[^_]Ð$訅PUM9Mt$)+E$D$ED$uEԋM+MEoUHEuuD$E]1ۉ}4$D$Ju؋u]}]ÐE D$ D$4$D$!OxˉtE9t 믉4$UYtML$$FUC Ef{ t U [ C$aC(afSC,aC0auCuu҉$zu C t=ED$E$ FC @fC ҉$D$S뫍Cd$U붍Cd$UB҉$D$}SoE T$ D$4$D$ME&'UE D$ED$d-0$ÐUHEuuD$E]1ۉ}4$D$Hu؋u]}]ÐE D$ D$4$D$1MxˉtE9t 믉4$UWtML$$DUC Ef{ t U [ C$aC(afSC,aC`@aC0auGuy҉$u(C f fC t9ED$E$ DC @҉$D$S맍Cd$Z뺍Cd$U7҉$D$SkE T$ D$4$D$KE vUE D$ED$d-0$ÐU8duu]}-0tP8tq]\$$CF t. ƋE\$$B]u}]Í~d<$F 1Ҩ u<$;뵉$S널U8duu]}-0tP8tq]\$$gBF t.@ƋE\$$EB]u}]Í~d<$%F 1Ҩ@u<$뵉$R널UWVS,}] t G8ED$$AC t{CC0 C u@u0u d$ED$E$nA,[^_]Ít&CCxs0 u5C 뮍Cd$3CCz\$<$vq4$ \$NC et&<$Qv\$<$u'UWVSS  uKT fS CaShUԍ}EԋUD$CD$ |$$D$9t3)C}C u d$Et$$=L[^_]Ã1kːt&E\$$BQfCd$ S 8kf}uE\$$BfK @)QD&'Ud-0tP8u$Nd-0U$T$TÐUWVSL]ED$$<S  uKT fS ECKh} Mk+ ȋMԉD$ ET$D$L$M|$ $-Ut{ S Qfd$ lE\$$1@KCIUd-0tP8u$Kd-0U$T$ U T$UT$ÐUED$ ED$E D$E$*Ð&UED$ E D$ED$d-0$U UE]] u}tqxqs}99ωUU}}]Ћu}]Í9vu]u}]Ës1yEЋ]u}]Ívs 1]f{t0s;s r2Su9s lUS KUUSMfC{7sCSu+U Et$U |$u$}r|!~EM9wzt:z;z s^Br>rBJt;z sz7BJډȋ$t$|$]ÍJ1efωJ븋r 1NE뭍UE $1É'U8]] uu}{K KϋS7USU҉U܋U+U܉U1;Ev uU)>9vD)9MC 9։Ct:))ыUL$T$C$e]u}]f}tƅu]CEҍv{K 9Y)ω|$D$K $f{K 5CCCe)CKCMU(]] uu}CS 9w7)‰9s)|$CD$E$d{]u}]Ð։1]}u]É'U8E]]D$Eu}$D$(:Et} u u1ۉ؋u]}]Ð$HItUM D‰$U@P@E LE UG$&u(C f fC t]ED$E$2*C @D$D$D$ \$4$C똍Cd$lUMCd$떍ut$$D2BfC d$1<BEt$$2vUE D$ED$d-0$9ÐUS$] EED$ED$$SxEU$[]Ðt&[EtPEE֍&UVS E] uUEEED$ED$$SxE9Mt  [^]DtDE&UVS ] uC@ t)P,t"D$D$D$ \$4$P`{DED$ED$$S x [^]KDt@Dv'US] !DED$ED$$Sx؃[]Í&CtCE؍&U]] u1StC$Sx$W]u]Ct{CEfUHE}U}]1ۉE̋EuUԉ<$EЍED$ED$T3t Mԅ<$B$AUT$$/C U fCfs _Ủ{ WUC$p2aW UC(1a҉WC,`1a1aS`U f fC WC02atBED$E$.؋u]}]Ð]̅t&1֍Cd$뱍vCd$E6C,1sut$$.>fC d$1>Et$$-^&'U(ED$ ED$ED$ED$E D$ED$d-0$ÐUWVS<E ]$fE֍ED$i-S | uKT fS O0Chu։D$ E}܉|$t$$tx1t& 79C @t <7 CCy;C 7 01ɉtC C @fC u d$ED$E$f,<[^_]uC fCC Xf\$7D$EUЉ$aUЃaf}f}Eֺ}܈ECd$S m;C| 8 tBt&\$D$ EUЉ$aU\$D$ I\$D$ USd]-0tP8u$t&tKEUT$$)%E1)uE&Cd$눍vCd$ud$e먃d$XxvU(ED$ED$ E D$ED$d-0$kÐUWVSÐUEP$T$h7ÍUd-0P$T$@7ÐUEP$T$ÍUd-0P$T$`ÐUWVS,}ED$$1 dC 3Cu C& uaC @t[CC u{d@ ED$E$E ,[^_]Ðt& ttZdCCd\$<$X=]v\$$U 뷉\$<$1=\9u Xd@ u d$ED$E$E Hd$dd$A UED$d-0$@ÐU(ED$D$D$ E$¸DEÐUtt&UUdD$E$?Í'Ud$ÐUED$#a$gÐt&U$#aÍU8EU D$ ED$#aT$D$E$EÐUS] Et1[]ÃvE=vYC$t/K1҅t9w[]Ð@ 1땍P1Ʌtu두t&US]t$[]ÍUWVS,uE ]4$EsC4$D$|aS!Ѝ<;u.t(t$C$@uU,[^_]ËMuE,1[^_]Ðt&$ tUpPU뫋U렐UdU T$ U-0T$P$T$[UUET$ U T$P$T$ZÐU(]]u}v&sǷakt&؋u]}]Ð$@a贘f*U'x*L'@,8<<-4$$AD$#a$#at$$@?#at&AX vAXvAXvAtt& BXcvATt&>@>0> >{>k>|Z>\K>\(f;>\`f+>> >==p=`#tt&`ada:a0D$a$=u-շafsD$%a4$<fz6RfNjJ 1\r1NBU롍vrB}6>BEarE><B6}>BR WU?E&&UHɉ]Ӊ}ωuu1]u}]ft$t$}B?=vBBUԉ$NUԅ}EZ]z~dBfBBUԉ\$$UF EfFV F$F(haF, caF`daF0@hafF ~iNT <$E\$$]u}]B@B<$XUnf"fT땍]\$$$ fF d4$1 E\$$Uԉ$m7]\$$@ fF d4$1H E\$$t&US] {~5CDD$C$FtS$1[]ËCʐU8]] uu}CK8C 9S9rnUt$$T$,(C ;CC w2{~ffSS{~'C ]u}]ljCS{ًC ٍv)ЍD$D$$(C qC뚐t&I9BЉT$<$U4UtC8C S&iUEMEU Tt&UEMEU 4t&UE D$ED$d-0$Í&UE D$ED$d-0$ÐUUET$ U T$P$T$jÐ&UdU T$ U-0T$P$T$2US] Et;u.$D$ȾaD$d $肭[]É$\$D$aD$ d $P[]ÐUWVS,u]t F8}|$$C @t} tICCx^U 0C u d$E|$$8,[^_]ËCCxb CCy;C|gU  돍&Cd$C J4$;C|: 8 tn-t&E 4$\$D$,.\$D$ 4$+&4$\$D$ +t&\$D$ 4$+&UWVS,d}] -0t P8ut$$C @t tGCCx\8C u d$!Et$$,[^_]ËCCx\ CCy;C|a 둍vCd$5C S$&;C|< 8 tb5t&\$|$d-0$u*,d\$D$ -0$O*\$D$ d\$D$ -0$*UVS U u] uC @u$CCx9 [^]fCCx6 CCy;C|9< t_ [^];C|, 8 tL끐t&]U u [^]\)U\$D$ 4$E)UI]E ǐU\$D$ 4$)UUS$U] uC @u(CCx=$[]Í&CCx5 CCy;C|:< t|$[];C|: 8 }wd\$T$-0$T(r\$D$ dU-0$-(U-t&d\$D$ -0$(\$D$ 뫐UEP$T$U T$q Ud-0P$T$UT$9ÐUUE REU Ut&UdD$E$/ÐUE D$D$D$ E$hɃÐUE E 'UEEUdE D$ET$$fÍt&UdE$T$}ÐUS] ED$ D$\$$fc []ÍUED$d-0$ÐUU D$ D$ET$$dÐUU MD$EL$ T$$5ÐUED$ D$D$$ÐUWVS,d]u}-0t P8YED$$C d\$-0$lS CC€|fS E tUdǀu11u ;])  9rYUMBT0$\!\E;]u11u ;]  9r}ES E1ҋH…ɉUsȺQ)ʃU}̾aE;at }c }+ ܾaEԾaM}GU+Uɹ޾aEMD$ ET$L$D$E)؉D$$eEUJȺQ)kd)ыUL$B D$BD$aD$ Q}EuM tE9u U $`N ` }E MAl=UE-UUmMʼnMEƍMċU%}t0`D$a$#EU`D$T$ L$}O ;]MA0}EuM tE9U $`T`}E4 EH*Q)kd)}OM>ME)ىMEUD$aD$ MT$ $o EMA (` U`J ҍ )ʋT ډU MmU)ʉM$* D$,a)‹Ek<)ѺųUL$ +UT$ 2;]C k}O ;]!UBR7;UERUE4 EQE)ƒUUUEQE)‹Ekd)Љ… }EEɉE~}EȸDEE d% kEdЋUE,E-E mEƍUōM%}t0`D$a$2UE`T$D$ L$}OMQaT$ D$}E%M}MMƉ $D$aMkQmc;M_MAEȋE)؉EEBD$E$U`EI9]>jfU D$)aD$ E2UER)؉EdQT$ U $dE9]ExEExN )Ѻ$I)ʉUEƍUōMi18E0UōEƉUMME)ىM5l $E`l$Q`EE)‹Ekd)ЉE`l$X`EQmE)‹EU@EE`l$`EQmE)‹Ekd)Љl $l $Q)ʉU}EP  MًxtpUEU:+UU)‹|UD$:$& +UEB\$=|\AMT$\$L$|\AED$;TU$ E+EE$ġ|AUM$T$L$|MB6+UUURBUu#йd%Du%EU%D1M)4E E)؃7 MJL$1ɉ$‹E%E9]%ًputUx##E)ȋ|!B$| $Dž|EUD$$ Ea $螟Dž|A$脟|$vDž|&UVS MEU D$ED$EEE$Eh]ۉtC$C$ $]tC$C$$ܞ [^]ÐUE D$ED$d-0$ÐUWVS @~ y ZN9u2uރ[^_]1[^_]Ð&UWVSE ]]E܉<-v}<0EE/{ 9r 1U11EE$&TVЃE0/~(9#~ٍ LN$aUUMl$$ $hhL$D$E܉$ lU1ɉEEEteE E!u܉u E uu@<+Eu <- uEFЃ 1 0uE܃E00tFσE0uu܉uEuup/~I9Dt‹Ep9׍DFЉU2/}tpEE+E }N~ENE؉EEEEEE$ M]M EEM܋UtE܋MEt[^_]EUt<0EEكUPt&BzwEt]EEpUVSĀ]uE U?wFfEEEtHDEEED$ ET$fED$4$Uf9w [^]ÍED$ EEEfET$D$4$n뾍UVSĀ] d5EM?wJfEEEtPDEEED$ E$fEL$D$Uf9wt&dž[^]ÍED$ EEEfEL$D$$뺐UEfEEE$@EaEEfEEEED$ E D$ED$d-0$=ÍvUE fEEE$ EaEEfEEEED$ ED$ED$E$<ÐU1WVS] }u [^_]Ív҉u덶F^t!<$D$Ut3}ߋF^u߃1[^_]ËHPɉt2҉t,zu4NjGuGB@G@G$賉;_J׋UWVS,]E sE$ D$$_C|$D$aD$ aD$D$at$$2CD$ D$t$$Bu;XtC,[^_]1,[^_]Ít&'UWaVS$U|$t$rUEs4C81]u}]Ð$4¸tKFS4C8HKEHKD1]u}]UWVSd-0U $T$UT$ÐUS]MU tu[fE1EEEEEfE $D$ ED$ED$H1x EEĄ[]ÅfEUUy1Ą[]Í&U(ED$ED$ E D$ED$d-0$+ÐUHE}}u]D$EEt$<$D$ ED$øt,E\$<$D$ E D$U9Et $IE]u}]É'UED$ E D$ED$d-0$BUWVSŰUu܉EԋE D$D$DىEЉ4$A}}ċU9Ut&=aU܉t$uT$\$t$D$ Eԉ$ׅ~mf}%u11EEEt3ɍ ɉ҉UȋEȍSa9aaӀ EuĄEu;u|hEЋUЉuȋM]Ћ]U9w1?:ǃ9}|-|w|$av9wlj19}}Ӌ]Љ}ЋEЋ} UẺEĬ[^_]Ð9/w lj1:두1uԋ}ԃ172zrf1~9>:^a$ aӋ}uPUЃE .u>tӃ}9}M}Ā }kE8ttu9]M]Ā ]ĉ+}ȉӃ0tIVЃ v EPUʃM܉H9uT51Ӄ E0ExDž aEHuV<> <n Dʉ؃0 وu)Љv9DžM} Dž a 9u55 ttE0U恥&H1Džt&AHЃ v$&Cg Z M܃9/ EPUM܉ЈDžq  9uO55? ڸ |M $ @$_E$ҋ@6.9qE+b*$HЃ Džw,AHЃ v쉝ɹI  ;u55؁ 1'{ ;u5qL 2 9uZ55  Dža8 9u51+HЃ 3 1ɉӉf;  NwЃ v쉽$Dž}E  ;u5MUT$ D$\$ $A,1IE DDž%ى)v$t$D$ D$ 4^щ tYD$ D$ $t$_0t;u<끋+<00)ȉ۸ E-2U܃9hh EXp]U܉E܃9)GEHME܋  U܃; EXp]U܉@ ;ur5ۉU܃9y EHpЃMى U4@#  9ua51@u;u51MU܃9|g EHMU܉M܃9EPUM܉U܃;EXp]U܉"u<@89u%5ffM܃9]EPUM܋@d 9u51Ë 1DžDž<FDžaI9u51 "9u519u] 59u 5]9u 555U܃;51$U܃9513;u5155&55C;u 555O DžDžI$+\;uD59u 5EM D$EL$$rrD$E܉D$E$EU؍MT$L$  M܃9Z EPUM܉OE $DžDžI2+8w L$D$<$DžzD‰=END$E܉D$E$EU؍MT$L$ p E؉ىD$D$E܉D$E$EUT$ =OED$ D$E܉D$E$EM؉L$pM 4Q;UE؉ىD$D$E܉D$E$EUT$ pED$ D$E܉D$E$EM؉L$PpD$E܉D$E$EU؍MT$L$ ~EPpUU܃95^E1X]U܉EPUU܃;5;EPpUC;u51b#9u5U܃;5#@9u 51 ;ux 5#E1X]U܉ẺD$EML$D$ D$$&MEX]U܉@EPU|9u 51EPUM܉HEPpU 򉅸eU܃95EPpUuM A u ȃd$jWEԉD$Eԉ$؄DžED$ E܍M؉D$EL$L$M $3DžDžU fJ @EHM D$E܉D$E$EU؍MT$1L$ nED$ D$E܉D$E$EM؉L$6D$E܉D$E$EU؍MT$L$ U܃95eEX]U܉U܃95ED$ D$E܉D$E$EM؉L$>eU܃;5EPUIEPUEHMU܉EPUE1PUU܃;5KEPUPM܃95E1PUEX]U܉r,EX]U܉U܃;5}D$E܉D$E$EU؍MT$1L$ OU܃95U܃;Y5D$E܉D$E$EU؍MT$L$ M܃9EPUʃM܉ED$ D$E܉D$E$EM؉L$SEPUEPUM܉M܃9EPUM܉EHMU܉lEPUtE؉ىD$D$E܉D$E$EUT$ ^D$E܉D$E$EU؍MT$L$ %EPUEX]U܉EX]U܉EX]U܉jEX]U܉EPUEPUYEX]U܉EPU`E؉ىD$D$E܉D$E$EUT$ E؉ىD$D$E܉D$E$EUT$ aEX]U܉!ED$ D$E܉D$E$EM؉L$'EPUED$ D$E܉D$E$EM؉L$qEPUE؉ىD$D$E܉D$E$EUT$ `E؉ىD$D$E܉D$E$EUT$ JD$E܉D$E$EU؍MT$L$ EPUEPUEPUlED$ D$E܉D$E$EM؉L$ZE؉ىD$D$E܉D$E$EUT$ VHЃ 1ɉk 0 vӃ$ Q;U5xM܃9K렋EPUEPU NDžEPUE fH @ED$ D$E܉D$E$EM؉L$D$E܉D$E$EU؍MT$L$ b>ED$ D$E܉D$E$EM؉L$$CEPUEPU#EHMEDžED$ E܍M؉D$EL$L$M $[ EHM t&UED$ E D$ED$d-0$UWVSE Uu}EDыMu܉}̉M9]ff%u vft f%uf_1EEEE}f=rw aM ɍ<9aaM} c볋Mfu܋}̉MuEĉE9]|dCMU؉u]܋u܋ZÉ9]|0|wۋT$a]܋u܋ZÃ9]}ЋU؋} EEEČ[^_]Ëu܋ZÉ뒋]܋u܋ZrÉqt]܋u܋*Z 9\a$au܋}M܉߃u M؃M؋u >Af7(}(EԋMȋ}̉Lf.fl$Mufgȃ0 X} Ѓ0 w fu}30Efȃ0  } fȃ0 wEuQ~QaA E E~֋M UT$4$L$E80ۃa_]Edm`PB EEEdL)+dE}u t&~HaB E E~ٍED$t$<$ E0dۃZ]aE]~$M U]T$L$$袿N ];LLLTTD0ED$9Xf%Xt&$0ad A8M EL$$+U B ƒ U fzud EȍMȉL$$$hM EDžDžQ DžfQTQfQ Q(4$h蔮\$]|$D$ $Tx |$$aDTT@tE fH @4$$=M UET$L$$趽uR0:d`@/9uj450$M fI @] C tgEȉD$Eȉ$gU B @DTTT[^_]Éȃd$N5E P d$'x1f؃d$9f}fE 8AAd8l@fEE$藉@$Nf}C$84d8A80 X@8AX1ɉ<ÉPDt&;  NwЃ v쉽X@X$PD<8%Dž`8dAh*4BЃ Dž\w3X\&)EPUʃM܉0TXd XH@ `U܃H9%EHpЃM04U܉؁d 1g`XHa 9u&501Ӄd fE0fExDž aDž@xt&fEd\Hdd\uK<Z < 0t&؃0 fudP)`f\E9`DžDM`Dž4Dž(Dž,f>6d XH@ `9ug%5054 d 8ABd XH@Dž a`2 9u5054 t!dt@dfE0fE΁dd XH@Dž aqdd@=d{`$9u*501Dd XH@ `U܃H9%EHpЃM04U܅ fh҃d@A8X`@Hz 9u&50PЃd$/] fK @DD $+@em0*E,aBEE]9]| dbEEJBEES E}Q aA E E~ҋM UT$<$L$I8E0멍0Dž`Pd0.fDž.0P`L)~E}J~QaB E E~֋U ED$<$T$|(E80ۃaZ]E] MEL$\$$%0fa}&EZPB JEEUyCEEmzPUЍTQUEWM OMEU EMD$T$ $;0U EMD$T$ $fE ]U\$D$$0,t&M U]T$L$$跮c0t&U EMD$T$ $臮30\\PD$D$$V+P\`9 EΉ`DžDDž\Dž4Dž(Dž,]ԅ]Ѝ,;,N؅~&PB EEE1IË,)Å E}J aB E E~ҋU ED$<$T$'8E0멋] MEL$\$$E捽0$]ЃpC}fQ(aA E E~ҋU ED$<$T$|(8E0멋 0PڃQf u䋍P)`w d0DE`,f$t$D$ D$ T щ  D$ D$ $t$7!`0fEЃɉEt$9utw zE$f$EzD‰$H0f.0.P`` 9u 501dEPB EE z%M܃H9oEPUM܉0udu8d@`V9u1"501`| U܃H9s E1HM0UduDd@^`9uM"501 ` M܃H9 EPU0M1 zE ]U\$D$$8E0!U܃H9EHpЃM04U] MEL$\$$蕨A8E0du;d@S`9u 50ۉS`> 9u50(U܃H9}EHMPPU܉0`U܃H9EHMݔ0U}E$ME 1@a@Atf <xd\cfE΍hfE0DžD\@MD$E]ЉL$ MuԁdT$U$EL$dD$ dT$\\$t$ 9ЉP@Gt @g Eԃ 9\s MDž@g9qdPDЉ`d,$Dž4Dž(t(9~!)Yq ډ(u؉,(4`$f} `1EDž\I`du9w tkE܉D$ UƉD$T$ $踳tn9 {D$EԉD$$IW&t$M܉L$ \$4$JuuD$D$4$(Jx+8Dž&؋\$L$$T=9rE܍Uԉ\$D$$ 9 )ߋD$$ F؋\$L$$F88\$D$4$OgMԉD$L$4$G \$M܋L$ 4$\$Eu)ED$D$$)H8߉|$4$Om,ډ8\$T$4$VfO:Mu uMu ua8J9Td$UMMMu up8D$ D$D$ $+dv&t&9pBpD$ D$aD$ $[8ƅDžf8Xt$ D$D$$|X 59'TD$8X\$$?dXIx+81Dž&D$ljD$$+uU4$L$P9t-uNjD$L$$u8T$8\$$Rc 8't&$4$D$uŋ8t$88\$4$b8N88T$\$$LbNe8\$D$ $(bd8ny&9 T WGDž9Tf +l؉p88S9T9mEM8X;~싕8MҍD DMtT$\ݝHX1\X݅Ht$88\$4$l_8${U49r B E܍UԉD$É$D$ 9z )68O8H9E Tf 9TEM8x<;~싕8MҍD DMtT9 T h9T{89~TUuTu9NTAuTuEM8X;~싕8MҍD DMtTg$"\Xj9 T 91T[uTuTuu"9TV;9tNuTu%ETE89%TME8X;~싕8MҍD DMtTt8ME8H ;~拕8MҍD DMtTuu uu<98a\$B4$D$zXB<98*\$4$D$AX;EfU]9xft^N&pf8ED$ $\{\E t&x6f_؁[^_]Dž| f}OUx _|)ډUUJPT$U$|EMAD$ |ED$a$D$kQExNExEi )'EUM1al0zUEUMuE@l$@EQmE)‹El@EE@l$@EQmE)‹Ekd)Љl $fE@l$IQ@EE)‹Ekd)Љl $Q)ʉUl $t,[^_]f1Ҹu9wtUt)1҉utE\$$U]9wu>uM E$gU E돋tuylU$׉T$UmM UÉtT$D$${ Q$a% 1&UWVS,}Ut'}u 1ۉ 9]vut$<$Uu1,[^_]Ã,[^_]ÐU8E ED$E$UÐU]ÍUUM ttËB@t&BM UfU뷍&US$E] t#r1$[]ËP\$$R$[]ËPML$$1tЋE$[]fU뗍&UEM tsPM EB$1fPM EB UEM tsPM EB$1fPM EB UEM tsPM EB$1fPM EB US$E] t,r1$[]MUPL$$R$[]ËPML$$1tNjEf$[]Ð&US$E] t,r1$[]MUPL$$R$[]ËPML$$1tNjEf$[]Ð&US$E] t,r1$[]MUPL$$R$$[]ËPML$$R 1tƋEf$[]Í&US$E] t,r1$[]MUPL$$R$$[]ËPML$$R 1tƋEf$[]Í&US$E] t,r1$[]MUPL$$R$$[]ËPML$$R 1tƋEf$[]Í&US$E] t,r1$[]MUPL$$R$$[]ËPML$$R 1tƋE$[]Ð&US$E] t,r1$[]MUPL$$R$$[]ËPML$$R 1tƋE$[]Ð&US$E] t,r1$[]MUPL$$R$$[]ËPML$$R 1tƋE$[]Ð&US$] EED$E$1t E$[]ÍUS$] EED$E$1t E$[]ÍUS$E] t1r1$[]1҃;M‰UPL$$R$[]ËPML$$1t1}$[]Í&'Ut&UE]M u]tWƃt )֋tbsNSD$L$$R t~t%CuE ?a]@ ]u]f]u]Ð1]u]ËSD$L$$RttŋCuE #a]@랋]1u] U8}} ]Eu]uE$t$U1tM6;uw&tts1Eu}]u]E ]1;t)]u}]Ãt&]1u}]ÐUtˋUE܉$覣E벅tGMut$$ХEf$ a 1lt&]UE D$ D$D$E$Í&UWVS,}u EU]t$EU<$t9Cu8&Ct'9uU}EU ,[^_],1[^_]Ë]tEU}EE ,[^_]⍶U8]E ]u}8uT1t?<$EE1D$$AtE;Ewtt7r@ftN]u}]Ãut<$E뢍t&t4ED$|$$볐<$賡E 뚉L$$NjE 8u$%a1 cE됍UE D$D$E$Í&'U8]]uu tWr1҃‹]Ћu]ÐVECUUT$$P$1҅tҋCUT$$P$1҅빍CUT$$P 1҅tCMUL$$P UtEEFnt&'U8]]uu tWr1҃‹]Ћu]ÐVECUUT$$P$1҅tҋCUT$$P$1҅빍CUT$$P 1҅tCMUL$$P UtEMFnt&'U8]]uu tWr1҃‹]Ћu]ÐVECUUT$$P$1҅tҋCUT$$P$1҅빍CUT$$P 1҅tCMUL$$P UtEMFnt&'Ut&U$t&Ut&UUEM tsPM EB$1fPM EB U]]uu t9r]u]fCVT$$P$tCu ]@$ CVT$$P tCu ]@ ]u]U8}} uu]t%D$\$4$U>t!]u}]Ðt-u߉$E蒝E]u}]ËE$D$蹟Ét!ED$$D$pt&$Dao 1dfU1(]] uu;4$EED$41tUu]u]ÍvE\$4$D$ ED$]u]ÐUE@] UEUP]Í'UE]@Ðt&U1]É'U1]É'UE@] US]C CCt$C []ÍU1]] uuu ]u]Ëu9^w3F t$蔛\$$ԝF t^^뽐t&^F F UESTEE EaEaEАaD$EEaEaEPaE0aE aE aE aEEEE$UU҉t$1DET[]ÐU]Ít&'U1U]uJv:r Jȉ  ؁ ȋM r ]u]ÍvU1U]uJv:E Jr ȉ  ؁ ȉr ]u]ÍvUU]B +BfU1U$] t$rJ J9w9w )ٰZ J$t$]ÍvU1USM Z9rB )ˉZ J []ÍU1]É'U1U]uJv:r Jȉ  ؁ ȋM r ]u]ÍvU1U]uJv:E Jr ȉ  ؁ ȉr ]u]ÍvU1S$]SvSE SD$Љ ΉU ȁ ЉEED$C $"C $[]ÍvU1S$]SvSSD$C D$E$EEUE U U ЋU C $[]ÍvU1]]uuS9r#E )St$D$C $js ]u]Ð&U1]]uuS9r#)St$C D$E $s ]u]Ð&U1S$]SvSE SD$Љ ΉU ȁ ЉEED$C $C $[]ÍvU1S$]SvSSD$C D$E$\EEUE U U ЋU C $[]ÍvUEU MSaPP UaDˉHP[]ÐU1]É'U(E Љ ΉU ȁ ЉEE@ D$D$D$ E$ɃUUuËE@ D$T$D$ E $ɃU(E Љ ΉU ȁ ЉEE@ D$D$D$ E$[ɃU(E@ D$D$D$ E$e1tËUЉ  ȁ ЋU ÍUUuËE@ D$T$D$ E $ɃU(E@ D$D$D$ E$赟1tËUЉ  ȁ ЋU ÍUE@ Et&'UE D$D$E@ $ÍUE@ E{t&'UEU@aU @@P ]Ð#a#aU]ҺaDÍUS$E#aD$ #a#aD$E D$#aD$aD$E$>x#a$1[]Í&#a$[]ÐUWVS,}EtBt&w_y*vpC ftfvf{t $U Eyً?uËE,[^_]Ð&U1WVS,}tJw_x9}pC ftfvf{tE\$$U ǃyӉ}?u,[^_]ÐUWVSEEE1ۋU 812;]sJ8uta:uU: uJuU Ɖ2U)‰ЋU[^_]19]uE Uu01[^_]É뺋U 2ڐUS$E#aD$ #a#aD$E D$#aD$aD$E$HQx#a$1[]Í&#a$[]Ít&#a#aU]ҺaDÐUS$E#aD$ #a#aD$E D$#aD$PaD$E$Jx#a1#a$[]É#a$[]Ð#a#aU]ҺPaDÐUS$E #aD$ #a #aD$E D$@#aD$aD$E$Lx #a1#a$[]É #a$[]Ð #a@#aU]ҺaDÐUS$E#aD$ 8#a#aD$ED$#aD$aD$E D$E$Gx #a$1[]É#a$[]Ít&#a#aU]ҺaDÐUE U}]ux]]މ]]]]}]]Xލ<;U]}ffXfx]u}]ÐUWVS<] }uEt&taEttOơaEEMU܉t$\$L$T$D$ E$U}MEE<[^_]fuEUWVS\qa] E3D0u-+E>E}|EEȉŰ}EEtEEŰMEȉT$ UL$D$$苈ŰMT$ UL$EċEȉ$D$X1ɉE1U1҉EU09u}9}(r E9E ;u~EU3E3U t:}ȹE}ENjEeuU܉E؋E؉UUEU3}D7ctW7E)9uOEU}u}utɋMD] \[^_]Ã00E EE cEEEI&=؃wt&3Eut1u";3Xt xEsEEEUUȉMUWVS\qaM EԋUԉȍ&8D:u- +E(E}~EEȉỦD$T$ $D$M$D$É֋EȋỦD$T$ 諅ME11U1EE]؉u܉Ut&09}U9U-r ]9]];}~]؋E3]3EE t<]ȋu]uEe}EډUuE]]Uu9u\>]tW7E)9}IuEUu}urut]ۋ]DM \[^_]Ð00EE EE E;؃녍E"g8E8Xt x]yEEEEEEEE]]ȉủ\$t$ tUWVSLU E1ۅEu] Eԍv=aEUT$UD$ t$D$E$׃};EF~1  9uUf:tq)}E딋U1f:tMu׉uԉ f?teaUT$UD$ $D$EԉD$ӃuĻL[^_]+] 9EL)É[^_]Ë]L[^_]É͐UWVS\u t&$ u-+E:E}3+EEЉUԋ}EEtEEU1MԋET$UL$ $T$xUЋMԉT$UL$ E̋ET$$EEEEȉUqr M9Mu~;]~EU3E3U t:MEEMEeЉ]ʉUڋ]EMMU]$tr09]U9Ukύv00E EE EEE&$ t$\ 7)9]ptS]ąu*EUMt]Du u 3\[^_]Ít&EU؃͐EMĸt1M"fXt fx^EEEUWVS\}]EOM }$@;<$u-+E8u}t0Sf0EE EE 1҉]؉ˉu܉EEqr E9Euz;}~EU3E3U t:MEEMEeЉ}ʉUEEUUEU;<$tR09}~pU9UoӍ&EEEEU\[^_];<$8 t<$ 7)9}ى]ȅt ]U]EtҋUADE EU\[^_]ËE$D$MĉD$T$ EЉU|$D$É֋EЋUԉD$T$ }MĉEQu;E}EEE"?EEEEfXt fxyEEEEUWVSŰUu܉EԋE D$D$DىEЉ4$}}ċU9Ut&=aU܉t$uT$\$t$D$ Eԉ$ׅ~mf}%u11EEEt3ɍ ɉ҉UȋEȍSa9aaӀ EuĄEu;u|hEЋUЉuȋM]Ћ]U9w1?:ǃ9}|-|w|$av9wlj19}}Ӌ]Љ}ЋEЋ} UẺEĬ[^_]Ð9/w lj1:두1uԋ}ԃ172zrf1~9>:^a$aӋ}uPUЃE .u>tӃ}9}M}Ā }kE8ttu9]M]Ā ]ĉ+}ȉӃ0tIVЃ vD1@];u5PDž@E$a$H1Dž8AHЃ v$8$%8,D*%HЃ Dž<w,8<AHЃ v쉝<8<ɹI<:^a$aӋ}uPUЃE .u>tӃ}9}M}Ā }kE8ttu9]M]Ā ]ĉ+}ȉӃ0tIVЃ v!EuQ~Q@aAEE~֋M UT$4$L$yE( σ@a_]EkE  JZ]E )O-E}u ~HPaAEE~ٍUT$t$<$葷)E Y]PaE]~+] MEL$\$$?&];Lr E~$ 2kt&MD$D$ $eL$a EM D$EL$$聶u/ M fI @t&t$h1E @ @DČ[^_] E}t&J% @aBEE~ҋM UT$<$L$̨d(E 멍v Dž uƅ0 Q)n"E}J~Q@aBEE~֋U ED$<$T$E( σ@aZ]E] MEL$\$$訧@ t&NEB EEJzY]E!mz JMEOUWUE] MEL$\$$赦M fM U]T$L$$臦mE ]U\$D$$a M U]T$L$$5 U EMD$T$ $  U EMD$T$ $ݥ(p]ԅ+;O~#ZE]E1IË)ÅE}J@aBEE~ҋM UT$<$L$ (E 멋] MEL$\$$ڤrE獽 y ڃ u勍) lw  Dž؉ .t&$t$D$ D$ щ D$ D$ $t$0 t9u<tw zL$D$<$踏DžzD‰-0 ' }J@aBEE~ҋE ML$<$D$Ԣl(E 9uY5(1L  U܃;5(]D$D$$M|11ۉ NjEfD$EUT$ L$$Y9e9u  E1DžDžDžDžDžzBJEEEBM U]T$L$$V U EMD$T$ $(E E ]U\$D$$輠T(E O  9u5(1   9u5(1σ@aZ]E6+ <00)щ ED$D$$Sz ҋ M܃9 EPUM܉(‰D$E]\$ \$$ 1I1EDžDžDžDžDžEJ@aZ]EE ]U\$D$$襞8ۋ E-EJ@aZ]E/U; EY]EC ))9؉N؅~E9Y]E]1IÉ)Å!Eu} Qo@aAEE~ҍUT$|$4$O(E 묋U EMD$T$ $ NjFKAEEE)9N؅~ E9Y]EcۺHډ)څ҉`ZEQ~T@aAEE~֋E MUL$D$$E( @aY]EM U]T$L$$谛H E܃9t(;)U܃9RjEHpЃM(,U.M܃9:EPUM܉(  9u݄5(}U܃9EHMU܉( uH@ 9u5(fc M܃9EPU(M܋@x k9u{5(1rEЋ D$UML$\$ $D$9 1IEDžDžDžDžRE MUL$D$$ nWEE ]U\$D$$Ȗ` =EJaBEEuu sAEEE3ۅ}u @aAEE~ՍED$t$<$ E벋E ]U\$D$$Y(E JU܃94E1HM(UFDžDžI1 DžDžDžDžaM܃9ZoEPU(M99u5(;9u5()  9u5(1 9u5(@  9u5(  9u5(19u5(5(rU܃9.EHMݔ(U9u+5(5,50,5(5,5(5, KEHM(E܋ PDžM܃9EPUM܉(v EI $@ ] CU B@9ua5(;`D$ (D$E܉D$E$EM؉L$`D$ (1D$E܉D$E$EM؉L$E؉ىD$(D$E܉D$E$E`T$ 1s#M U]T$L$$]ԍ E] MEL$\$$ѐi]ԍ ,U EMD$T$ $袐:Uԍ mvE-DžaaGNE牍DžDž DžDžDžDžڄt80U Uȉ ] MEL$\$$j  Gt gDžDž 1-E-DžۉI F f Eԅ Wu JT 5@aY]E1 Y]E,WE@aY]E$w IE&aDžaGNEO1AM1ۃaà DɈE" E+ iugfff)) A0шٍC09KUsU 9rE)‰  DžDžDžM UET$L$$t DžDž+ E$D$ $a`aٽdaDиҋEEԄۋEԸaEδ fɃ٭۝٭ ۅ Jt{ɉuha؉ ;z u/x109u+o`D$ (D$E܉D$E$EM؉L$p E ]U\$D$$蠊8 >EDž(D$E܉D$E$EU؍`T$L$ p3`D$ (D$E܉D$E$EM؉L$H_E؉ىD$(D$E܉D$E$E`T$ pE909‰Ew`D$ (D$E܉D$E$EM؉L$p(D$E܉D$E$EU؍`T$L$ rU܃9n EHMU܉(gE0Uă0 U܃9, EHMU܉( ]MEЉL$D$ D$D$$X GUxEPpU -9u 5(~EPUEPUEPUpEX]U܉(z R9u 5(EPU?EPUpU܃;5(U܃9EHMU܉( U܃9 Q;U(EJU fJ @  UY:Au0EȍPU@:t<9B `D$ E܍M؉D$EL$(L$M $!M UET$L$$P +Uqma(D$E܉D$E$EU؍`T$L$ >HXE1PUMKDžf EPUC(D$E܉D$E$EU؍`T$L$ EPUUDžDžEHM QEE1PU(D$E܉D$E$EU؍`T$L$ xE؉ىD$(D$E܉D$E$E`T$ E牵 $= E-(D$E܉D$E$EU؍`T$L$ /zU܃;Q5(U܃9jdEHMU܉(HU܃;5(FEPUEP UHX M܃9EPUʃM܉(EPUsjEX]U܉(`D$ (D$E܉D$E$EM؉L$輿U܃95EHMU܉(wEPUM U]T$L$$ EU܃9EHMU܉(lEPU(D$E܉D$E$EU؍`T$L$ 趾EPUGE؉ىD$(D$E܉D$E$E`T$ c `D$ (D$E܉D$E$EM؉L$'z)؉E9B^EPUEPUEEX]U܉(X(D$E܉D$E$EU؍`T$L$ `#EPU!M܃9EPUM܉(EPUEX]U܉({E؉ىD$(D$E܉D$E$E`T$ 蛼uDž  (D$E܉D$E$EU؍`T$L$ ,(D$E܉D$E$EU؍`T$L$ THЃ 1ɉk 0 vӃ$s Q;Uc(M܃9(렋EPU}`D$ (D$E܉D$E$EM؉L$萺.EPUEPU%QEE؉ىD$(D$E܉D$E$E`T$ "E؉ىD$(D$E܉D$E$E`T$ A p)oE؉ىD$(D$E܉D$E$E`T$ 藹 Dž pEPUSEPUEPUEPUDž`D$ E܍M؉D$EL$(L$M $ʸ nE؉ىD$(D$E܉D$E$E`T$ nEDž M fI @E fH @AEHM(EEHM ULWVS] C ucT fC E1D$D$$SU:Dž(Dž Dž0Dž Dž=aFFM܋0L$T$Ut$D$ ED$$ׅljUf 0thf%Wt01ҋC)Ή,, 8C 9׉C̉2fqa$D0tS} DtċS S߉\$<$uqaȐt&Mܿ $fED$D$RUfL[^_]Í&E\$$C @D럋 DžDž$,Dž00{Eu\$D$4${%= # ׃ :D$$È ك ,9(KD  N;€uuց ցtu+ʀDž@cƅ'N ցv $\$D$E$/;wu\$4$D$ ;wU\$$D$;wnDž=lvDžmm$:$Džπ HՀMtC9$v#$$\$u4$D$(9$ $+$a`Dž$$CC\ 벋 a auiuDžb9ǀw"u\$4$蘿"E$y$n ,9(- L$ϋ, qaDkSNjM\$ $ľ묃E$1ɋoS9Sc΋}\$<$A<맋u\$4$ E\$$,9(]EM(x<;,~싕(,u(ҍD4D|ȉu( L$ϋtHkt.SҋE\$$" 뫉)ʉ$ - qa1DS9SыE\$$菼 qa밀ƅS1;}8׋M\$ $80)S;|+S3 /}D$D$<$B$U$u/,9(uT 1։,*,$f (9 $,Lɉ,$)΍7 Uԉ$D$D$bA$1҃$u/,9(T 1։,F$uf$,1u $C~rc49:=:kUԉET$|$ L$t$$}`teU\$$蕹w,l$O؃ ,9(<D 8gu:D$L$4$A1$:ED$t$L$ $ ?,9((MEx<;,~싕(,}ҍDu4,u(|9Lt>( *:UD$D$|$ $rD (9 },LMMp(m}(L(},9((MEx<;,~}}<(MEx<;,~싕(,M(ҍD DTt M( (9 },T(u(T(u(MEx<9,}싅,+(u,(4 uTMMMH (9 }*,Tn$z(}(T(}#EM(x<;,~싅(,(uЍTD4T|( u (9 },Tuu(#u(T(uMM}UU VSD$ D$$0T$ 9}ًuMT9u~4]1;D$ED$ 0T$ $X79UӃ,[^_]ÍV 뵍&'U1UuuuuxH@ E]Ív'UMt1uuO]1fuuuuut]ø ]]UED$$U P@Ð&UWVSLu U~Z9} ߉É։;;FEFUD$E$7M̋UEȃE؋EȍL9M؉MsE؉}}ĉ9w}M؍JTF9эtEЉuM܉UU܋ƁtRE1ۋUf 88ً<; 89UwM܉EtUE1‹EЉ0u47މ ˉM<9 79Ew EU9Uv E+t&u̅~,MċEċYuU t&uŰEȋỦPL[^_]ÍUWVS]} ؃tOMqHut<tFtMt$|$ $tHWMQL :uă[^_]ÍEt$t$$띐댋a|$D$ D$E$MD$q $#ƋEpHLUWVS<} uGWDE܋G9E~M܍t&9ET$$xE؃~19uM؍DOWuLMtd )1}ԉύt&M 29Uw}ԃ0]E܋U؋MBGAL8E؃<[^_]Ë] 9wčt&'U t$Mu $|$AV)u"<YT9L>192u9r$t$|$]$t$|$]Ív'UWVS<] u$t$u# 1CUD$$K1҉UE܉x C\E؋F]ԍ^DEE܃t&;1);u)<: U89]w9MvPuԉ]1ېt&4<:42 4;]u̍P@uE؃:tE؋E܋U؉PE܃<[^_]ÉؿED$$@@E܋E܃<[^_]Ív'UE]M@~MEEf~&QE )EEÐEEEÍv'U$E]}uPUP\3߉4$M )ƒ D )?U19]EsSH]} uUE]Ív9]Es [] tL] )с? 1;}Euv_Uu} Ӊ]]E]ËM?u]u}ME]Ít&'UWVS(Ӊދ]ވ-}xt-]tu[^_]ËMԃ[^_]Ã[^_]X9|)]t$9ˈKCfO-념UE EUWVSLE܋M1UЋR;QB]ЉE̍BUЉMȃTUUЋLU܃D1EEUȉEE]]}}؉2؁Eԉ%E))%މ Ɖ]؉29MsE̋U܋]Lu69Es%8uMȋU t&0u 9rŰE̋M܉AUЋM܉T$ $E1EċEȋ )0)Ή  9]sŋE̋U܃|u29Es!0uMȋUu 9rŰ]̋M܉YEăL[^_]ÍvUWVS]E } ]C@t#KDHPD$$C@uą%=tAED„u}؋U$a]t }$aĬ[^_]ËUE'a%M$tՀxHPDыM$Ĭ[^_]Ðu_ED$T$EݝhD$ $LE݅h؋E}Ǎ2 @)捏} 13uȉ}m]mDž|E%aU} aMֵ afME amUmvERL؃}Ew$M@aEmE)EE}}}E}} }%mE} } }EMMσM} CDʍp9Iv}ESD!t&aD]EDž|% ?EEdfm&1EEEEECD1҉T$$6҉ljC@MEUE@aEt1t auUtPvJE~Cu aMЋEMEɉEa]m@MЋMEa]m@%aEEEɋU؉UU E]}EE@aEEw}Eִ fEm]m֋UЉUЍB0Eʈ}tx aD„u] aEӄ 9m]m֋UЉUЍJ0EʈL u]MM'!& MUuEE~~E9uO)E))EM~mE] ~SET$h$D$M$L$ED$M$L$xxhEE)) D$$MɉE~EU$D$T$sE}EUUEEE~EU$D$T$EM~ME$L$D$EUM^}TUED$ D$$D$ U$ED$ 1wEEE$D$Ut#U9UE$D$fE$D$qE]$UۉM$1Ĭ[^_]ÍE)EE؉E2؉EEEu )(Ƀ5@aa&}(1EEEEv}E9EU)‹Eu5hEED$$(hEEu aEEETMEщMOMMMUdEWa48a}Eִ fEmUm֋EЉEЃ0EɈ-aa$-a9mUm֋UЉUЃ0EɈv؋M։M VF99u֋UU10^Et?tu)W$>t|$t$$<;[^_]ÐUщWVSӃEuV9TUUrMME )MM\MJ9Mv M 1E܋U܋pEȍL9wM܉;qUDB)};w|.!UU܋D$¸ )95Eܺ!TMEu;qUܿMT$ $YuL[^_]ÍEEYEE捴&U)1|$$]tKOMuMuUDt!}f~GD$ $E܉d}EU܉؋M)ljD$T$ $)}̉E܃E|ڿ`#a MMu܋}ȉEFb0SE+E9~}܃\$<$3UB됍vUw뀋Mf"9.u܉ٸ#D׃" AD$E$M܉‹AUčD$ȃ D$B $E܋MD$ $UċBUUWVS<=#aRE MuHE1ɍX1Uȋ]@]E`#a# ;}~ՃZ;]sU3)ȍ )ȉE؉؉ŰU؉}Љω]ԉUăMċ 9EX0w]ԋ}ЋU;]h0ɉ}]W&to ;]9]EM܋9s9sU܅u'E9EU9t<[^_]à Ɖ3f;]1׸ )ȍ4)]uԍM ։ډp;Er]9]]ȅtkuܹ +M#v):u cvE<[^_]Ë]܋UWVSE Uu}EDыMu܉}̉M9]ff%u vft f%uf_1EEEE}f=rw aM ɍ<9aaM} c볋Mfu܋}̉MuEĉE9]|dCMU؉u]܋u܋ZÉ9]|0|wۋT$@a]܋u܋ZÃ9]}ЋU؋} EEEČ[^_]Ëu܋ZÉ뒋]܋u܋ZrÉqt]܋u܋*Z 9\a$\au܋}M܉߃u M؃M؋u >Af7(}(EԋMȋ}̉Lf.fl$Mufgȃ0 X} Ѓ0 w fu}30Efȃ0  } fȃ0 wkE捽(]Ѓ> ~f}Q~Q aA E E~֋U ED$<$T$E0(ۃ aY]E7] MEL$\$$x ڃQf u䋍t)w E*$t$D$ D$ iщ !D$ D$ $t$j0fEЃɉEt9utw {EfEzD‰I0f!EB EE zyE ]U\$D$$0E(] MEL$\$$0E(U܃9EHMU܉EQۃ aY]EE ]U\$D$$EJۃ aZ]E EHMU܉pU܃9EHMU܉M܃9?xEPUʃM܉ EPUEPUU܃9kEHMU܉KMEPUpQ] MExL$\$$x]Ѝ(+]cEP UHXU܃9tEHMU܉EPUp7fE-nEPUIhD$ E܉D$E$EM؍L$ىT$AQEIE؉D$E܉D$E$EhT$ 1L$E؉D$E܉D$E$EhT$ L$E؉D$E܉D$E$EhT$ L$-EPU E1PUEPUEPUhD$ E܉D$E$EM؍L$ىT$vEPUeU܃9EHMU܉}M܃9JEPUM܉))U܃9rlEHMU܉RU܃9EHMU܉d$VEЍML$ M\$D$ T$UL$t$D$ET$$E{T @DžAEPU0E؉D$E܉D$E$EhT$ L$EPU] fK @E؉D$E܉D$E$EhT$ L$袾gQEhD$ E܉D$E$EM؍L$ىT$[>EPU-DžʉhD$ E܉D$E$EM؍L$ىT$!E؉D$E܉D$E$EhT$ L$赽uDžEPUbEPUE؉D$E܉D$E$EhT$ L$$}EPU‰0 fA1ɉk 0 vӃ$ ^Q;U{fAU܃9뚋EPUE؉D$E܉D$E$EhT$ L$螻hD$ E܉D$E$EM؍L$ىT$biE؉D$E܉D$E$EhT$ L$&EPUED$D$ $ډ1DžEPUvhD$ E܉D$E$EM؍L$ىT$茺EPUUBEUfDžAhD$ E܍M؉D$EL$L$M $ȹfVUBE@E fH @YU fJ @LU䉕dMDž 2US$J~J$[]ÉT$U$m'Uu݋Jȍv'US$t"Y4fa ߅tHY89Y}XPA$[]ÉL$UM$(UMtκ$[]ÐYtI9sX9t.YAt&Dž뜋DžDžDžfzY$a݉DžaDžDž@%$t"tuӉf8hVRDžaDž Džpf8^ Džf8]PDftf]u vft f]u@DžDž aDžDžDžDž aDž Džy@DžVDžAk \Љ DžDžDž Dž aDžDžDž aDžDžyU9T f8l[~؉EuEUU1.&uf9tu˅p:Dž|=&vDž&&|1ɍƅˀDžDžxDžDž:PՃNɉ‰t [؀E؋ tmÃk)Lt2Emf%=xx= D$L$<$0 9EMX;~싅]ЍTD]TD$xaɉʅfɉt|t|zÀiuuځ *uIƅ!ځ ttɉuƅځtttu+xˀDžMj8Sƅ=mmBˀPՃMvft (QXx+d\$aځ҃9Džf*F Àts뷋a뛃u DžىځDh aE{MU >$ttxfufEE#]+JڋtD$ÉD$ $stunftPt;uڋtD$ÉD$ $tuډ+EwuEUUMD$D$ $轞Džt&)k$9w t^UM؉T$ L$D$<$!ta91uE؉t$D$$3dut$ <$D$D$uʋuEUUMD$D$ $莝+1t$L$$Ґ9rEU؉t$D$$9r~)򉕸gt93t$T$ $M/PK6M؉t$L$$I5Ut$T$ <$L$uыuM] ]ED$D$$諛Btk"$t>tu"uƉ+12tD$‰D$ $ztuT4tJ9t9utD$‰D$ $&tu33fL$ D$D$<$ %9 EMX;~싅MЍTD M\Tl[V؃9E D@@`D$ D$<$D$+x`\9BD$ D$aD$ $-^9 DX9T$tݝh1#t݅h y{uÉ苝9UTU$59r T]\$D$E؉$e9)9zT ƅDž`tT29zT뙁Dž 9 Tf8Di9 D?[+؉e+Dž9*Ttt 95 Tfn MDMF9MEX9}싅MЍTD M\T v]T]MEX9}싅+UUTn]]09}yT8!9}rT Z9|]T]MEX9}싅]ЍTD]TT@]]09}CT 9*T2MTM‹[MMhU؉D$T$ $轐O9TMTMEMX;~싅]ЍTD]TT23MTMMMEMMEMX;~싅]ЍTD]TTUT$D$ $hTEMX;~싅]ЍTD]TDg#MDM;MM+d9%ىV $Wtt];dw;dw;dw]]T]`9TEMX;~싅]ЍTD]TTMEX9}싅MЍTD M\T9~-T4]]MEX;~싅]ЍTD]TT낋9TX asD$\$<$L$ 蜦9~VLQ!MTM]MK 9~؋э\ M M\LL9TD$T$<$D$ MEX9}싅]ЍTD]TT}#MTMMMMM9}LMM] L]]9MEX;~3MTMR] ]MM2UE @#a$tË@#atMÐUE@#aD$ED$E $7tË@#atMÐUE@#aD$ED$E $藟tË@#atMÐUE@#aD$ED$E $׹tË@#atMÐUSEU@#aD$ ET$D$E $ߵ!уt[]Ë @#at] []ÐU8uu ]]}t'C4fc t%C89C}}H PC]u}]ËKtQ9s Hx9t8KCUei&US] C4t/SD9t$ 'C@C4CtC<1[]fCCfK &UWVS,EE]Et^U s9vft$)$UD$CE3C\$$GUtE1)uEE,[^_]EE,[^_]Í|$$D$E){;,[^_]Í&'UWVS] C ucT fC E1D$D$$]UMDžlDžTDžXtDžhDž\4$v=auxDxDMt$T$U $D$ tT$D$ׅljUftthf%Xtt1ҋC)Ήp$p 8C 9׉C̉$2f5qa‰dDtS$}d# DtS S߉\$<$#uqaȍuܿfED$D$4$貃Uf\[^_]ËED\$$D\C @D\\릋h$DžPDždpDž`ttFX aXo`E`d`d qa1$DS9`SbыE\$$&G qa밋E\$$u\$4$0P@l9pphLdϋ$tHk`t.SҋED\$$ZD뫉$)ʉVd\h$E\$$p$>d\$zPl9p'phLdpp$ qaDu8k`tKϋE\$$Au븉$$+pd\7$hPFl9pdphD`u\$D$L$ D$4$$\h?hl9hd pLduXED$t$L$ $T `)Pl9py lME$x<9p}싕l$p}ҍD pMl|>L9lLh`&p1`d:d,XEUD$D$|$ $gPKl9p}phTMlME$x<9p}mhl9h`}pLLMMlC}lLl}UUuu}}EMl$x<9p}싕lp$ulҍD4DT|hul6Mu upl}lTl}lME$x<9p}싕l$p}ҍDhthptp\$Tl$P<[^_]L$xXaD$$\$\$ t$~Ɖ$ x at$$`\$t$ÐUWVSHDž!DžHCsXSDžfECfEC E CECECUSDEC E C$E$C(E(C,E,C0E0C4E4C8E8C@UDE@CHEHCLELCPEPEXD$(D$,]HDž@DžH vHtDžHtDžCsXSfECfEC E CECECUSDEC E C$E$C(E(C,E,C0E0C4E4C8E8C@UDE@CHEHCLELCPEPEXD$(D$,tUDžHt<DžHt#Dž|$(DD$,赤J=D$D$D$T$ |$t$$u DžHOɉHt蔣tbhthpt|px|x\$Tl$P<[^_]X$ aÐpD$$\$\$ t$nƉ$ at$$`\$t$Ð1Ð11ÐUWVSƉ$ at$$`\$t$ÐUWVSHDž!DžHCsXSDžfECfEC E CECECUSDEC E C$E$C(E(C,E,C0E0C4E4C8E8C@UDE@CHEHCLELCPEPEXD$(D$,]HDž@DžH vHtDžHtDžCsXSfECfEC E CECECUSDEC E C$E$C(E(C,E,C0E0C4E4C8E8C@UDE@CHEHCLELCPEPEXD$(D$,tUDžHt<DžHt#Dž|$(DD$,赐J=D$D$D$T$ |$t$$u DžHOHt蔏t\$Tl$P<[^_]頹$aS\$ ( a$*؃[/ D$( a UVSE ]胍Ɖ$ldžl a@@@ @Ɔhdždžt$$`[^]ÐUWVS"aa,aaaD"aa,aaaO"a!aa0"a8"aU"a!aaaa["aa,aaaa"a!aa0"a8"ag"a!aa0"a8"am"aa,a0"a8"as"a!aaaay"aaaaa"a!aaaa"aBa,aaa"aBa,aaa"aBa,aaa"aBa,aaa"aBa,aaa"aBa,aaa"aBa,aaa"aBa,aaa"aBa,aaa"aBa,aaa"aBa,aaa"aBa,aaa"aBa,aaa"aBa,aaa"aBa,aaa"aBa,aaa"aBa,aaa"aBa,aaa"aBa,aaa"aBa,aaa#aBa,aaa#a#a"#aaa6#a<#aT#aaah#a<#aT#aaas#az#a#aaa#aaaaa#a#a#aaa#a#a#aaa#a#a$a$a$a*$a#aaaa0$a6$aP$aaab$a6$aP$aaam$aa,aaas$az$a,aaa$aa,aaa$aa,aaa$aa,aaa$aa,aaa$a$a,aaa$a!a,aaa$a!a,aaa$a$a,aaa%a$a,aaa %aa,aaa%aa,aaa%aa,aaa)%aa,aaa0%aa,aaa?%aBa,aaaE%aBa,aaaP%aV%ad%aaar%aa,aaax%a~%a%a%a%a%a%a%aaa%aa,aaa%a%a&a&a&a$&a*&a,aaa>&aF&a,aZ&ab&ah&an&a&aaa&a&a,aaa&a&a&a&a&a&aa&aaa&a'a'a2'a8'a@'aF'a\'an'at'a'a!a,aaa'a$a,aaa'aBa,aaa'aBa,aaa'a'a'aaa'a%a%aaa'a'a'a(a(a"(a((aD(aaa\(ab(av(aaa(a(aaaa(a(a(a(a)a)aa,aaa)a )a.)aa<)aD)aL)ab)aaa|)a)a)a)a)a)aa,aaa)a)a,a)a)a)a)a,aaa*a*av(a"*a,*a4*a!a,aaa:*a!aaaa@*a!a,aaaF*a!a,aaaL*aBa,aaaS*aZ*ah*av*a*a*aaaaa*a#aaaa*aa,aaa*a)a&aaa*ava*aaa*a*a*a*a+a+a+a0+aF+aL+aR+aX+aj+a~+a+a+a+a+aaa+a+a+aaa+a!a+a,a ,a,a+a+aaa,a",a4,aF,aV,ah,av,a,a,a,a,a#aaaa,a!a,aaa,a!a,aaa,aa,aaa,a!a,aaa,a!a,aaa,a!a,aaa,a!a,aaa,a!a,aaa/a#aaaa5a#aaaa,a!aaaa,a< a,aaa-a-a,aaa&-aa,aaa,-aa,aaa2-aa,aaa8-a>-aR-aaaf-aa,aaal-ar-a-a-a-a-a!a,aaa-aa,aaa-a-a-aaa-a-a,aaa.a-a,aaa.a-a,aaa.a .a,aaa4.a:.aaaaN.a:.aaaaT.a!aZ.aaaj.ax a,aaap.a$a,aaav.a\anaaa|.aa,aaa.a#a.aaa.a!a,aaa.a.a.a.a.a.aa,aaa.a.a,a/a /a/a/aaaa./aa,aaa4/aa,aaa:/aa,aaa@/aa,aaaF/aL/a`/aaat/aL/a`/aaaAaz/a/aaa/a/aaaaGaz/a/aaa/a/aaaaMaz/a/aaa/a/aaaaSaz/a/aaa/a/aaaa/a!a,aaa/a!aaaa/a!a,aaa/a!a,aaa/a!a,aaa0a0a0aaa00a0a0aaa60a<0aN0ad0al0ax0a~0a0a0a0a0a0aaF+a0a0a0a0a1a 1a1aa,aaa1aa,aaa$1aa,aaa+1a21aB1aV1a`1ah1aa,a0"a8"an1a< aaaat1a< aL az1af a1a< aL az1af a1a!aaaa1a:.aa1a1a1a1aJa1a1a1a!a"a1a1a1a1a2aB2aJ2aP2ar-a-a-a-aV2ar-a-a-a-a\2al2a2a2a2a2a< aL aaa2a2a*a2a2a2a2a,a2a3a 3a2a,a2a3a3a!a,a3a"3a*3a03aD3aaaX3a< aL aaa^3ad3av3a3a3a3a3a3a3a3a3a!aaaa3a4a4aaa"4a4a4aaa(4a!aa0"a8"a.4a4a4aaa44a!a:4aaas#aL4a4a4a4aaaaaa5a'a`7a7a7a7a7a7an:a:aa:aS*a=a=a=a=a>a >a^>at>a>aa,a>a?a(?ap?ap?aaaaa?a2-a>aAaBap?ap?aaaaaaDa^>aDaEaa1a EaJEa\EaEaaaaaaEa ,a,a,a-a9㼥ͤtgQ>PNaPqk,jj6HT7qYIσ7 qR>)OqN9NL(K@K箂CAk[Sžuauauauauauauauauauauaua ua ua ua ua ua ua ua ua ua vava vavavavavava#va'va+va/va2va6va:va>vaAvaEvaHvaLvaOvaSvaVva \va!mva"|va#va$va%va&va'va(va)va*va+va,va-va-wa. wa.wa/wa/%wa0*wa1.wa22wa38wa4=wa5Bwa6Fwa7Lwa8Rwa9Wwa:]wa;gwa<vwa=wa>wa?wa@wa[wa\wa\wa]wa^wa^xa_xa_$xa`1xa{[a_ez~|T9 CGPXnpbU: DHQYoqc&$0^4{'%1_5|  l\  !m]8V(;`"f}W)<a#gJ~K. *EL6rhj/ +FM7sik     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO!QRSTUVWXYZ[\^_ !"#$%&'()*+,-./0123456789:@ABCDEFGHIJKLMNOPQR >  0^1_"*(6;`f}jJ#+)7<ag~ kK. ELhr/ FMis8      !"#$%&'()*+,-./0123456789:?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[14G  V W. y"6*;`CELrAZj{}/ z#7+<aDFMsB[k|~     x !@AVW`atjvukw `a}~RSxA  `ayz{ B} ~ RSx|CPZpDQ[q #%%%%$%a%b%V%U%c%Q%W%]%\%[%%%4%,%%%<%^%_%Z%T%i%f%`%P%l%g%h%d%e%Y%X%R%S%k%j%% %%%%%%")"a"e"d" #!#H""" %QR@!"#$%&'()*+,-./012345%%%%$%a%b%V%U%c%Q%W%]%\%[%%%4%,%%%<%^%_%Z%T%i%f%`%P%l%g%h%d%e%Y%X%R%S%k%j%% %%%%%%6789:ABCDEFGHIJa"KLMNOPH""" %%%%%$%a%b%V%U%c%Q%W%]%\%[%%%4%,%%%<%^%_%Z%T%i%f%`%P%l%g%h%d%e%Y%X%R%S%k%j%% %%%%%%e"d"H""" %#BVW+yM"Z[*{|z A%%%%$% c%Q%W%]%.`%%4%,%%%<%rjZ%T%i%f%`%P%l%} /ask~% %%%%%%LCD67;<FE   "%%%%%$%c%Q%W%]%%%4%,%%%<%Z%T%i%f%`%P%l%1% %%%% %oBPQy9:=>Z[deA }~z _%%%%$%^c%Q%W%]%{|%%4%,%%%<%Z%T%i%f%`%P%l%G% %%%bn%CDH`aTUpcqXY%RSQTUVWXY Z [ \ ^_N.J*01F&45D$3%%%%$%E%8c%Q%W%]%9%%4%,%%%<%:Z%T%i%f%`%P%l%;<=>?% %%%O%/@ A!B"C#62L,!K+7H(M-I)G'%10^_%%%%$%c%Q%W%]%%%4%,%%%<%Z%T%i%f%`%P%l%% %%%%%%%%%$%c%Q%W%]%%%4%,%%%<%Z%T%i%f%`%P%l% % %%%% % #%%%%$%a%b%V%U%c%Q%W%]%\%[%%%4%,%%%<%^%_%Z%T%i%f%`%P%l%g%h%d%e%Y%X%R%S%k%j%% %%%%%%")"a"e"d" #!#H""" % !"#$%&'()*+,-./0123456789:;<=>?%%%%$%a%b%V%U%c%Q%W%]%\%[%%%4%,%%%<%^%_%Z%T%i%f%`%P%l%g%h%d%e%Y%X%R%S%k%j%% %%%%%%@ABCDEFGHIJKLMNOQTW^""!% &     "         !"#$%&'()*+,-./0123456789:?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[ !"#$%&'()*+,-./0123456789:;<=>?%%%%$%a%b%V%U%c%Q%W%]%\%[%%%4%,%%%<%^%_%Z%T%i%f%`%P%l%g%h%d%e%Y%X%R%S%k%j%% %%%%%%@ABCDEFGHIJKLMNOQTVW"!%   & ! 0 `9 Zd}y    "   "!a: [e~zA^{B_=>|T9 CGPXnpbU: DHQYoqc S & ! 0 9   R    "   "!Y: Z\[_^VQ!TXUW !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO   & ! 0 `9 R}    "   "!a: S~x   & ! 0 9     "   "!:     & ! 0 `9 R    "   "!a: Sx0^1_   & ! 0 9     "   "!:   ~  & ! 0 y9 R    "   "!: S  !"#$%&'()*+,-./0123456789:@ABCDEFGHIJKLMNOPQR     & ! 0 9     "   "!: VW. y"6*;`CELrAZj{}/ z#7+<aDFMsB[k|~   & ! 0 9 R    "   "!: Sx # %% %%%%%$%,%4%<%%%%%%%%% #%""H"d"e"!#P%Q%R%QS%T%U%V%W%X%Y%Z%[%\%]%^%_%`%a%b%c%d%e%f%g%h%i%j%k%l%N01F45D3E89:;<=>?O@ABC62LK7HMIGJ.&$%/ !"#,+(-)'*%% %%%%%$%,%4%<%%%%%%%%% #%""H"d"e"!#P%Q%R%QTT%VWW%X%Y%Z%[%^^%_%`%a%c%f%g%h%i%j%N01F45D3E89:;<=>?O@ABC62LK7HMIGJ.&$%/ !"#,+(-)'*  & ! 0 `9 R    "   "!a: Sx &     "   ^VQ!X !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOfalaJJveJJ?Lɚ R`%u2jRΚ2(M]=];ZlRP(= e uuvHMfXPT\eƑFݍ~QC576l3oߌGAP%kqk<զIx@ p+ŝi@4@ @@ @@@?0 á#-ޟݦ d%I-64OSk%?kXWڥ2122q#2IZ9>SU9zc%C1 *$bGט#?9'*?[ Jg9Eϔ?qyh.L[Mľ?M==|6+ aw̫?UN@a+eX? ףp= ףp= ףp= ף??45apa`aws2_32.dllpa;aadvapi32.dllpa;adnsapi.dllpa;aiphlpapi.dllpa;akernel32.dllpa;ampr.dllpa;anetapi32.dllpa;antdll.dllpa;aole32.dllpa;asecur32.dllpa;ashell32.dllpa;auser32.dllpa;awinmm.dllafalaa aa еaa aaa a aa aa a a aaaTERM=cygwina8"aaa*a`a6a(a=aaBaIa8"aSaa^a8"aha`ala8"aaaaaaaaa1aCaWalaaaaaaaaa%a5aDaUasaaaaaaaaaa=a[avaaaaaaaa,a;aUahayaaaaaaaaa$a2aKaiaaaaaaaaa'a:aHajaaaaa a,a\aaaaaaa a(aAa\aaaaaa!a8aYapaaaaaaaaa0aLalaaaaaa!a5aKaYaiaaaaaa/aCaVa b da waaa5aCa:aXaaaaNama aWax aXR5aAaTa eaiad za a aaZqapa4aPaaaaLai)a6aPaMcaua[paPaaa'a&a=ahaRa a'a5aEa[a6la {{aWaaa]aa a !a a a~a+az5a@CaSa4\aha aCa aaa2aXa PaXaaY aYqaY2a @aOacanlaa xa a a a aaaaFaFka8+a!a30a@=aNaOSa$da. |aaaavaaa a a"aaaa a:a5aRapaaaaaa a)aDaba&zaa%aaaa aa3aBaRaD$ae-a-a-a-a -a-a-a-a%-a-a-a-a'-a-a-a.a& .a.a.a.a(%.a).a0.a7.a!>.aC.aJ.aQ.a"X.a].ad.ak.a$r.aw.a~.a.a#.a.a.a.a-.a.a.a.a..a.a.a.ap.a.a.a.aq.a.a.a/ar/a /a/a/as/a$/a*/a0/at6/a;/aA/aG/auM/aS/aY/a_/ave/ak/aq/aw/aw}/a/a/a/ax/a/a/a/ay/a/a/a/az.a/a.a/a{.a/a/a/a6/a????????::-1: GMTwp``pP`@p0`p ` ` p ٢ gpfeyHiGY*I)9 ) ")` ` p`p`p` v!`"U#j$5%J&'*s'p) U)ޥp*7+p,T`-ip.6`/~Kp0`1gg2r`3GI4R`5'+62`7 889:;۞p?b@opA`BOpCda`D/vpEDC`FXpG$%`GtI`IVJ`K8LMNOwPQapRlS@pTLU pV,oWpX`XpYn`Zp[P`\]2`^_``ica~0bIEc^d)'e=fDpgg&phipjݚkplƷ`mpn`oqpp{`qZrf]`s:tF?`uv/[vpx=xRyz4{|Qp}~3pcpw`BpW`"p7` `j`˹L`h}Jk_,T|p`4^p?@p) `"p`p` ȳ`𝨕`|w`\q?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~  @@@@@@@@@@@@@@@@*a* a* a*0 a'h a3'q a 4' aw5' ax6' al7' ay8' az9' ak:' am;' a{<' a|='a_>'a`?'$aj@'4apA'Ba}B'SasC'_arD'na~E'{aqF'ahG'aiH'aI'aJ'anK'aL'atM'aoN'a\O'a[P'auQ'avR'+aZS'8aT'DaU'NaV'XaW'baB&'ma'waaa????????:*:-1:-1:::    ! 0@?0aaaaaaaa a 'a 4a ?aJa[adamaaaaaaaaaaaaa +a!8a"Ia#Za$ga&xa'a(a*a+a,a-a.a/a0a1a2a3a7+a9<aAKaFYaGnaHaJaKaaaaaaaaaa#a2aEaVaeaxaaaaaaaaaaaa aa,a7aEaNaYadapaa a!a2a3a4a5a6a7a8a"a0a=aLaYajayaaaa a aaaa a!a"a#,a$:a%Ea&Ta'_a(ma)a0a3a4aaaaaaaa aa .a @a Ta ea xaaaaaaaaa_afamaua|aaaaaaaaaaaaaaaaaaa aaa'a/a8a?aGaOaXa_aianaaaaaaaaaa aa a5aFaNaXaeayaaaaaaa aa-aCaaaaaCygwinWndClass in function , function: CONOUT$Failed assertion %s at line %d of file %s%s%sassertion "%s" failed: file "%s", line %d%s%s assertion "%s" failed: file "%s", line %d%s%svoid __assert_func(const char*, int, const char*, const char*)unable to load %W, %EWSAStartupres %dwVersion %dwHighVersion %dszDescription %sszSystemStatus %siMaxSockets %diMaxUdpDg %dlpVendorInfo %dlong long int wsock_init()%s: //dev/null/dev/ptmx/dev/pty%d%s:%d setting errno %d: %s/var/log/wtmpset logout time for %sint logout(const char*)int openpty(int*, int*, char*, const termios*, const winsize*)int __set_errno(const char*, int, int)pure virtual method calledcouldn't get memory info, %ECouldn't reserve/commit %d bytes of space for cygwin's heap, %EAllocationBase %p, BaseAddress %p, RegionSize %p, State %p /home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/cygheap.ccclosing cygheap->ctty %pCan't initialize Cygwin installation root dir. GetModuleFileNameW(%p, %p, %u), %E\\\??\?\\??\UNUNC\Can't initialize Cygwin installation root dir. Invalid DLL pathInstallationscygheap_protectcygheap%s:%d setting errno %dcmalloc%s would have returned NULL!inheap (s)creallocccallocvoid* _csbrk(int)void* creturn(cygheap_types, cygheap_entry*, unsigned int, const char*)int __set_errno(const char*, int, int)void cfree(void*)void* crealloc(void*, DWORD, const char*)void init_cygheap::close_ctty()name %s, id %p, this %pactivated name '%s', thread_sync %p for id %pCreateThread failed for %s - %p<%p>, %Ecreated name '%s', thread %p, id %pexiting threadmainunknown (%p)released a thread that was not inusethread '%s', id %p, stack_ptr %perroneous thread activation, name is NULLWFSO failed, %Ethread '%s', id %p, inuse %d, stack_ptr %pm.RegionSize 0? stack_ptr %pVirtualFree of allocation base %p<%p> failed, %Esignal_arrivedsemaphoreWFMOWFSOcalled detach but inuse %d, thread %p?WFMO failed waiting for cygthread '%s', %E%s handle %p is badexiting on fatal error%s returns %d, id %pbool cygthread::detach(void*)bool cygthread::terminate_thread()void cygthread::release(bool)void cygthread::create()static DWORD cygthread::stub(void*)sentry_lockCwait %premoved %p element %d Potential BLODA detected! Thread function called outside of Cygwin DLL: %W signal %d advapi32.dllkernel32.dllmswsock.dllntdll.dllole32.dllshlwapi.dllwbemprox.dllws2_32.dllstatic _cygtls* _cygtls::find_tls(int)void _cygtls::remove(DWORD)xdr-routines: ?*["'(){}'"argv[%d] = '%s'break heredo_exit (%d), exit_state %d%d == pgrp %d, send SIG{HUP,CONT} to stopped children%d == sid %d, send SIGHUP to childrenin forked process %P: *** fatal error %s- %suser heapdll bssdll databssdatarecreate_mmaps_after_fork_failedfork: can't reserve memory for stack %p - %p, %Ecan't commit memory for stack %p(%d), %Efork: couldn't allocate new stack guard page %p, %Ecygwin DLL and APP are out of sync -- DLL version mismatch %d < %dIncompatible cygwin .dll -- incompatible per_process info %d != %dcygwin DLL and APP are out of sync -- API version mismatch %d > %d'\" Too many levels of nesting for %scouldn't open file '%s', %Ecouldn't get file size for '%s', %Emalloc failed, %EReadFile failed, %Eargc %d.exe%s:%d setting errno %dCproccygheapCYGWIN_MISMATCH_OK%s magic number mismatch detected - %p/%p%s mismatch detected - %p/%p. This problem is probably due to using incompatible versions of the cygwin DLL. Search for cygwin1.dll using the Windows Start->Find/Search facility and delete all but the most recent version. The most recent version *should* reside in x:\cygwin\bin, where 'x' is the drive on which you have installed the cygwin distribution. Rebooting is also suggested if you are unable to find another cygwin DLL.cygheap baseproc sizefhandler sizeunknown exec type %dcan't find windows system directoryCYGWIN_TESTINGlock_processfinished dll_crt0_0 initializationvoid multiple_cygwin_problem(const char*, unsigned int, unsigned int)void do_exit(int)void dll_crt0_1(void*)void build_argv(char*, char**&, int&, int)bool insert_file(char*, char*&)int globify(char*, char**&, int&, int&)int __set_errno(const char*, int, int)void dll_crt0_0()child_info* get_cygwin_startup_info()void break_here()/dev:pipe:fifo:ptym9:ptym8:ptym7:ptym6:ptym5:ptym4:ptym3:ptym2:ptym1:ptym0:ptym63:ptym62:ptym61:ptym60:ptym59:ptym58:ptym57:ptym56:ptym55:ptym54:ptym53:ptym52:ptym51:ptym50:ptym49:ptym48:ptym47:ptym46:ptym45:ptym44:ptym43:ptym42:ptym41:ptym40:ptym39:ptym38:ptym37:ptym36:ptym35:ptym34:ptym33:ptym32:ptym31:ptym30:ptym29:ptym28:ptym27:ptym26:ptym25:ptym24:ptym23:ptym22:ptym21:ptym20:ptym19:ptym18:ptym17:ptym16:ptym15:ptym14:ptym13:ptym12:ptym11:ptym10/dev/sdz/dev/tty/dev/sdy/dev/sdx/dev/sdw/dev/sdv/dev/sdu/dev/sdt/dev/sds/dev/sdr/dev/sdq/dev/sdp/dev/dsp/dev/sdo/dev/sdn/dev/sdm/dev/mem/dev/sdl/dev/sdk/dev/sdj/dev/sdi/dev/sdh/dev/sdg/dev/sdf/dev/sde/dev/sdd/dev/sdc/dev/sdb/dev/sda/dev/st9/dev/sr9/dev/fd9/dev/st8/dev/sr8/dev/fd8/dev/st7/dev/sr7/dev/fd7/dev/st6/dev/sr6/dev/fd6/dev/st5/dev/sr5/dev/fd5/dev/st4/dev/sr4/dev/fd4/dev/st3/dev/sr3/dev/fd3/dev/st2/dev/sr2/dev/fd2/dev/st1/dev/sr1/dev/fd1/dev/st0/dev/sr0/dev/fd0/dev/sdz9/dev/sdz8/dev/sdz7/dev/sdz6/dev/sdz5/dev/sdz4/dev/sdz3/dev/sdz2/dev/sdz1/dev/sdy9/dev/pty9/dev/sdy8/dev/pty8/dev/sdy7/dev/pty7/dev/sdy6/dev/pty6/dev/sdy5/dev/pty5/dev/sdy4/dev/pty4/dev/sdy3/dev/pty3/dev/sdy2/dev/pty2/dev/sdy1/dev/pty1/dev/pty0/dev/sdx9/dev/sdx8/dev/sdx7/dev/sdx6/dev/sdx5/dev/sdx4/dev/sdx3/dev/sdx2/dev/sdx1/dev/sdw9/dev/sdw8/dev/sdw7/dev/sdw6/dev/sdw5/dev/sdw4/dev/sdw3/dev/sdw2/dev/sdw1/dev/sdv9/dev/sdv8/dev/sdv7/dev/sdv6/dev/sdv5/dev/sdv4/dev/sdv3/dev/sdv2/dev/sdv1/dev/sdu9/dev/sdu8/dev/sdu7/dev/sdu6/dev/sdu5/dev/sdu4/dev/sdu3/dev/sdu2/dev/sdu1/dev/sdt9/dev/nst9/dev/sdt8/dev/nst8/dev/sdt7/dev/nst7/dev/sdt6/dev/nst6/dev/sdt5/dev/nst5/dev/sdt4/dev/nst4/dev/sdt3/dev/nst3/dev/sdt2/dev/nst2/dev/sdt1/dev/nst1/dev/nst0/dev/kmsg/dev/sds9/dev/sds8/dev/sds7/dev/sds6/dev/sds5/dev/sds4/dev/sds3/dev/sds2/dev/sds1/dev/port/dev/zero/dev/sdr9/dev/sdr8/dev/sdr7/dev/sdr6/dev/sdr5/dev/sdr4/dev/sdr3/dev/sdr2/dev/sdr1/dev/sdq9/dev/sdq8/dev/sdq7/dev/sdq6/dev/sdq5/dev/sdq4/dev/sdq3/dev/sdq2/dev/sdq1/dev/sdp9/dev/sdp8/dev/sdp7/dev/sdp6/dev/sdp5/dev/sdp4/dev/sdp3/dev/sdp2/dev/sdp1/dev/sdo9/dev/sdo8/dev/sdo7/dev/sdo6/dev/sdo5/dev/sdo4/dev/sdo3/dev/sdo2/dev/sdo1/dev/sdn9/dev/sdn8/dev/sdn7/dev/sdn6/dev/sdn5/dev/sdn4/dev/sdn3/dev/sdn2/dev/sdn1/dev/sdm9/dev/sdm8/dev/sdm7/dev/sdm6/dev/sdm5/dev/sdm4/dev/sdm3/dev/sdm2/dev/sdm1/dev/ptmx/dev/com9/dev/com8/dev/com7/dev/com6/dev/com5/dev/com4/dev/com3/dev/com2/dev/com1/dev/null/dev/full/dev/sdl9/dev/sdl8/dev/sdl7/dev/sdl6/dev/sdl5/dev/sdl4/dev/sdl3/dev/sdl2/dev/sdl1/dev/sdk9/dev/sdk8/dev/sdk7/dev/sdk6/dev/sdk5/dev/sdk4/dev/sdk3/dev/sdk2/dev/sdk1/dev/sdj9/dev/sdj8/dev/sdj7/dev/sdj6/dev/sdj5/dev/sdj4/dev/sdj3/dev/sdj2/dev/sdj1/dev/sdi9/dev/sdi8/dev/sdi7/dev/sdi6/dev/sdi5/dev/sdi4/dev/sdi3/dev/sdi2/dev/sdi1/dev/sdh9/dev/sdh8/dev/sdh7/dev/sdh6/dev/sdh5/dev/sdh4/dev/sdh3/dev/sdh2/dev/sdh1/dev/sdg9/dev/sdg8/dev/sdg7/dev/sdg6/dev/sdg5/dev/sdg4/dev/sdg3/dev/sdg2/dev/sdg1/dev/sdf9/dev/sdf8/dev/sdf7/dev/sdf6/dev/sdf5/dev/sdf4/dev/sdf3/dev/sdf2/dev/sdf1/dev/kmem/dev/sde9/dev/sde8/dev/sde7/dev/sde6/dev/sde5/dev/sde4/dev/sde3/dev/sde2/dev/sde1/dev/sddx/dev/sddw/dev/sddv/dev/sddu/dev/sddt/dev/sdds/dev/sddr/dev/sddq/dev/sddp/dev/sddo/dev/sddn/dev/sddm/dev/sddl/dev/sddk/dev/sddj/dev/sddi/dev/sddh/dev/sddg/dev/sddf/dev/sdde/dev/sddd/dev/sddc/dev/sddb/dev/sdda/dev/sdd9/dev/scd9/dev/sdd8/dev/scd8/dev/sdd7/dev/scd7/dev/sdd6/dev/scd6/dev/sdd5/dev/scd5/dev/sdd4/dev/scd4/dev/sdd3/dev/scd3/dev/sdd2/dev/scd2/dev/sdd1/dev/scd1/dev/scd0/dev/sdcz/dev/sdcy/dev/sdcx/dev/sdcw/dev/sdcv/dev/sdcu/dev/sdct/dev/sdcs/dev/sdcr/dev/sdcq/dev/sdcp/dev/sdco/dev/sdcn/dev/sdcm/dev/sdcl/dev/sdck/dev/sdcj/dev/sdci/dev/sdch/dev/sdcg/dev/sdcf/dev/sdce/dev/sdcd/dev/sdcc/dev/sdcb/dev/sdca/dev/sdc9/dev/sdc8/dev/sdc7/dev/sdc6/dev/sdc5/dev/sdc4/dev/sdc3/dev/sdc2/dev/sdc1/dev/sdbz/dev/sdby/dev/sdbx/dev/sdbw/dev/sdbv/dev/sdbu/dev/sdbt/dev/sdbs/dev/sdbr/dev/sdbq/dev/sdbp/dev/sdbo/dev/sdbn/dev/sdbm/dev/sdbl/dev/sdbk/dev/sdbj/dev/sdbi/dev/sdbh/dev/sdbg/dev/sdbf/dev/sdbe/dev/sdbd/dev/sdbc/dev/sdbb/dev/sdba/dev/sdb9/dev/sdb8/dev/sdb7/dev/sdb6/dev/sdb5/dev/sdb4/dev/sdb3/dev/sdb2/dev/sdb1/dev/sdaz/dev/sday/dev/sdax/dev/sdaw/dev/sdav/dev/sdau/dev/sdat/dev/sdas/dev/sdar/dev/sdaq/dev/sdap/dev/sdao/dev/sdan/dev/sdam/dev/sdal/dev/sdak/dev/sdaj/dev/sdai/dev/sdah/dev/sdag/dev/sdaf/dev/sdae/dev/sdad/dev/sdac/dev/sdab/dev/sdaa/dev/sda9/dev/sda8/dev/sda7/dev/sda6/dev/sda5/dev/sda4/dev/sda3/dev/sda2/dev/sda1/dev/st99/dev/st98/dev/st97/dev/st96/dev/st95/dev/st94/dev/st93/dev/st92/dev/st91/dev/st90/dev/st89/dev/st88/dev/st87/dev/st86/dev/st85/dev/st84/dev/st83/dev/st82/dev/st81/dev/st80/dev/st79/dev/st78/dev/st77/dev/st76/dev/st75/dev/st74/dev/st73/dev/st72/dev/st71/dev/st70/dev/st69/dev/st68/dev/st67/dev/st66/dev/st65/dev/st64/dev/st63/dev/st62/dev/st61/dev/st60/dev/st59/dev/st58/dev/st57/dev/st56/dev/st55/dev/st54/dev/st53/dev/st52/dev/st51/dev/st50/dev/st49/dev/st48/dev/st47/dev/st46/dev/st45/dev/st44/dev/st43/dev/st42/dev/st41/dev/st40/dev/st39/dev/st38/dev/st37/dev/st36/dev/st35/dev/st34/dev/st33/dev/st32/dev/st31/dev/st30/dev/st29/dev/st28/dev/st27/dev/st26/dev/st25/dev/st24/dev/st23/dev/st22/dev/st21/dev/st20/dev/st19/dev/st18/dev/st17/dev/st16/dev/st15/dev/sr15/dev/fd15/dev/st14/dev/sr14/dev/fd14/dev/st13/dev/sr13/dev/fd13/dev/st12/dev/sr12/dev/fd12/dev/st11/dev/sr11/dev/fd11/dev/st10/dev/sr10/dev/fd10/dev/conin/dev/sdcz9/dev/sdbz9/dev/sdaz9/dev/sdcy9/dev/sdby9/dev/sday9/dev/sddx9/dev/sdcx9/dev/sdbx9/dev/sdax9/dev/sddw9/dev/sdcw9/dev/sdbw9/dev/sdaw9/dev/sddv9/dev/sdcv9/dev/sdbv9/dev/sdav9/dev/sddu9/dev/sdcu9/dev/sdbu9/dev/sdau9/dev/sddt9/dev/sdct9/dev/sdbt9/dev/sdat9/dev/cons9/dev/sdds9/dev/sdcs9/dev/sdbs9/dev/sdas9/dev/sddr9/dev/sdcr9/dev/sdbr9/dev/sdar9/dev/sddq9/dev/sdcq9/dev/sdbq9/dev/sdaq9/dev/sddp9/dev/sdcp9/dev/sdbp9/dev/sdap9/dev/sddo9/dev/sdco9/dev/sdbo9/dev/sdao9/dev/sddn9/dev/sdcn9/dev/sdbn9/dev/sdan9/dev/sddm9/dev/sdcm9/dev/sdbm9/dev/sdam9/dev/sddl9/dev/sdcl9/dev/sdbl9/dev/sdal9/dev/sddk9/dev/sdck9/dev/sdbk9/dev/sdak9/dev/sddj9/dev/sdcj9/dev/sdbj9/dev/sdaj9/dev/sddi9/dev/sdci9/dev/sdbi9/dev/sdai9/dev/sddh9/dev/sdch9/dev/sdbh9/dev/sdah9/dev/sddg9/dev/sdcg9/dev/sdbg9/dev/sdag9/dev/sddf9/dev/sdcf9/dev/sdbf9/dev/sdaf9/dev/sdde9/dev/sdce9/dev/sdbe9/dev/sdae9/dev/sddd9/dev/sdcd9/dev/sdbd9/dev/sdad9/dev/sddc9/dev/sdcc9/dev/sdbc9/dev/sdac9/dev/sddb9/dev/sdcb9/dev/sdbb9/dev/sdab9/dev/sdda9/dev/sdca9/dev/sdba9/dev/sdaa9/dev/ttyS9/dev/nst99/dev/nst89/dev/nst79/dev/nst69/dev/pty59/dev/nst59/dev/pty49/dev/nst49/dev/pty39/dev/nst39/dev/pty29/dev/nst29/dev/st119/dev/pty19/dev/nst19/dev/st109/dev/sdcz8/dev/sdbz8/dev/sdaz8/dev/sdcy8/dev/sdby8/dev/sday8/dev/sddx8/dev/sdcx8/dev/sdbx8/dev/sdax8/dev/sddw8/dev/sdcw8/dev/sdbw8/dev/sdaw8/dev/sddv8/dev/sdcv8/dev/sdbv8/dev/sdav8/dev/sddu8/dev/sdcu8/dev/sdbu8/dev/sdau8/dev/sddt8/dev/sdct8/dev/sdbt8/dev/sdat8/dev/cons8/dev/sdds8/dev/sdcs8/dev/sdbs8/dev/sdas8/dev/sddr8/dev/sdcr8/dev/sdbr8/dev/sdar8/dev/sddq8/dev/sdcq8/dev/sdbq8/dev/sdaq8/dev/sddp8/dev/sdcp8/dev/sdbp8/dev/sdap8/dev/sddo8/dev/sdco8/dev/sdbo8/dev/sdao8/dev/sddn8/dev/sdcn8/dev/sdbn8/dev/sdan8/dev/sddm8/dev/sdcm8/dev/sdbm8/dev/sdam8/dev/sddl8/dev/sdcl8/dev/sdbl8/dev/sdal8/dev/sddk8/dev/sdck8/dev/sdbk8/dev/sdak8/dev/sddj8/dev/sdcj8/dev/sdbj8/dev/sdaj8/dev/sddi8/dev/sdci8/dev/sdbi8/dev/sdai8/dev/sddh8/dev/sdch8/dev/sdbh8/dev/sdah8/dev/sddg8/dev/sdcg8/dev/sdbg8/dev/sdag8/dev/sddf8/dev/sdcf8/dev/sdbf8/dev/sdaf8/dev/sdde8/dev/sdce8/dev/sdbe8/dev/sdae8/dev/sddd8/dev/sdcd8/dev/sdbd8/dev/sdad8/dev/sddc8/dev/sdcc8/dev/sdbc8/dev/sdac8/dev/sddb8/dev/sdcb8/dev/sdbb8/dev/sdab8/dev/sdda8/dev/sdca8/dev/sdba8/dev/sdaa8/dev/ttyS8/dev/nst98/dev/nst88/dev/nst78/dev/nst68/dev/pty58/dev/nst58/dev/pty48/dev/nst48/dev/pty38/dev/nst38/dev/pty28/dev/nst28/dev/st118/dev/pty18/dev/nst18/dev/st108/dev/sdcz7/dev/sdbz7/dev/sdaz7/dev/sdcy7/dev/sdby7/dev/sday7/dev/sddx7/dev/sdcx7/dev/sdbx7/dev/sdax7/dev/sddw7/dev/sdcw7/dev/sdbw7/dev/sdaw7/dev/sddv7/dev/sdcv7/dev/sdbv7/dev/sdav7/dev/sddu7/dev/sdcu7/dev/sdbu7/dev/sdau7/dev/sddt7/dev/sdct7/dev/sdbt7/dev/sdat7/dev/cons7/dev/sdds7/dev/sdcs7/dev/sdbs7/dev/sdas7/dev/sddr7/dev/sdcr7/dev/sdbr7/dev/sdar7/dev/sddq7/dev/sdcq7/dev/sdbq7/dev/sdaq7/dev/sddp7/dev/sdcp7/dev/sdbp7/dev/sdap7/dev/sddo7/dev/sdco7/dev/sdbo7/dev/sdao7/dev/sddn7/dev/sdcn7/dev/sdbn7/dev/sdan7/dev/sddm7/dev/sdcm7/dev/sdbm7/dev/sdam7/dev/sddl7/dev/sdcl7/dev/sdbl7/dev/sdal7/dev/sddk7/dev/sdck7/dev/sdbk7/dev/sdak7/dev/sddj7/dev/sdcj7/dev/sdbj7/dev/sdaj7/dev/sddi7/dev/sdci7/dev/sdbi7/dev/sdai7/dev/sddh7/dev/sdch7/dev/sdbh7/dev/sdah7/dev/sddg7/dev/sdcg7/dev/sdbg7/dev/sdag7/dev/sddf7/dev/sdcf7/dev/sdbf7/dev/sdaf7/dev/sdde7/dev/sdce7/dev/sdbe7/dev/sdae7/dev/sddd7/dev/sdcd7/dev/sdbd7/dev/sdad7/dev/sddc7/dev/sdcc7/dev/sdbc7/dev/sdac7/dev/sddb7/dev/sdcb7/dev/sdbb7/dev/sdab7/dev/sdda7/dev/sdca7/dev/sdba7/dev/sdaa7/dev/ttyS7/dev/nst97/dev/nst87/dev/nst77/dev/nst67/dev/pty57/dev/nst57/dev/pty47/dev/nst47/dev/pty37/dev/nst37/dev/st127/dev/pty27/dev/nst27/dev/st117/dev/pty17/dev/nst17/dev/st107/dev/sdcz6/dev/sdbz6/dev/sdaz6/dev/sdcy6/dev/sdby6/dev/sday6/dev/sddx6/dev/sdcx6/dev/sdbx6/dev/sdax6/dev/sddw6/dev/sdcw6/dev/sdbw6/dev/sdaw6/dev/sddv6/dev/sdcv6/dev/sdbv6/dev/sdav6/dev/sddu6/dev/sdcu6/dev/sdbu6/dev/sdau6/dev/sddt6/dev/sdct6/dev/sdbt6/dev/sdat6/dev/cons6/dev/sdds6/dev/sdcs6/dev/sdbs6/dev/sdas6/dev/sddr6/dev/sdcr6/dev/sdbr6/dev/sdar6/dev/sddq6/dev/sdcq6/dev/sdbq6/dev/sdaq6/dev/sddp6/dev/sdcp6/dev/sdbp6/dev/sdap6/dev/sddo6/dev/sdco6/dev/sdbo6/dev/sdao6/dev/sddn6/dev/sdcn6/dev/sdbn6/dev/sdan6/dev/sddm6/dev/sdcm6/dev/sdbm6/dev/sdam6/dev/sddl6/dev/sdcl6/dev/sdbl6/dev/sdal6/dev/sddk6/dev/sdck6/dev/sdbk6/dev/sdak6/dev/sddj6/dev/sdcj6/dev/sdbj6/dev/sdaj6/dev/sddi6/dev/sdci6/dev/sdbi6/dev/sdai6/dev/sddh6/dev/sdch6/dev/sdbh6/dev/sdah6/dev/sddg6/dev/sdcg6/dev/sdbg6/dev/sdag6/dev/sddf6/dev/sdcf6/dev/sdbf6/dev/sdaf6/dev/sdde6/dev/sdce6/dev/sdbe6/dev/sdae6/dev/sddd6/dev/sdcd6/dev/sdbd6/dev/sdad6/dev/sddc6/dev/sdcc6/dev/sdbc6/dev/sdac6/dev/sddb6/dev/sdcb6/dev/sdbb6/dev/sdab6/dev/sdda6/dev/sdca6/dev/sdba6/dev/sdaa6/dev/ttyS6/dev/nst96/dev/nst86/dev/nst76/dev/nst66/dev/pty56/dev/nst56/dev/pty46/dev/nst46/dev/pty36/dev/nst36/dev/st126/dev/pty26/dev/nst26/dev/st116/dev/pty16/dev/nst16/dev/com16/dev/st106/dev/sdz15/dev/ttyS5/dev/pty55/dev/pty45/dev/pty35/dev/pty25/dev/sdy15/dev/pty15/dev/sdx15/dev/sdw15/dev/sdv15/dev/sdu15/dev/nst95/dev/nst85/dev/nst75/dev/nst65/dev/nst55/dev/nst45/dev/nst35/dev/nst25/dev/sdt15/dev/nst15/dev/sds15/dev/sdr15/dev/sdq15/dev/sdp15/dev/sdo15/dev/sdn15/dev/cons5/dev/sdm15/dev/com15/dev/sdl15/dev/sdk15/dev/sdj15/dev/sdi15/dev/sdh15/dev/sdg15/dev/sdf15/dev/sde15/dev/sddx5/dev/sddw5/dev/sddv5/dev/sddu5/dev/sddt5/dev/sdds5/dev/sddr5/dev/sddq5/dev/sddp5/dev/sddo5/dev/sddn5/dev/sddm5/dev/sddl5/dev/sddk5/dev/sddj5/dev/sddi5/dev/sddh5/dev/sddg5/dev/sddf5/dev/sdde5/dev/sddd5/dev/sddc5/dev/sddb5/dev/sdda5/dev/sdd15/dev/scd15/dev/sdcz5/dev/sdcy5/dev/sdcx5/dev/sdcw5/dev/sdcv5/dev/sdcu5/dev/sdct5/dev/sdcs5/dev/sdcr5/dev/sdcq5/dev/sdcp5/dev/sdco5/dev/sdcn5/dev/sdcm5/dev/sdcl5/dev/sdck5/dev/sdcj5/dev/sdci5/dev/sdch5/dev/sdcg5/dev/sdcf5/dev/sdce5/dev/sdcd5/dev/sdcc5/dev/sdcb5/dev/sdca5/dev/sdc15/dev/sdbz5/dev/sdby5/dev/sdbx5/dev/sdbw5/dev/sdbv5/dev/sdbu5/dev/sdbt5/dev/sdbs5/dev/sdbr5/dev/sdbq5/dev/sdbp5/dev/sdbo5/dev/sdbn5/dev/sdbm5/dev/sdbl5/dev/sdbk5/dev/sdbj5/dev/sdbi5/dev/sdbh5/dev/sdbg5/dev/sdbf5/dev/sdbe5/dev/sdbd5/dev/sdbc5/dev/sdbb5/dev/sdba5/dev/sdb15/dev/sdaz5/dev/sday5/dev/sdax5/dev/sdaw5/dev/sdav5/dev/sdau5/dev/sdat5/dev/sdas5/dev/sdar5/dev/sdaq5/dev/sdap5/dev/sdao5/dev/sdan5/dev/sdam5/dev/sdal5/dev/sdak5/dev/sdaj5/dev/sdai5/dev/sdah5/dev/sdag5/dev/sdaf5/dev/sdae5/dev/sdad5/dev/sdac5/dev/sdab5/dev/sdaa5/dev/sda15/dev/st125/dev/st115/dev/st105/dev/sdz14/dev/ttyS4/dev/pty54/dev/pty44/dev/pty34/dev/pty24/dev/sdy14/dev/pty14/dev/sdx14/dev/sdw14/dev/sdv14/dev/sdu14/dev/nst94/dev/nst84/dev/nst74/dev/nst64/dev/nst54/dev/nst44/dev/nst34/dev/nst24/dev/sdt14/dev/nst14/dev/sds14/dev/sdr14/dev/sdq14/dev/sdp14/dev/sdo14/dev/sdn14/dev/cons4/dev/sdm14/dev/com14/dev/sdl14/dev/sdk14/dev/sdj14/dev/sdi14/dev/sdh14/dev/sdg14/dev/sdf14/dev/sde14/dev/sddx4/dev/sddw4/dev/sddv4/dev/sddu4/dev/sddt4/dev/sdds4/dev/sddr4/dev/sddq4/dev/sddp4/dev/sddo4/dev/sddn4/dev/sddm4/dev/sddl4/dev/sddk4/dev/sddj4/dev/sddi4/dev/sddh4/dev/sddg4/dev/sddf4/dev/sdde4/dev/sddd4/dev/sddc4/dev/sddb4/dev/sdda4/dev/sdd14/dev/scd14/dev/sdcz4/dev/sdcy4/dev/sdcx4/dev/sdcw4/dev/sdcv4/dev/sdcu4/dev/sdct4/dev/sdcs4/dev/sdcr4/dev/sdcq4/dev/sdcp4/dev/sdco4/dev/sdcn4/dev/sdcm4/dev/sdcl4/dev/sdck4/dev/sdcj4/dev/sdci4/dev/sdch4/dev/sdcg4/dev/sdcf4/dev/sdce4/dev/sdcd4/dev/sdcc4/dev/sdcb4/dev/sdca4/dev/sdc14/dev/sdbz4/dev/sdby4/dev/sdbx4/dev/sdbw4/dev/sdbv4/dev/sdbu4/dev/sdbt4/dev/sdbs4/dev/sdbr4/dev/sdbq4/dev/sdbp4/dev/sdbo4/dev/sdbn4/dev/sdbm4/dev/sdbl4/dev/sdbk4/dev/sdbj4/dev/sdbi4/dev/sdbh4/dev/sdbg4/dev/sdbf4/dev/sdbe4/dev/sdbd4/dev/sdbc4/dev/sdbb4/dev/sdba4/dev/sdb14/dev/sdaz4/dev/sday4/dev/sdax4/dev/sdaw4/dev/sdav4/dev/sdau4/dev/sdat4/dev/sdas4/dev/sdar4/dev/sdaq4/dev/sdap4/dev/sdao4/dev/sdan4/dev/sdam4/dev/sdal4/dev/sdak4/dev/sdaj4/dev/sdai4/dev/sdah4/dev/sdag4/dev/sdaf4/dev/sdae4/dev/sdad4/dev/sdac4/dev/sdab4/dev/sdaa4/dev/sda14/dev/st124/dev/st114/dev/st104/dev/sdz13/dev/ttyS3/dev/pty63/dev/pty53/dev/pty43/dev/pty33/dev/pty23/dev/sdy13/dev/pty13/dev/sdx13/dev/sdw13/dev/sdv13/dev/sdu13/dev/nst93/dev/nst83/dev/nst73/dev/nst63/dev/nst53/dev/nst43/dev/nst33/dev/nst23/dev/sdt13/dev/nst13/dev/sds13/dev/sdr13/dev/sdq13/dev/sdp13/dev/sdo13/dev/sdn13/dev/cons3/dev/sdm13/dev/com13/dev/sdl13/dev/sdk13/dev/sdj13/dev/sdi13/dev/sdh13/dev/sdg13/dev/sdf13/dev/sde13/dev/sddx3/dev/sddw3/dev/sddv3/dev/sddu3/dev/sddt3/dev/sdds3/dev/sddr3/dev/sddq3/dev/sddp3/dev/sddo3/dev/sddn3/dev/sddm3/dev/sddl3/dev/sddk3/dev/sddj3/dev/sddi3/dev/sddh3/dev/sddg3/dev/sddf3/dev/sdde3/dev/sddd3/dev/sddc3/dev/sddb3/dev/sdda3/dev/sdd13/dev/scd13/dev/sdcz3/dev/sdcy3/dev/sdcx3/dev/sdcw3/dev/sdcv3/dev/sdcu3/dev/sdct3/dev/sdcs3/dev/sdcr3/dev/sdcq3/dev/sdcp3/dev/sdco3/dev/sdcn3/dev/sdcm3/dev/sdcl3/dev/sdck3/dev/sdcj3/dev/sdci3/dev/sdch3/dev/sdcg3/dev/sdcf3/dev/sdce3/dev/sdcd3/dev/sdcc3/dev/sdcb3/dev/sdca3/dev/sdc13/dev/sdbz3/dev/sdby3/dev/sdbx3/dev/sdbw3/dev/sdbv3/dev/sdbu3/dev/sdbt3/dev/sdbs3/dev/sdbr3/dev/sdbq3/dev/sdbp3/dev/sdbo3/dev/sdbn3/dev/sdbm3/dev/sdbl3/dev/sdbk3/dev/sdbj3/dev/sdbi3/dev/sdbh3/dev/sdbg3/dev/sdbf3/dev/sdbe3/dev/sdbd3/dev/sdbc3/dev/sdbb3/dev/sdba3/dev/sdb13/dev/sdaz3/dev/sday3/dev/sdax3/dev/sdaw3/dev/sdav3/dev/sdau3/dev/sdat3/dev/sdas3/dev/sdar3/dev/sdaq3/dev/sdap3/dev/sdao3/dev/sdan3/dev/sdam3/dev/sdal3/dev/sdak3/dev/sdaj3/dev/sdai3/dev/sdah3/dev/sdag3/dev/sdaf3/dev/sdae3/dev/sdad3/dev/sdac3/dev/sdab3/dev/sdaa3/dev/sda13/dev/st123/dev/st113/dev/st103/dev/sdz12/dev/ttyS2/dev/pty62/dev/pty52/dev/pty42/dev/pty32/dev/pty22/dev/sdy12/dev/pty12/dev/sdx12/dev/sdw12/dev/sdv12/dev/sdu12/dev/nst92/dev/nst82/dev/nst72/dev/nst62/dev/nst52/dev/nst42/dev/nst32/dev/nst22/dev/sdt12/dev/nst12/dev/sds12/dev/sdr12/dev/sdq12/dev/sdp12/dev/sdo12/dev/sdn12/dev/cons2/dev/sdm12/dev/com12/dev/sdl12/dev/sdk12/dev/sdj12/dev/sdi12/dev/sdh12/dev/sdg12/dev/sdf12/dev/sde12/dev/sddx2/dev/sddw2/dev/sddv2/dev/sddu2/dev/sddt2/dev/sdds2/dev/sddr2/dev/sddq2/dev/sddp2/dev/sddo2/dev/sddn2/dev/sddm2/dev/sddl2/dev/sddk2/dev/sddj2/dev/sddi2/dev/sddh2/dev/sddg2/dev/sddf2/dev/sdde2/dev/sddd2/dev/sddc2/dev/sddb2/dev/sdda2/dev/sdd12/dev/scd12/dev/sdcz2/dev/sdcy2/dev/sdcx2/dev/sdcw2/dev/sdcv2/dev/sdcu2/dev/sdct2/dev/sdcs2/dev/sdcr2/dev/sdcq2/dev/sdcp2/dev/sdco2/dev/sdcn2/dev/sdcm2/dev/sdcl2/dev/sdck2/dev/sdcj2/dev/sdci2/dev/sdch2/dev/sdcg2/dev/sdcf2/dev/sdce2/dev/sdcd2/dev/sdcc2/dev/sdcb2/dev/sdca2/dev/sdc12/dev/sdbz2/dev/sdby2/dev/sdbx2/dev/sdbw2/dev/sdbv2/dev/sdbu2/dev/sdbt2/dev/sdbs2/dev/sdbr2/dev/sdbq2/dev/sdbp2/dev/sdbo2/dev/sdbn2/dev/sdbm2/dev/sdbl2/dev/sdbk2/dev/sdbj2/dev/sdbi2/dev/sdbh2/dev/sdbg2/dev/sdbf2/dev/sdbe2/dev/sdbd2/dev/sdbc2/dev/sdbb2/dev/sdba2/dev/sdb12/dev/sdaz2/dev/sday2/dev/sdax2/dev/sdaw2/dev/sdav2/dev/sdau2/dev/sdat2/dev/sdas2/dev/sdar2/dev/sdaq2/dev/sdap2/dev/sdao2/dev/sdan2/dev/sdam2/dev/sdal2/dev/sdak2/dev/sdaj2/dev/sdai2/dev/sdah2/dev/sdag2/dev/sdaf2/dev/sdae2/dev/sdad2/dev/sdac2/dev/sdab2/dev/sdaa2/dev/sda12/dev/st122/dev/st112/dev/st102/dev/sdz11/dev/ttyS1/dev/pty61/dev/pty51/dev/pty41/dev/pty31/dev/pty21/dev/sdy11/dev/pty11/dev/sdx11/dev/sdw11/dev/sdv11/dev/sdu11/dev/nst91/dev/nst81/dev/nst71/dev/nst61/dev/nst51/dev/nst41/dev/nst31/dev/nst21/dev/sdt11/dev/nst11/dev/sds11/dev/sdr11/dev/sdq11/dev/sdp11/dev/sdo11/dev/sdn11/dev/cons1/dev/sdm11/dev/com11/dev/sdl11/dev/sdk11/dev/sdj11/dev/sdi11/dev/sdh11/dev/sdg11/dev/sdf11/dev/sde11/dev/sddx1/dev/sddw1/dev/sddv1/dev/sddu1/dev/sddt1/dev/sdds1/dev/sddr1/dev/sddq1/dev/sddp1/dev/sddo1/dev/sddn1/dev/sddm1/dev/sddl1/dev/sddk1/dev/sddj1/dev/sddi1/dev/sddh1/dev/sddg1/dev/sddf1/dev/sdde1/dev/sddd1/dev/sddc1/dev/sddb1/dev/sdda1/dev/sdd11/dev/scd11/dev/sdcz1/dev/sdcy1/dev/sdcx1/dev/sdcw1/dev/sdcv1/dev/sdcu1/dev/sdct1/dev/sdcs1/dev/sdcr1/dev/sdcq1/dev/sdcp1/dev/sdco1/dev/sdcn1/dev/sdcm1/dev/sdcl1/dev/sdck1/dev/sdcj1/dev/sdci1/dev/sdch1/dev/sdcg1/dev/sdcf1/dev/sdce1/dev/sdcd1/dev/sdcc1/dev/sdcb1/dev/sdca1/dev/sdc11/dev/sdbz1/dev/sdby1/dev/sdbx1/dev/sdbw1/dev/sdbv1/dev/sdbu1/dev/sdbt1/dev/sdbs1/dev/sdbr1/dev/sdbq1/dev/sdbp1/dev/sdbo1/dev/sdbn1/dev/sdbm1/dev/sdbl1/dev/sdbk1/dev/sdbj1/dev/sdbi1/dev/sdbh1/dev/sdbg1/dev/sdbf1/dev/sdbe1/dev/sdbd1/dev/sdbc1/dev/sdbb1/dev/sdba1/dev/sdb11/dev/sdaz1/dev/sday1/dev/sdax1/dev/sdaw1/dev/sdav1/dev/sdau1/dev/sdat1/dev/sdas1/dev/sdar1/dev/sdaq1/dev/sdap1/dev/sdao1/dev/sdan1/dev/sdam1/dev/sdal1/dev/sdak1/dev/sdaj1/dev/sdai1/dev/sdah1/dev/sdag1/dev/sdaf1/dev/sdae1/dev/sdad1/dev/sdac1/dev/sdab1/dev/sdaa1/dev/sda11/dev/st121/dev/st111/dev/st101/dev/sdz10/dev/ttyS0/dev/pty60/dev/pty50/dev/pty40/dev/pty30/dev/pty20/dev/sdy10/dev/pty10/dev/sdx10/dev/sdw10/dev/sdv10/dev/sdu10/dev/nst90/dev/nst80/dev/nst70/dev/nst60/dev/nst50/dev/nst40/dev/nst30/dev/nst20/dev/sdt10/dev/nst10/dev/sds10/dev/sdr10/dev/sdq10/dev/sdp10/dev/sdo10/dev/sdn10/dev/cons0/dev/sdm10/dev/com10/dev/sdl10/dev/sdk10/dev/sdj10/dev/sdi10/dev/sdh10/dev/sdg10/dev/sdf10/dev/sde10/dev/sdd10/dev/scd10/dev/sdc10/dev/sdb10/dev/sda10/dev/st120/dev/st110/dev/st100/dev/conout/dev/random/dev/ttyS59/dev/cons59/dev/ttyS49/dev/cons49/dev/ttyS39/dev/cons39/dev/ttyS29/dev/cons29/dev/ttyS19/dev/nst119/dev/cons19/dev/nst109/dev/ttyS58/dev/cons58/dev/ttyS48/dev/cons48/dev/ttyS38/dev/cons38/dev/ttyS28/dev/cons28/dev/ttyS18/dev/nst118/dev/cons18/dev/nst108/dev/ttyS57/dev/cons57/dev/ttyS47/dev/cons47/dev/ttyS37/dev/cons37/dev/ttyS27/dev/nst127/dev/cons27/dev/ttyS17/dev/nst117/dev/cons17/dev/nst107/dev/ttyS56/dev/cons56/dev/ttyS46/dev/cons46/dev/ttyS36/dev/cons36/dev/ttyS26/dev/nst126/dev/cons26/dev/ttyS16/dev/nst116/dev/cons16/dev/nst106/dev/ttyS55/dev/ttyS45/dev/ttyS35/dev/ttyS25/dev/ttyS15/dev/nst125/dev/nst115/dev/nst105/dev/cons55/dev/cons45/dev/cons35/dev/cons25/dev/cons15/dev/sddx15/dev/sddw15/dev/sddv15/dev/sddu15/dev/sddt15/dev/sdds15/dev/sddr15/dev/sddq15/dev/sddp15/dev/sddo15/dev/sddn15/dev/sddm15/dev/sddl15/dev/sddk15/dev/sddj15/dev/sddi15/dev/sddh15/dev/sddg15/dev/sddf15/dev/sdde15/dev/sddd15/dev/sddc15/dev/sddb15/dev/sdda15/dev/sdcz15/dev/sdcy15/dev/sdcx15/dev/sdcw15/dev/sdcv15/dev/sdcu15/dev/sdct15/dev/sdcs15/dev/sdcr15/dev/sdcq15/dev/sdcp15/dev/sdco15/dev/sdcn15/dev/sdcm15/dev/sdcl15/dev/sdck15/dev/sdcj15/dev/sdci15/dev/sdch15/dev/sdcg15/dev/sdcf15/dev/sdce15/dev/sdcd15/dev/sdcc15/dev/sdcb15/dev/sdca15/dev/sdbz15/dev/sdby15/dev/sdbx15/dev/sdbw15/dev/sdbv15/dev/sdbu15/dev/sdbt15/dev/sdbs15/dev/sdbr15/dev/sdbq15/dev/sdbp15/dev/sdbo15/dev/sdbn15/dev/sdbm15/dev/sdbl15/dev/sdbk15/dev/sdbj15/dev/sdbi15/dev/sdbh15/dev/sdbg15/dev/sdbf15/dev/sdbe15/dev/sdbd15/dev/sdbc15/dev/sdbb15/dev/sdba15/dev/sdaz15/dev/sday15/dev/sdax15/dev/sdaw15/dev/sdav15/dev/sdau15/dev/sdat15/dev/sdas15/dev/sdar15/dev/sdaq15/dev/sdap15/dev/sdao15/dev/sdan15/dev/sdam15/dev/sdal15/dev/sdak15/dev/sdaj15/dev/sdai15/dev/sdah15/dev/sdag15/dev/sdaf15/dev/sdae15/dev/sdad15/dev/sdac15/dev/sdab15/dev/sdaa15/dev/ttyS54/dev/ttyS44/dev/ttyS34/dev/ttyS24/dev/ttyS14/dev/nst124/dev/nst114/dev/nst104/dev/cons54/dev/cons44/dev/cons34/dev/cons24/dev/cons14/dev/sddx14/dev/sddw14/dev/sddv14/dev/sddu14/dev/sddt14/dev/sdds14/dev/sddr14/dev/sddq14/dev/sddp14/dev/sddo14/dev/sddn14/dev/sddm14/dev/sddl14/dev/sddk14/dev/sddj14/dev/sddi14/dev/sddh14/dev/sddg14/dev/sddf14/dev/sdde14/dev/sddd14/dev/sddc14/dev/sddb14/dev/sdda14/dev/sdcz14/dev/sdcy14/dev/sdcx14/dev/sdcw14/dev/sdcv14/dev/sdcu14/dev/sdct14/dev/sdcs14/dev/sdcr14/dev/sdcq14/dev/sdcp14/dev/sdco14/dev/sdcn14/dev/sdcm14/dev/sdcl14/dev/sdck14/dev/sdcj14/dev/sdci14/dev/sdch14/dev/sdcg14/dev/sdcf14/dev/sdce14/dev/sdcd14/dev/sdcc14/dev/sdcb14/dev/sdca14/dev/sdbz14/dev/sdby14/dev/sdbx14/dev/sdbw14/dev/sdbv14/dev/sdbu14/dev/sdbt14/dev/sdbs14/dev/sdbr14/dev/sdbq14/dev/sdbp14/dev/sdbo14/dev/sdbn14/dev/sdbm14/dev/sdbl14/dev/sdbk14/dev/sdbj14/dev/sdbi14/dev/sdbh14/dev/sdbg14/dev/sdbf14/dev/sdbe14/dev/sdbd14/dev/sdbc14/dev/sdbb14/dev/sdba14/dev/sdaz14/dev/sday14/dev/sdax14/dev/sdaw14/dev/sdav14/dev/sdau14/dev/sdat14/dev/sdas14/dev/sdar14/dev/sdaq14/dev/sdap14/dev/sdao14/dev/sdan14/dev/sdam14/dev/sdal14/dev/sdak14/dev/sdaj14/dev/sdai14/dev/sdah14/dev/sdag14/dev/sdaf14/dev/sdae14/dev/sdad14/dev/sdac14/dev/sdab14/dev/sdaa14/dev/ttyS63/dev/ttyS53/dev/ttyS43/dev/ttyS33/dev/ttyS23/dev/ttyS13/dev/nst123/dev/nst113/dev/nst103/dev/cons63/dev/cons53/dev/cons43/dev/cons33/dev/cons23/dev/cons13/dev/sddx13/dev/sddw13/dev/sddv13/dev/sddu13/dev/sddt13/dev/sdds13/dev/sddr13/dev/sddq13/dev/sddp13/dev/sddo13/dev/sddn13/dev/sddm13/dev/sddl13/dev/sddk13/dev/sddj13/dev/sddi13/dev/sddh13/dev/sddg13/dev/sddf13/dev/sdde13/dev/sddd13/dev/sddc13/dev/sddb13/dev/sdda13/dev/sdcz13/dev/sdcy13/dev/sdcx13/dev/sdcw13/dev/sdcv13/dev/sdcu13/dev/sdct13/dev/sdcs13/dev/sdcr13/dev/sdcq13/dev/sdcp13/dev/sdco13/dev/sdcn13/dev/sdcm13/dev/sdcl13/dev/sdck13/dev/sdcj13/dev/sdci13/dev/sdch13/dev/sdcg13/dev/sdcf13/dev/sdce13/dev/sdcd13/dev/sdcc13/dev/sdcb13/dev/sdca13/dev/sdbz13/dev/sdby13/dev/sdbx13/dev/sdbw13/dev/sdbv13/dev/sdbu13/dev/sdbt13/dev/sdbs13/dev/sdbr13/dev/sdbq13/dev/sdbp13/dev/sdbo13/dev/sdbn13/dev/sdbm13/dev/sdbl13/dev/sdbk13/dev/sdbj13/dev/sdbi13/dev/sdbh13/dev/sdbg13/dev/sdbf13/dev/sdbe13/dev/sdbd13/dev/sdbc13/dev/sdbb13/dev/sdba13/dev/sdaz13/dev/sday13/dev/sdax13/dev/sdaw13/dev/sdav13/dev/sdau13/dev/sdat13/dev/sdas13/dev/sdar13/dev/sdaq13/dev/sdap13/dev/sdao13/dev/sdan13/dev/sdam13/dev/sdal13/dev/sdak13/dev/sdaj13/dev/sdai13/dev/sdah13/dev/sdag13/dev/sdaf13/dev/sdae13/dev/sdad13/dev/sdac13/dev/sdab13/dev/sdaa13/dev/ttyS62/dev/ttyS52/dev/ttyS42/dev/ttyS32/dev/ttyS22/dev/ttyS12/dev/nst122/dev/nst112/dev/nst102/dev/cons62/dev/cons52/dev/cons42/dev/cons32/dev/cons22/dev/cons12/dev/sddx12/dev/sddw12/dev/sddv12/dev/sddu12/dev/sddt12/dev/sdds12/dev/sddr12/dev/sddq12/dev/sddp12/dev/sddo12/dev/sddn12/dev/sddm12/dev/sddl12/dev/sddk12/dev/sddj12/dev/sddi12/dev/sddh12/dev/sddg12/dev/sddf12/dev/sdde12/dev/sddd12/dev/sddc12/dev/sddb12/dev/sdda12/dev/sdcz12/dev/sdcy12/dev/sdcx12/dev/sdcw12/dev/sdcv12/dev/sdcu12/dev/sdct12/dev/sdcs12/dev/sdcr12/dev/sdcq12/dev/sdcp12/dev/sdco12/dev/sdcn12/dev/sdcm12/dev/sdcl12/dev/sdck12/dev/sdcj12/dev/sdci12/dev/sdch12/dev/sdcg12/dev/sdcf12/dev/sdce12/dev/sdcd12/dev/sdcc12/dev/sdcb12/dev/sdca12/dev/sdbz12/dev/sdby12/dev/sdbx12/dev/sdbw12/dev/sdbv12/dev/sdbu12/dev/sdbt12/dev/sdbs12/dev/sdbr12/dev/sdbq12/dev/sdbp12/dev/sdbo12/dev/sdbn12/dev/sdbm12/dev/sdbl12/dev/sdbk12/dev/sdbj12/dev/sdbi12/dev/sdbh12/dev/sdbg12/dev/sdbf12/dev/sdbe12/dev/sdbd12/dev/sdbc12/dev/sdbb12/dev/sdba12/dev/sdaz12/dev/sday12/dev/sdax12/dev/sdaw12/dev/sdav12/dev/sdau12/dev/sdat12/dev/sdas12/dev/sdar12/dev/sdaq12/dev/sdap12/dev/sdao12/dev/sdan12/dev/sdam12/dev/sdal12/dev/sdak12/dev/sdaj12/dev/sdai12/dev/sdah12/dev/sdag12/dev/sdaf12/dev/sdae12/dev/sdad12/dev/sdac12/dev/sdab12/dev/sdaa12/dev/ttyS61/dev/ttyS51/dev/ttyS41/dev/ttyS31/dev/ttyS21/dev/ttyS11/dev/nst121/dev/nst111/dev/nst101/dev/cons61/dev/cons51/dev/cons41/dev/cons31/dev/cons21/dev/cons11/dev/sddx11/dev/sddw11/dev/sddv11/dev/sddu11/dev/sddt11/dev/sdds11/dev/sddr11/dev/sddq11/dev/sddp11/dev/sddo11/dev/sddn11/dev/sddm11/dev/sddl11/dev/sddk11/dev/sddj11/dev/sddi11/dev/sddh11/dev/sddg11/dev/sddf11/dev/sdde11/dev/sddd11/dev/sddc11/dev/sddb11/dev/sdda11/dev/sdcz11/dev/sdcy11/dev/sdcx11/dev/sdcw11/dev/sdcv11/dev/sdcu11/dev/sdct11/dev/sdcs11/dev/sdcr11/dev/sdcq11/dev/sdcp11/dev/sdco11/dev/sdcn11/dev/sdcm11/dev/sdcl11/dev/sdck11/dev/sdcj11/dev/sdci11/dev/sdch11/dev/sdcg11/dev/sdcf11/dev/sdce11/dev/sdcd11/dev/sdcc11/dev/sdcb11/dev/sdca11/dev/sdbz11/dev/sdby11/dev/sdbx11/dev/sdbw11/dev/sdbv11/dev/sdbu11/dev/sdbt11/dev/sdbs11/dev/sdbr11/dev/sdbq11/dev/sdbp11/dev/sdbo11/dev/sdbn11/dev/sdbm11/dev/sdbl11/dev/sdbk11/dev/sdbj11/dev/sdbi11/dev/sdbh11/dev/sdbg11/dev/sdbf11/dev/sdbe11/dev/sdbd11/dev/sdbc11/dev/sdbb11/dev/sdba11/dev/sdaz11/dev/sday11/dev/sdax11/dev/sdaw11/dev/sdav11/dev/sdau11/dev/sdat11/dev/sdas11/dev/sdar11/dev/sdaq11/dev/sdap11/dev/sdao11/dev/sdan11/dev/sdam11/dev/sdal11/dev/sdak11/dev/sdaj11/dev/sdai11/dev/sdah11/dev/sdag11/dev/sdaf11/dev/sdae11/dev/sdad11/dev/sdac11/dev/sdab11/dev/sdaa11/dev/ttyS60/dev/ttyS50/dev/ttyS40/dev/ttyS30/dev/ttyS20/dev/ttyS10/dev/nst120/dev/nst110/dev/nst100/dev/cons60/dev/cons50/dev/cons40/dev/cons30/dev/cons20/dev/cons10/dev/sddx10/dev/sddw10/dev/sddv10/dev/sddu10/dev/sddt10/dev/sdds10/dev/sddr10/dev/sddq10/dev/sddp10/dev/sddo10/dev/sddn10/dev/sddm10/dev/sddl10/dev/sddk10/dev/sddj10/dev/sddi10/dev/sddh10/dev/sddg10/dev/sddf10/dev/sdde10/dev/sddd10/dev/sddc10/dev/sddb10/dev/sdda10/dev/sdcz10/dev/sdcy10/dev/sdcx10/dev/sdcw10/dev/sdcv10/dev/sdcu10/dev/sdct10/dev/sdcs10/dev/sdcr10/dev/sdcq10/dev/sdcp10/dev/sdco10/dev/sdcn10/dev/sdcm10/dev/sdcl10/dev/sdck10/dev/sdcj10/dev/sdci10/dev/sdch10/dev/sdcg10/dev/sdcf10/dev/sdce10/dev/sdcd10/dev/sdcc10/dev/sdcb10/dev/sdca10/dev/sdbz10/dev/sdby10/dev/sdbx10/dev/sdbw10/dev/sdbv10/dev/sdbu10/dev/sdbt10/dev/sdbs10/dev/sdbr10/dev/sdbq10/dev/sdbp10/dev/sdbo10/dev/sdbn10/dev/sdbm10/dev/sdbl10/dev/sdbk10/dev/sdbj10/dev/sdbi10/dev/sdbh10/dev/sdbg10/dev/sdbf10/dev/sdbe10/dev/sdbd10/dev/sdbc10/dev/sdbb10/dev/sdba10/dev/sdaz10/dev/sday10/dev/sdax10/dev/sdaw10/dev/sdav10/dev/sdau10/dev/sdat10/dev/sdas10/dev/sdar10/dev/sdaq10/dev/sdap10/dev/sdao10/dev/sdan10/dev/sdam10/dev/sdal10/dev/sdak10/dev/sdaj10/dev/sdai10/dev/sdah10/dev/sdag10/dev/sdaf10/dev/sdae10/dev/sdad10/dev/sdac10/dev/sdab10/dev/sdaa10/dev/windows/dev/urandom/dev/console/dev/clipboard |aJ|a|ai~aaaaajSa TaSa?~a~a}a}a}am}aC}a}a|a|a/avaaaKa~aڀaaa\a2aaaaa`aaia?aaaaamaCaaLa"aa΃aazaPa&aa҂aaۅaaa]a3a a߄aaaaaja@aaa†aanaDaaaaaaΏa;aaaaa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TaŌaaqaGaaaɋaauaKa!aaaja@a݉aaa_a5a aaaa*aaa aMaaaa]aaa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Taa9acaaa aaajaسaFaaa awaaSaaa\aʜa8aaaWaŒa-aaٓaaa[a1aaݒaaa$aa^aaa5aҔaoa|aRa(aaԘaaaVa,aaaaafa<aaaaavaLa"aaΛaazaPa2aaޝaaa`a6a aaaa)aƠacaaa:aמataaaga=aaaaakaMa#aaϨaa{aQa'aaߪaaaaa7a aaaaqaGaaaɫaauaKa!aaa˭aawaMa#aaϬaۯaaa]a3a a߮aaaaaZa0aaܲaaa^a@aaa´aanaDaaaҶaa~aTa*aaֵaaada:aaaaaha>aaa̹aaxaNa$aaиaaa^a4a aaaaba8a9aasaaaJaaa!aa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Taaja@aaaaanaDaaaƿaaraHaaaʾaavaLa"aaνaaaaaga=aaaa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TaakaAaaaaaoaEaaaaasaIaaaaawaMa#aaaa{aaaaga=aaaaa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TakaAaaaaaoaEaaaaasaIaaaaawaMa#aaaa{aQaaaga=aaaaaka Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TaAaaaaaoaEaaaaasaIaaaaawaMa#aaaa{aQa'awaMa#aaaa{aQa'aa3a aaaaaa7a aaaaaaqaGaaaaauaaaWa-aaaaa[a1aga=aaaaakaAaaa#aaaa{aQa'aaaaaaaaa7a aaaaeaaqaGaaaaauaKa!adaa>aaaa[a1aaaa9aasaaaaYa/aa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Taa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TaaGa}aaaaUaaaa-acaaaa;aqaaaa)a_aaa8aa}aSa)aa Ta Ta Ta Ta Ta Ta Ta Ta Taa5aa?aayaaaaana Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TaDa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TazaaaaRaaaa*a` a a a a8 an aaaa&a\aaaa4aaaaaaha Ta Ta Ta Ta Ta Ta Ta Ta Ta>a/a;/a.aE.a-a-aU-a+-a-a,a Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta,a Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta+a+aO*a)a(a'a''a]&a%a$a#a5#ak"a!a a aCayaaaa1agaa awaOa%aaa Ta Ta Ta Ta Ta Ta Ta Ta TaaGaFaAFaEa{EaEaDaDaDapDa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TaFDa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta|CaBaAaAaT@a?a>a=a,=ab<a;a:a:a:9ap8a7a6a6a(5a^4a3a2a2a61a0a0a5a5a5aj5a Ta Ta Ta Ta Ta Ta Ta Ta Ta@5a`a Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TaA\aWa5SaNaNavNaLNa"NaMaMaMazMaMaLaLa`La6La LaKaJaIaIaIaoIa HaGaKaUKa+KaKaJaJaJaYJa/JaRa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TaRa~RaTRa*RaRaQaQaQaXQa.QaQaPaPaPa\Pa2PaPaOaOaOa`Oa6Oa OaNaWa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TagWa=WaWaVaVaVakVaAVaVaUaUaUaoUaEUaUaTaTaTasTaITaTaSaSaSawSaMSa\a Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta[a[a[ao[aE[a[aZaZaZasZaIZaZaYaYaYawYaMYa#YaXaXaXa{XaQXa'XaWaWa`a Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Tas`aI`a`a_a_a_aw_aM_a#_a^a^a^a{^aQ^a'^a]a]a]a]aU]a+]a]a\a\a\aY\aYza Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TauaMqala\ha2hahagagaga`ga6ga gafaFfafaeaeaeateacacaUca+cacaaaraaeadadadaida?dadacacadla Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta:lalakakakahka>kakajajajaljaBjajaiaiaiapiaFiaiahahahatha#qa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Tapapapa{paQpa'paoaoaoaoaUoa+oaoanananaYna/nanamamama]ma3ma malaua Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TauaUua+uauatatataYta/tatasasasa]sa3sa sarararaara7ra raqaqaqaeqa/za Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Tazayayaya]ya3ya yaxaxaxaaxa7xa xawawawaewa;wawavavavaiva?vavauaa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TaaaaaaʁaavaLa"aa΀akaaaaa`a6ak}aA}a}a|a|a.{a{a~a~a~aU~a+~a~a}a}a}a&a Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Taa҅aa~aTa*aaքaaaXa.aaڃaaa\a2aaނaaa`a6aa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Taaaga=aaaaakaAaaaÈaaoaEaaaLJaasaIaaaˆaaka Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TaAaaaÎaaoaEaaaǍaasaIaaaˌaawaMa#aaϋaa{aQa'aa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TaǓaasaIaaa˒aawaMa#aaϑaa{aQa'aaӐaaaUa+aa׏aaݭa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TaWaѤaKaaaaba8aaaaa-aʙaavaLa"aa-aaٖaaaaƔaakaAaaa×aaoaEaa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Taaaja@aaažaanaDaaaƝaaraHaaaʜaavaLa"aaa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta}aSa)aaգaaaWa-aa٢aaa[a1aaݡaaa_a5a aaaaca-a Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Taa٨aaa[a1aaݧaaa_a5a aaaaca9aaaaaga=aaaa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Taa_a5a aaaaca9aaaaaga=aaaaakaAaaaéaaoaa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Taaa aaxaNa$aaдaa|aRaaaba8aaaaaŰaaqaGaaaWa-aaٱaaa[a1aaa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TaaVa,aaظaaaZa0aaܷaaa^a4a aaaaba8aaaaia Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta?aaaaamaCaaażaaqaGaaaɻaauaKa!aaͺaayaOa%aa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TaaaqaGaaaaauaKa!aaaayaOa%aaѿaa}aSa)aaվaaua Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta TaKa!aaaayaOa%aaaa}aSa)aaaaaWa-aaaaa[a1aEa Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Ta Taaaada:aaaaaha>aaaNa$aaaa|aaa]a3a ataJaaaaaqaGaaaaaBaa|aaa6aa@aazaaa4aa>aaxaXaa2aala aaYa/aaaaaaaXaaaaa`a6a aaaada:aaaaaha>aaaaalaBada:aaaaaha>aaaaalaBaaaaapaFaaaaataJaaalaBaaaaapaFaaaaataJa aaaaxaNa$aaaaaaaataJa aaaaxaNa$aaaa|aRa(aaaaaVa,aaGaaaaaaapaFaaaaxaNa$aaaa|aRa(aaaaaVa,aaaaaZa0aa(aaaaaVa,aaaaaZa0aaaaa^a4a aaaaba8aaaZa0aaaaa^a4a aaaaba8aaaaafa<aaaaajaaaaba8aaaaafa<aaaaaja@aaaaanaDaaaa5a aaaacaaaa^a4a a a a af a< a aaaaja@aaaaanaDaaaaaraHaa@aa a a an aD a a a a ar aH a a a a av aL a" a a a az aP a& aaraHaaaaavaLa"aaaazaPa&aaaa~aTa*aaaaaaaazaPa&aaaa~aTa*aaaaaXa.aaaaa\a2aaaMa#aaaa{aaaavaLa"aaaa~aTa*aaaaaXa.aaaaa\a2aaaaa`a6aX"a."a"a!a!a!a\!a2!a!a a a a` a6 a aaaada:aaaaaha>a&a&a`&a6&a &a%a%a%ad%a:%a%a$a$a$ah$a>$a$a#a#a#al#aB#a#a"a"a"a+a*a*a*ah*a>*a*a)a)a)al)aB)a)a(a(a(ap(aF(a(a'a'a'at'aJ'a 'a&ae,a;,a,a+a+a+a .a-a-a-ad-a:-a2a1a1a1al1aB1a1a0a0a0ap0aF0a0a/a/a/at/aJ/a /a.a.a.ax.aN.ap6aF6a6a5a5a5at5aJ5a 5a4a4a4ax4aN4a$4a3a3a3a|3aR3a(3a2a2a2a2aV2a:a:ax:aN:a$:a9a9a9a|9aR9a(9a8a8a8a8aV8a,8a8a7a7a7aZ7a07a7a6a6a(?a>a>a>a>aV>a,>a>a=a=a=aZ=a0=a=a<a<a<a^<a4<a <a;a;a;ab;a8;a;a}@aS@a)@a?a?a?a$BaAaAaAa|AaRAa,FaFaEaEaEaZEa0EaEaDaDaDa^Da4Da DaCaCaCabCa8CaCaBaBaBafBaJa^Ja4Ja JaIaIaIabIa8IaIaHaHaHafHara>ra{a qaqa{a ~a~a{a aa{a a a{a  a! a{a ya"ya{a *ta#*ta{a Rsa$Rsa{a ra%ra{a &ra&&ra{a qa'qa{a ra(ra{a a)a{a za*za{a ~a+~a{a ya,ya{a ta-ta{a :sa.:sa{a ra/ra{a ra0ra{a ~qa1~qa{a fa2fa{a a3a{a na4na{a ~a5~a{a vya6vya{a ta7ta{a "sa8"sa{a ra9ra{a qa:qa{a fqa;fqa{a Za<Za{a މa=މa{a ba>ba{a ~a?~a{a aa{a %a%asza Q'aaza`6'aaza`'aaza`'aaza`&aaza`&aaza`&a'aza`&a7aza`y&aGaza`^&a Waza`8:a gaza`:a xaza`9a aza`9a aza`9aaza`9aaza`-a-asza 0a0asza *a aza %a%asza *a aza`*a aza`p*a aza`\*a aza`H*a &aza`4*a 4aza` *a Baza` *a Paza`)a ^aza`)a laza`$pa zaza`ia aza`@ca aza`\a aza`\Va aza`Oa aza`Na aza`Ia aza`Da aza`_?a aza`pa aza`ia aza`*ca .aza`\a =aza`FVa Laza`Oa [aza`Na jaza`Ia yaza`fDa aza`>?a aza`pa aza`ia aza`ca aza`\a aza`;Va aza`Oa aza`Na aza`xIa aza`PDa aza`(?a -aza`oa <aza`ia Kaza`ca Zaza`\a iaza`0Va xaza`Oa aza`Na aza`bIa aza`:Da aza`?a aza`oa aza`{ia aza` ca aza`\a aza`%Va aza`Oa aza`Na ,aza`LIa ;aza`$Da Jaza`>a Yaza`oa haza`pia waza`ba aza`\a aza`Va aza`Oa aza`iNa aza`6Ia aza`Da aza`>a aza`oa aza`eia aza`ba aza`\a +aza`Va :aza`Oa Iaza`^Na Xaza`+Ia gaza`Da vaza`>a aza`oa aza`Zia aza`ba aza`v\a aza`Va aza`Oa aza`SNa aza` Ia aza`Ca aza`>a aza`oa *aza`Oia 9aza`ba Haza`k\a Waza`Ua faza`Oa uaza`HNa aza`Ia aza`Ca aza`>a aza`Na aza`҉a aza`Va aza`~a aza`jya aza`ta aza`sa aza` sa 0aza`nra @aza`qa Paza`Ba `aza`Ɖa paza`Ja aza`~a aza`^ya aza`sa aza`sa aza`ra aza`Vra aza`qa aza`6a aza`a aza`>a aza`~a 0aza`Rya @aza`sa Paza`jsa `aza`ra paza`-aaza *a*asza ,-a,-asza h(ah(ayza ^(a^(ayza J(aJ(ayza 6(a6(ayza "(a"(ayza (a(ayza 'a'ayza 'a'ayza 'a'ayza 'a 'ayza oa oayza ia iayza ba bayza 4\a 4\ayza UaUayza [Oa[Oayza NaNayza IaIayza |Da|Dayza T?aT?ayza toatoayza iaiayza babayza \a\ayza UaUayza EOaEOayza NaNayza IaIayza [Da[Dayza 3?a3?ayza ioaioayza hahayza ba bayza \a!\ayza Ua"Uayza :Oa#:Oayza Na$Nayza mIa%mIayza EDa&EDayza ?a'?ayza ^oa(^oayza ha)hayza zba*zbayza \a+\ayza Ua,Uayza /Oa-/Oayza Na.Nayza WIa/WIayza /Da0/Dayza ?a1?ayza Soa2Soayza ha3hayza oba4obayza [a5[ayza Ua6Uayza $Oa7$Oayza tNa8tNayza AIa9AIayza Da:Dayza >a;>ayza Hoa<Hoayza ha=hayza dba>dbayza [a?[ayza NqaNqasza "2a aza`2a aza`2a aza`1a aza`1a aza`1a aza`1a aza`1a aza`1a aza`x1a aza`pa #aza`ka 3aza`ea Caza`^a Saza`5Xa caza`Qa saza`C&aaza`:&aaza`1&a aza`(&a0aza`&a@aza`&aPaza` &a`1aza`&apNaza`%akaza`%aaza`%aaza`%aaza`%aaza`%aaza`%aaza`%a;aza`%aAYaza`%aAwaza`%a Aaza`%a0Aaza`}%a@Aaza`t%aPAaza`k%a`A aza`b%apA+aza`Y%aAIaza`G%aAgaza`<6aaza`26aaza`(6aaza`6aaza`6aaza` 6aaza`6a3aza`5aPaza`5a maza`qa aza`oa aza`ha aza`"ba aza`[aaza`IUa aza`4a>aza`4a[aza`4axaza`4aaza`4aaza`4aaza`4aaza`4a aza`4a&aza` qaCaza`maaaza`kgaaza``aaza`Zaaza` Taaza`3a!aza`v3a"aza`l3a#1aza`b3a$Naza`X3a%kaza`N3a&aza`D3a'aza`:3a(aza`03a)aza`qa*aza`la+aza`Bfa,8aza`_a-Vaza`^Ya.taza`Ra/aza`2a1aza`1a2aza`1a3aza`1a4aza`1a5$aza`1a6Aaza`1a7^aza`1a8{aza`n1a9aza`pa:aza`ka;aza`ea<aza`^a=aza`*Xa>-aza`Qa?Kaza`t0aAiaza`j0aBaza``0aCaza`V0aDaza`L0aEaza`B0aFaza`80aGaza`.0aH4aza`$0aIQaza`paJnaza`mjaKaza`caLaza`]aMaza`WaNaza`PaOaza`0aQ"aza`0aR?aza`/aS\aza`/aTyaza`/aUaza`/aVaza`/aWaza`/aXaza`/aY aza`paZ'aza`bja[Eaza`ca\caza`~]a]aza` Wa^aza`Pa_aza`/aaaza`/abaza`/acaza`/ad2aza`/aeOaza`/aflaza`z/agaza`p/ahaza`f/aiaza`pajaza`Wjakaza`calaza`s]am:aza`WanXaza`Paovaza`\/aqaza`R/araza`H/asaza`>/ataza`4/auaza`*/av%aza` /awBaza`/ax_aza` /ay|aza`pazaza`Lja{aza`ca|aza`h]a}aza`Va~aza`Pa/aza`/aMaza`.ajaza`.aaza`.aaza`.aaza`.aaza`.aaza`.aaza`.a5aza`paRaza`Ajapaza`caaza`]]aaza`Vaaza`Paaza`.aaza`.a#aza`.a@aza`.a]aza`.azaza`v.aaza`l.aaza`b.aaza`X.aaza`pa aza`6ja)aza`caGaza`R]aeaza`Vaaza`yPaaza`N.aaza`D.aaza`:.aaza`0.aaza`&.a7aza`.aUaza`.asaza`.aaza`-aaza`paaza`+jaaza`ca aza`G]a*aza`VaIaza`nPahaza`-aaza`-aaza`-aaza`-aaza`-aaza`-aaza`-a;aza`-aYaza`-awaza`paaza` jaaza`caaza`<]aaza`Vaaza`cPa0aza`"-aOaza`-amaza`-aaza`-aaza`,aaza`,aaza`,aaza`,a!aza`,a?aza`|pa]aza` ja|aza`caaza`&]aaza`Vaaza`MPaaza`,aaza`,a5aza`,aSaza`,aqaza`,aaza`,aaza`,aaza`,aaza`x,aaza`fpa%aza`iaDaza`cacaza`]aaza`Vaaza`7Paaza`n,aaza`d,aaza`Z,aaza`P,a9aza`F,aWaza`<,auaza`2,aaza`(,aaza`,aaza`[paaza`ia aza`wca+aza`]aJaza`Vaiaza`,Paaza`,aaza` ,aaza`,aaza`+aaza`+aaza`+a=aza`+a[aza`+ayaza`+aaza`Ppaaza`iaaza`lcaaza`\aaza`Va1aza`!PaPaza`+aAoaza`+aAaza`+aAaza`+aAaza`+aAaza`+aAaza`~+aA#aza`t+aAAaza`j+a A_aza`Epa A}aza`ia Aaza`aca Aaza`\a Aaza`}VaAaza`PaAaza``+aA7aza`V+aAUaza`L+aAsaza`B+aAaza`8+aAaza`.+aAaza`$+aAaza`+aA aza`+aA'aza`:paAEaza`iaAdaza`VcaAaza`\aAaza`rVaAaza` PaAaza`*a!Aaza`*a"Aaza`*a#A;aza`*a$AYaza`*a%Awaza`*a&Aaza`*a'Aaza`*a(Aaza`*a)Aaza`/pa*A aza`ia+A,aza`Kca,AKaza`\a-Ajaza`gVa.Aaza`Pa/Aaza`z*a1Aaza`f*a2Aaza`R*a3Aaza`>*a4A!aza`**a5A?aza`*a6A]aza`*a7A{aza`)a8Aaza`)a9Aaza`pa:Aaza`ia;Aaza`5ca<Aaza`\a=A2aza`QVa>AQaza`Oa?Apaza`)aAAaza`)aBAaza`)aCAaza`)aDAaza`)aEAaza`)aFA%aza`)aGACaza`)aHAaaza`)aIAaza`oaJAaza`DiaKAaza`baLAaza``\aMAaza`UaNAaza`OaOA8aza`v)aQAWaza`l)aRAuaza`b)aSAaza`X)aTAaza`N)aUAaza`D)aVAaza`:)aWA aza`0)aXA)aza`&)aYAGaza`oaZAeaza`9ia[Aaza`ba\Aaza`U\a]Aaza`Ua^Aaza`|Oa_Aaza`)aaAaza`)abA=aza`)acA[aza`(adAyaza`(aeAaza`(afAaza`(agAaza`(ahAaza`(aiAaza`oajA-aza`.iakALaza`balAkaza`J\amAaza`UanAaza`qOaoAaza`(aqAaza`(arAaza`(asA#aza`(atAAaza`(auA_aza`(avA}aza`(awAaza`|(axAaza`r(ayAaza`oazAaza`#ia{Aaza`ba|A3aza`?\a}ARaza`Ua~Aqaza`fOaAaza`T(aAaza`@(aAaza`,(aAaza`(aA aza`(aA' aza`'aAE aza`'aAc aza`'aA aza`'aA aza`oaA aza` iaA aza`baA aza`)\aA aza`UaA9 aza`POaAX aza`'aAw aza`'aA aza`'aA aza`'aA aza`'aA aza`x'aA aza`n'aA+ aza`d'aAI aza`Z'aAg aza`2oaA aza`haA aza`NbaA aza`[aA aza`uUaA aza`OaA aza`5aA? aza`5aA] aza`5aA{ aza`5aA aza`5aA aza`5aA aza`5aB aza`5aB aza`5a B/ aza`5a0BM aza`~5a@Bk aza`t5aPB aza`j5a`B aza``5apB aza`V5aB aza`L5aBaza`B5aBaza`85aB=aza`.5aB[aza`$5aByaza`5aBaza`5aBaza`5aCaza`4aCaza`4a Caza`4a0C-aza`naAKaza`haAiaza`baAaza`[aAaza`>UaAaza`2NaAaza`HaAaza`CaAaza`>aA;aza`^aAYaza`aAxaza`faAaza`aAaza`n~aAaza` yaAaza`naAaza`~haA1aza` baAOaza`[aAmaza`3UaAaza`NaAaza`HaAaza`CaAaza`>aAaza`RaA!aza`֎aA@aza`ZaA_aza`ރaA~aza`b~aAaza`xaAaza`naAaza`shaAaza`baAaza`[aA5aza`(UaASaza`MaAqaza`HaAaza`CaAaza`W>aAaza`FaAaza`ʎaAaza`NaA'aza`҃aAFaza`V~aAeaza`xaAaza`naAaza`hhaAaza`aaAaza`[aAaza`UaAaza`MaA9aza`{HaAWaza`SCaAuaza`+>aAaza`:aAaza`aAaza`BaAaza`ƃaAaza`J~aA-aza`xaALaza`naAkaza`]haAaza`aaAaza`y[aAaza`UaAaza`MaAaza`OHaAaza`'CaA=aza`=aA[aza`.aAyaza`aAaza`6aAaza`aAaza`>~aAaza`xaAaza`naA3aza`RhaAQaza`aaAoaza`n[aAaza`UaAaza`VMaAaza`#HaAaza`BaAaza`=aA#aza`"aAAaza`aA`aza`*aAaza`aAaza`2~aAaza`xaAaza`naBaza`GhaBaza`aaB7aza`c[aBUaza`TaBsaza`*MaBaza`GaBaza`BaBaza`=a Baza`a B aza`a B(aza`a BGaza`a Bfaza`&~aBaza`xaBaza`naBaza`B aza`xa?B aza`naAB!aza`haBB9!aza`aaCBW!aza`7[aDBu!aza`TaEB!aza`zLaFB!aza`GGaGB!aza`BaHB!aza`<aIB "aza`aJB)"aza`jaKBH"aza`aLBg"aza`raMB"aza`}aNB"aza`xaOB"aza`naQB"aza`haRB#aza`aaSB#aza`,[aTB=#aza`TaUB[#aza`NLaVBy#aza`GaWB#aza`AaXB#aza`<aYB#aza`ړaZB#aza`^a[B$aza`a\B/$aza`fa]BN$aza`}a^Bm$aza`xa_B$aza`wnaaB$aza`habB$aza`aacB$aza`![adB%aza`TaeB#%aza`"LafBA%aza`FagB_%aza`AahB}%aza`<aiB%aza`ΓajB%aza`RakB%aza`ֈalB%aza`ZamB&aza`}anB5&aza`zxaoBT&aza`lnaqBs&aza`garB&aza`aasB&aza`[atB&aza`TauB&aza`KavB 'aza`FawB''aza`AaxBE'aza`s<ayBc'aza`“azB'aza`Fa{B'aza`ʈa|B'aza`Na}B'aza`}a~B'aza`nxaB(aza`anaB;(aza`gaBY(aza`}aaBw(aza` [aB(aza`TaB(aza`KaB(aza`FaB(aza`oAaB )aza`G<aB+)aza`aBI)aza`:aBh)aza`aB)aza`BaB)aza`}aB)aza`bxaB)aza`VnaB*aza`gaB!*aza`raaB?*aza`[aB]*aza`TaB{*aza`KaB*aza`kFaB*aza`CAaB*aza`<aB*aza`aB+aza`.aB0+aza`aBO+aza`6aBn+aza`}aB+aza`VxaB+aza`KnaB+aza`gaB+aza`gaaB,aza`ZaB%,aza`TaBC,aza`rKaBa,aza`?FaB,aza`AaB,aza`;aB,aza`aB,aza`"aB,aza`aB-aza`*aB6-aza`}aBU-aza`JxaBt-aza`@naB-aza`gaB-aza`\aaB-aza`ZaB-aza`TaB .aza`FKaB).aza`FaBG.aza`@aBe.aza`;aB.aza`aB.aza`aB.aza`aB.aza`aB.aza`}aB/aza`>xaBa*C;aza`a+C8;aza`Fa,CW;aza`ʂa-Cv;aza`N}a.C;aza`wa/C;aza`ma1C;aza`vga2C;aza`aa3C<aza`Za4C-<aza`+Ta5CK<aza`Ia6Ci<aza`Da7C<aza`?a8C<aza`c:a9C<aza`2a:C<aza`a;C=aza`:a<C=aza`a=C>=aza`B}a>C]=aza`wa?C|=aza`4a@C=aza`z4aPC=aza`p4a`C=aza`f4apC=aza`\4aC>aza`R4aC1>aza`H4aCO>aza`>4aCm>aza`44aC>aza`*4aC>aza` 4aC>aza`4aC>aza` 4aD?aza`4aD!?aza`3a D??aza`3a0D]?aza`3a@D{?aza`3aPD?aza`3a`D?aza`3apD?aza`3aD?aza`3aD@aza`3aD/@aza`3aDM@aza`3aDk@aza`3aD@aza`maAC@aza``gaBC@aza``aCC@aza`|ZaDCAaza`TaECAaza`'NaFC=Aaza`HaGC[Aaza`CaHCyAaza`>aICAaza`&aJCAaza`aKCAaza`.aLCAaza`aMCBaza`6}aNC1Baza`waOCPBaza`maQCoBaza`UgaRCBaza``aSCBaza`qZaTCBaza` TaUCBaza`MaVCCaza`HaWC#Caza`CaXCACaza`x>aYC_Caza`aZC}Caza`a[CCaza`"a\CCaza`a]CCaza`*}a^CCaza`wa_CDaza`maaC7Daza`JgabCUDaza``acCsDaza`fZadCDaza`SaeCDaza`MafCDaza`HagCDaza`tCahC Eaza`L>aiC'Eaza`ajCEEaza`akCdEaza`alCEaza`amCEaza`}anCEaza`waoCEaza`maqCEaza`?garCFaza``asC;Faza`[ZatCYFaza`SauCwFaza`MavCFaza`pHawCFaza`HCaxCFaza` >ayCFaza`azC Gaza`a{C,Gaza` a|CKGaza`a}CjGaza`}a~CGaza`waCGaza`maCGaza`4gaCGaza``aCHaza`PZaC!Haza`SaC?Haza`wMaC]Haza`DHaC{Haza`CaCHaza`=aCHaza`aCHaza`zaCHaza`aCIaza`aC2Iaza`}aCQIaza`waCpIaza`maCIaza`)gaCIaza``aCIaza`EZaCIaza`SaCJaza`KMaC%Jaza`HaCCJaza`BaCaJaza`=aCJaza`aCJaza`naCJaza`aCJaza`vaCJaza`|aCKaza`waC8Kaza`maCWKaza`gaCuKaza``aCKaza`:ZaCKaza`SaCKaza`MaCKaza`GaC Laza`BaC)Laza`=aCGLaza`ޒaCeLaza`baCLaza`aCLaza`jaCLaza`|aCLaza`waCMaza`maCMaza`gaC=Maza``aC[Maza`/ZaCyMaza`SaCMaza`LaCMaza`GaCMaza`BaCMaza`p=aCNaza`ҒaC-Naza`VaCLNaza`ڇaCkNaza`^aCNaza`|aCNaza`~waCNaza`zmaCNaza`gaCOaza``aC#Oaza`$ZaCAOaza`SaC_Oaza`LaC}Oaza`GaCOaza`lBaCOaza`D=aCOaza`ƒaCOaza`JaCPaza`·aC3Paza`RaCRPaza`|aCqPaza`rwaCPaza`omaCPaza`faCPaza``aCPaza`ZaC Qaza`SaC'Qaza`LaCEQaza`hGaCcQaza`@BaCQaza`=aCQaza`aCQaza`>aCQaza`‡aCQaza`FaCRaza`|aC9Raza`fwaCXRaza`dmaCwRaza`faCRaza``aCRaza`ZaCRaza`SaCRaza`oLaC Saza`D\aza`wa?D]aza`"maAD']aza`faBDE]aza`>`aCDc]aza`YaDD]aza`eSaED]aza`gKaFD]aza`4FaGD]aza` AaHD]aza`;aID^aza`faJD5^aza`aKDT^aza`naLDs^aza`aMD^aza`v|aND^aza`waOD^aza`maQD^aza`faRD _aza`3`aSD+_aza`YaTDI_aza`ZSaUDg_aza`;KaVD_aza`FaWD_aza`@aXD_aza`;aYD_aza`ZaZD_aza`ތa[D`aza`ba\D;`aza`a]DZ`aza`j|a^Dy`aza`wa_D`aza` maaD`aza`fabD`aza`(`acD`aza`YadDaaza`OSaeD/aaza`KafDMaaza`EagDkaaza`@ahDaaza`;aiDaaza`NajDaaza`ҌakDaaza`ValDbaza`ځamD"baza`^|anDAbaza`vaoD`baza`maqDbaza`farDbaza``asDbaza`YatDbaza`DSauDbaza`JavDcaza`EawD3caza`}@axDQcaza`U;ayDocaza`BazDcaza`ƌa{Dcaza`Ja|Dcaza`΁a}Dcaza`R|a~D daza`vaD(daza`laDGdaza`faDedaza``aDdaza`YaDdaza`9SaDdaza`JaDdaza`yEaDdaza`Q@aDeaza`);aD7eaza`6aDUeaza`aDteaza`>aDeaza`aDeaza`F|aDeaza`vaDeaza`laDfaza`yfaD-faza``aDKfaza`YaDifaza`.SaDfaza`JaDfaza`MEaDfaza`%@aDfaza`:aDfaza`*aDgaza`aDaDraza`aDsaza`raD4saza`aDSsaza`zaDrsaza`{aDsaza`vaDsaza`laDsaza`,faDsaza`_aD taza`HYaD)taza`RaDGtaza`MaDetaza`HaDtaza`CaDtaza`m>aDtaza`aDtaza`faDtaza`aDuaza`naD:uaza`{aDYuaza`vaDxuaza`laEuaza`!faEuaza`_aEuaza`=YaEuaza`RaEvaza`MaE-vaza`HaEKvaza`iCaEivaza`A>a Evaza`֑a Evaza`Za Evaza`ކa Evaza`ba Ewaza`{aE!waza`vaE@waza`laE_waza`faE}waza`_aEwaza`2YaEwaza`RaEwaza`MaEwaza`eHaExaza`=CaE1xaza`>aEOxaza`ʑaEmxaza`NaExaza`҆aExaza`VaExaza`{aExaza`vvaEyaza`}la!E'yaza` fa"EEyaza`_a#Ecyaza`'Ya$Eyaza`Ra%Eyaza`lMa&Eyaza`9Ha'Eyaza`Ca(Eyaza`=a)Ezaza`a*E5zaza`Ba+ETzaza`Ɔa,Eszaza`Ja-Ezaza`{a.Ezaza`jva/Ezaza`rla1Ezaza`fa2E {aza`_a3E+{aza`Ya4EI{aza`Ra5Eg{aza`@Ma6E{aza` Ha7E{aza`Ba8E{aza`=a9E{aza`a:E{aza`6a;E|aza`a<E;|aza`>a=EZ|aza`{a>Ey|aza`^va?E|aza`glaAE|aza`eaBE|aza`_aCE|aza`YaDE}aza`RaEE/}aza`MaFEM}aza`GaGEk}aza`BaHE}aza`=aIE}aza`aJE}aza`*aKE}aza`aLE~aza`2aME"~aza`{aNEA~aza`RvaOE`~aza`\laQE~aza`eaRE~aza`x_aSE~aza`YaTE~aza`RaUE~aza`LaVEaza`GaWE3aza`BaXEQaza`e=aYEoaza`aZEaza`a[Eaza`a\Eaza`&a]Eaza`{a^E aza`Fva_E(aza`QlaaEGaza`eabEeaza`m_acEaza`XadEaza`RaeEaza`LafE݀aza`GagEaza`aBahEaza`9=aiE7aza`ajEUaza`akEtaza`alEaza`amEaza`{anEсaza`:vaoEaza`FlaqEaza`earE-aza`b_asEKaza`XatEiaza`RauEaza`LavEaza`]GawEÂaza`5BaxEaza` =ayEaza`azEaza`a{E<aza`a|E[aza`a}Ezaza`{a~Eaza`.vaEaza`;laE׃aza`eaEaza`W_aEaza`XaE1aza`~RaEOaza`dLaEmaza`1GaEaza` BaEaza`<aEDŽaza`vaEaza`aEaza`~aE#aza`aEBaza`{aEaaza`"vaEaza`0laEaza`eaEaza`L_aEۅaza`XaEaza`sRaEaza`8LaE5aza`GaESaza`AaEqaza`<aEaza`jaEaza`aĔaza`raEaza`aE aza`z{aE)aza`vaEHaza`%laEgaza`eaEaza`A_aEaza`XaEaza`hRaE߇aza` LaEaza`FaEaza`AaE9aza`<aEWaza`^aEuaza`aEaza`faEaza`aE҈aza`n{aEaza` vaEaza`laE/aza`eaEMaza`6_aEkaza`XaEaza`]RaEaza`KaEʼnaza`FaEaza`AaEaza`]<aEaza`RaE=aza`֋aE\aza`ZaE{aza`ހaEaza`b{aEaza`uaE؊aza`laEaza`eaEaza`+_aE3aza`XaEQaza`RRaEoaza`KaEaza`FaEaza`YAaEɋaza`1<aEaza`FaEaza`ʋaE$aza`NaECaza`ҀaEbaza`V{aEaza`uaEaza`laEaza`eaE݌aza` _aEaza`XaEaza`GRaE7aza`KaEUaza`UFaEsaza`-AaEaza`<aEaza`:aE͍aza`aEaza`BaE aza`ƀaE*aza`J{aEIaza`uaEhaza`kaEaza`eaEaza`_aEÎaza`XaEaza`{aEaza`uaE0aza`kaEOaza`|eaEmaza` _aEaza`XaEaza`1RaEǐaza`0KaEaza`EaEaza`@aE!aza`;aE?aza`"aE]aza`aE|aza`*aEaza`aEaza`2{aEّaza`uaEaza`kaFaza`qeaF5aza`^aFSaza`XaFqaza`&RaFaza`KaFaza`EaF˒aza`@aFaza`;a Faza`a F%aza`a FDaza`a Fcaza`a Faza`&{aFaza`uaFaza`kaFߓaza`feaFaza`^aFaza`XaF9aza`RaFWaza`JaFuaza`EaFaza`r@aFaza`J;aFϔaza` aFaza`aF aza`aF+aza`aFJaza`{aFiaza`uaFaza`ka!Faza`[ea"Fŕaza`^a#Faza`wXa$Faza`Ra%Faza`Ja&F=aza`nEa'F[aza`F@a(Fyaza`;a)Faza`a*Faza`a+FԖaza`a,Faza`a-Faza`{a.F1aza`ua/FPaza`ka1Foaza`Pea2Faza`^a3Faza`lXa4Fɗaza`Ra5Faza`uJa6Faza`BEa7F#aza`@a8FAaza`:a9F_aza`a:F}aza`va;Faza`a<Faza`~a=Fژaza`{a>Faza`ua?Faza`kaAF7aza`EeaBFVaza`^aCFuaza`aXaDFaza`QaEFaza`IJaFFҙaza`EaGFaza`?aHFaza`:aIF/aza`aJFNaza`jaKFnaza`aLFaza`raMFaza`zaNFΚaza`uaOFaza`kaQFaza`:eaRF-aza`^aSFLaza`VXaTFkaza`QaUFaza`JaVFaza`DaWFțaza`?aXFaza`:aYFaza`ڐaZF%aza`^a[FEaza`a\Feaza`fa]Faza`za^Faza`ua_FŜaza`kaaFaza`/eabFaza`^acF#aza`KXadFBaza`QaeFaaza`IafFaza`DagFaza`?ahFaza`n:aiFݝaza`ΐajFaza`RakFaza`օalF<aza`ZamF\aza`zanF|aza`zuaoFaza`kaqFaza`$earF۞aza`^asFaza`@XatFaza`QauF8aza`IavFWaza`DawFvaza`u?axFaza`M:ayFaza`azFӟaza`Fa{Faza`ʅa|Faza`Na}F3aza`za~FSaza`nuaFsaza`d1aFaza`Z1aFaza`P1aFѠaza`F1aFaza`<1aFaza`21aF.aza`(1aFMaza`1aFlaza`1aGaza` 1aGaza`1a Gɡaza`0a0Gaza`0a@Gaza`0aPG&aza`0a`GEaza`0apGdaza`0aGaza`0aGaza`0aGaza`0aGaza`0aGaza`0aGaza`0aG=aza`~0aG\aza`ukaF{aza`eaFaza`^aFaza`XaFأaza`QaFaza`NaFaza`HaF5aza`CaFTaza`>aFsaza`aFaza`:aFaza`aFҤaza`BaFaza`zaFaza`buaF2aza`jkaFRaza`daFqaza`^aFaza`XaFaza`QaFΥaza`MaFaza`HaF aza`CaF+aza`b>aFJaza`aFiaza`.aFaza`aFaza`6aFɦaza`zaFaza`VuaF aza`_kaF)aza`daFHaza`{^aFgaza` XaFaza`QaFaza`MaFħaza`HaFaza`^CaFaza`6>aF!aza`aF@aza`"aF`aza`aFaza`*aFaza`zaFaza`JuaFaza`TkaFaza`daFaza`p^aF>aza`WaF]aza`QaF|aza`MaFaza`ZHaFaza`2CaF٩aza` >aFaza`aFaza`aF7aza`aFWaza`aFwaza`zaFaza`>uaFaza`IkaFתaza`daFaza`e^aFaza`WaF4aza`QaFSaza`aMaFraza`.HaFaza`CaFaza`=aFϫaza`aFaza` aFaza`aF.aza`aFNaza`zaFnaza`2uaFaza`>kaFaza`daFͬaza`Z^aFaza`WaF aza`QaF*aza`5MaFIaza`HaFhaza`BaFaza`=aFaza`zaFŭaza`aFaza`aFaza`aF%aza`zaFEaza`&uaFeaza`3kaFaza`daFaza`O^aFîaza`WaFaza`vQaFaza` MaF aza`GaF?aza`BaF^aza`=aF}aza`naFaza`aFaza`vaFܯaza`aFaza`~zaFaza`uaF<aza`(kaF\aza`daF{aza`D^aFaza`WaFaza`kQaFذaza`LaFaza`GaFaza`BaF5aza`Z=aFTaza`baFsaza`aFaza`jaFaza`aFӱaza`rzaFaza`uaFaza`kaG3aza`daGRaza`9^aGqaza`WaGaza``QaGaza`LaGβaza`~GaGaza`VBaG aza`.=a G+aza`Va GJaza`ڊa Gjaza`^a Gaza`a Gaza`fzaGʳaza`uaGaza`kaG aza`daG)aza`.^aGHaza`WaGgaza`UQaGaza`LaGaza`RGaGĴaza`*BaGaza`=aGaza`JaG!aza`ΊaGAaza`RaGaaza`aGaza`ZzaGaza`taGaza`ka!Gaza`da"Gaza`#^a#Gaza`Wa$G>aza`JQa%G]aza`YLa&G|aza`&Ga'Gaza`Aa(Gaza`<a)Gٶaza`>a*Gaza`Ša+Gaza`Fa,G8aza`a-GXaza`Nza.Gxaza`ta/Gaza`ja1Gaza`da2G׷aza`^a3Gaza`Wa4Gaza`?Qa5G4aza`-La6GSaza`Fa7Graza`Aa8Gaza`<a9Gaza`2a:Gϸaza`a;Gaza`:a<Gaza`a=G/aza`Bza>GOaza`ta?Goaza`jaAGaza`daBGaza` ^aCG͹aza`WaDGaza`4QaEG aza`LaFG*aza`FaGGIaza`AaHGhaza`~<aIGaza`&aJGaza`aKGƺaza`.aLGaza`aMGaza`6zaNG&aza`taOGFaza`jaQGfaza`tdaRGaza`^aSGaza`WaTGûaza`)QaUGaza`KaVGaza`FaWG aza`zAaXG?aza`R<aYG^aza`aZG}aza`a[Gaza`"a\Gaza`a]Gݼaza`*za^Gaza`ta_Gaza`jaaG=aza`idabG\aza`]acG{aza`WadGaza`QaeGaza`KafGؽaza`vFagGaza`NAahGaza`&<aiG5aza`ajGTaza`akGtaza`alGaza`amGaza`zanGԾaza`taoGaza`jaqGaza`^darG3aza`]asGRaza`zWatGqaza`QauGaza`}KavGaza`JFawGοaza`"AaxGaza`;ayG aza`azG+aza`a{GKaza` a|Gkaza`a}Gaza`za~Gaza`taGaza`jaGaza`SdaG aza`]aG)aza`oWaGHaza`QaGgaza`QKaGaza`FaGaza`@aGaza`;aGaza`aGaza`zaG"aza`aGBaza`aGbaza`zaGaza`taGaza`jaGaza`HdaGaza`]aGaza`dWaGaza`PaG>aza`%KaG]aza`EaG|aza`@aGaza`;aGaza`aGaza`naGaza`aGaza`vaG9aza`yaGYaza`taGyaza`jaGaza`=daGaza`]aGaza`YWaGaza`PaGaza`JaG4aza`EaGSaza`@aGraza`v;aGaza`ޏaGaza`baGaza`aGaza`jaGaza`yaG0aza`taGPaza`jaGpaza`2daGaza`]aGaza`NWaGaza`PaGaza`JaG aza`EaG*aza`g@aGIaza`?;aGhaza`ҏaGaza`VaGaza`ڄaGaza`^aGaza`yaGaza`~taG'aza`jaGGaza`'daGfaza`]aGaza`CWaGaza`PaGaza`JaGaza`cEaGaza`;@aG aza`;aG?aza`ƏaG^aza`JaG~aza`΄aGaza`RaGaza`yaGaza`rtaGaza`jaGaza`daG=aza`]aG\aza`8WaG{aza`PaGaza`jJaGaza`7EaGaza`@aGaza`:aGaza`aG5aza`>aGUaza`„aGuaza`FaGaza`yaGaza`ftaGaza`jaGaza`daGaza`]aG3aza`-WaGRaza`PaGqaza`>JaGaza` EaGaza`?aGaza`:aGaza`aG aza`2aG,aza`aGLaza`:aGlaza`yaGaza`ZtaGaza`xjaGaza`daGaza`]aG aza`"WaG)aza`PaGHaza`JaGgaza`DaGaza`?aGaza`:aGaza`aGaza`&aGaza`aG#aza`.aGCaza`yaGcaza`NtaGaza`H'a aza`-'a aza`'a aza`&a aza`&a aza`&a aza`&a aza`&a aza`p&a aza`U&a aza`.:a #aza`:a 3aza`9a Caza`9a Saza`9a caza`9a saza`?'a aza`$'a aza` 'a aza`&a aza`&a &aza`&a 4aza`&a Baza`&a Paza`g&a ^aza`L&a laza`$:a zaza`:a aza`9a aza`9a aza`9a aza`9a aza`9a aza`z9a aza`p9a aza`f9a aza`\9a aza`R9a aza`H9a .aza`>9a =aza`49a Laza`*9a [aza` 9a jaza`9a yaza` 9a aza`9a aza`8a aza`8a aza`8a aza`8a! aza`8a" aza`8a# aza`8a$ aza`8a% aza`8a& aza`8a' -aza`8a( <aza`8a) Kaza`8a* Zaza`v8a+ iaza`l8a, xaza`b8a- aza`X8a. aza`N8a/ aza`D8a0 aza`:8a1 aza`08a2 aza`&8a3 aza`8a4 aza`8a5 aza`8a6 aza`7a7 aza`7a8 ,aza`7a9 ;aza`7a: Jaza`7a; Yaza`7a< haza`7a= waza`7a> aza`7a? aza`7a@ aza`7aA aza`7aB aza`7aC aza`|7aD aza`r7aE aza`h7aF aza`^7aG aza`T7aH aza`J7aI +aza`@7aJ :aza`67aK Iaza`,7aL Xaza`"7aM gaza`7aN vaza`7aO aza`7aP aza`6aQ aza`6aR aza`6aS aza`6aT aza`6aU aza`6aV aza`6aW aza`6aX aza`6aY aza`6aZ *aza`6a[ 9aza`6a\ Haza`6a] Waza`x6a^ faza`n6a_ uaza`d6a` aza`Z6aa aza`P6ab aza`F6ac aza`7qad aza`'oae aza`haf aza`Cbag aza`[ah aza`jUai aza`Oaj aza`Iak 0aza`Dal @aza`j?am Paza`,qan `aza`oao paza`hap aza`8baq aza`[ar aza`_Uas aza`Nat aza`Iau aza`qDav aza`I?aw aza`!qax aza`oay aza`haz aza`-ba{ 0aza`[a| @aza`TUa} Paza`Na~ `aza`Ia paza`P%aP%asza =oau0aza hau9aza YbauBaza [auKaza UauTaza Oau]aza =Naufaza  Iauoaza Cauxaza >a uaza *a uaza a uaza 2a uaza ~a uaza Fyauaza sauaza sauaza rauaza Jrauaza qauaza auaza auaza &auaza ~auaza :yauaza sauaza ^sauaza rauaza 2rauaza qau%aza au/aza au9aza a uCaza ~a!uMaza .ya"uWaza sa#uaaza Fsa$ukaza ra%uuaza ra&uaza qa'uaza a(uaza a)uaza a*uaza ~a+uaza "ya,uaza sa-uaza .sa.uaza ra/uaza ra0uaza rqa1uaza a2uaza ~a3uaza a4u aza ~a5uaza ya6uaza sa7u)aza sa8u3aza zra9u=aza qa:uGaza Zqa;uQaza a<u[aza ra=ueaza a>uoaza z~a?uyaza wa wasza ja jasza +a+asza K#aapza E#aapza #aapza #aapza #aapza {#aapza t#aapza m#aapza f#aapza _#aapza X#aapza Q#a apza ?%a apza 7%a apza /%a apza '%a )apza %a5apza %aAapza %aMapza %aYapza $aeapza $aqapza $a}apza $aapza $aapza $aapza $aapza $aapza $aapza $aapza $aapza $aapza $aapza $aapza $a apza $a!apza $a"%apza w$a#1apza o$a$=apza g$a%Iapza _$a&Uapza W$a'aapza O$a(mapza G$a)yapza ?$a*apza 7$a+apza /$a,apza '$a-apza $a.apza $a/apza $a0apza $a1apza #a2apza #a3apza #a4apza #a5 apza #a6apza #a7!apza #a8-apza #a99apza #a:Eapza #a;Qapza #a<]apza #a=iapza #a>uapza #a?apza %p = readdir (%p)/\%s:%d setting errno %d-1 = dirfd (%p)%R = closedir(%p)got %d error from build_fh_name%R = mkdir(%s, %d)%R = rmdir(%s)int rmdir(const char*)int __set_errno(const char*, int, int)int mkdir(const char*, mode_t)int closedir(DIR*)int readdir_worker(DIR*, dirent*)dirent* readdir(DIR*)cygheap_fdget::cygheap_fdget(int, bool, bool)DIR* opendir(const char*)int dirfd(DIR*)/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/dlfcn.cc%s:%d setting errno %d.so/usr/bin:/usr/liblib.dlopenret %pLD_LIBRARY_PATH=dlsymdlclosevoid* dlsym(void*, const char*)int __set_errno(const char*, int, int)void* dlopen(const char*, int)bool get_full_path_of_dll(const char*, path_conv&)\\?\UNC\%W: Loaded to different address: parent(%p) != child(%p) Loaded different DLL with same basename in forked child, parent loaded: %W child loaded: %W The DLLs differ, so it's not safe to run the forked child. Make sure to remove the offending DLL before trying again.p->envptr != NULL/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/dll_init.ccWARNING: trying to detach an already detached dll ...address space needed by '%W' (%p) is already occupiedunable to release protective reservation for %W (%08lx), %Eunable to create interim mapping for %W, %E%W loaded in wrong place: %08lx != %08lxcouldn't examine memory at %08lx while mapping %W, %Ecouldn't allocate memory %p(%d) for '%W' alignment, %E unable to block off %p to prevent %W from loading thereunable to remap %W to same address as parent (%08lx) - try running rebaseallreleasing blocked space at %08lxcouldn't release memory %p for '%W' alignment, %E unable to unload interim mapping of %W, %Eunable to map %W, %Eunable to map %W to same address as parent: %p != %pdll_listvoid dll_list::load_after_fork_impl(void*, dll*, int)void dll_list::detach(void*)dll* dll_list::alloc(HINSTANCE__*, per_process*, dll_type)NtQueryObject failed, %pnt->Name.Buffer == NULLcygwin-pty/dev/pty%dpipecurrent match '%W' = '%W' remote drivederived path '%W', posix '%s'%s:%d setting errno %dcalloc failedsize %d, fds %pdeleting element %d for %s(%d/%d)not called from open for /dev/ttyno /dev/tty assigneddetermining /dev/tty assignment for ctty %p/dev/ttyfound an archetype for %s(%d/%d) io_handle %pcreated an archetype (%p) for %s(%d/%d)fh %p, dev %p:sock:couldn't initialize fd %d for %sfd %d, handle %pcouldn't make stderr distinct from stdout, %EcYgstd %x %x %xbuild_fh_pc failedoldfh->dup failedline %d: %s<%p> usecount + %d = %dduped '%s' old %p, new %pdup3 (%d, %d, %p)fd %d not opennew fd out of bounds: %dinvalid flags value %xnewfh->io_handle %p, oldfh->io_handle %p, new win32_name %p, old win32_name %p%R = dup3(%d, %d, %p)%s fd %dclosing fd %d since it is an archetypefd %d (%s)void dtable::fixup_before_exec(DWORD)void dtable::fixup_before_fork(DWORD)void dtable::fixup_after_fork(void*)void dtable::fixup_close(size_t, fhandler_base*)bool dtable::select_except(int, select_stuff*)int __set_errno(const char*, int, int)bool dtable::select_write(int, select_stuff*)bool dtable::select_read(int, select_stuff*)int dtable::dup3(int, int, int)fhandler_base* dtable::dup_worker(fhandler_base*, int)fhandler_base* build_fh_pc(path_conv&)fhandler_base* fh_alloc(path_conv&)fhandler_base* build_fh_name(const char*, unsigned int, suffix_info*)some disk filevoid dtable::init_std_file_from_handle(int, void*)\Device\Null\Device\Afd\Device\NamedPipe\\device\\Device\LanmanRedirector\\Device\WinDfs\Root\bool handle_to_fn(void*, char*)void dtable::delete_archetype(fhandler_base*)void dtable::stdio_init()int dtable::extend(int)ignorecase"tty" option detected in CYGWIN environment variable. CYGWIN=tty is no longer supported. Please remove it from your CYGWIN environment variable and use a terminal emulator like mintty, xterm, or rxvt. posix %snative %susing value from GetEnvironmentVariable for '%W'warning: %s not present in environmentno_envblock %dduping existing value for '%s'using computed value for '%s'%s:%d setting errno %dcan't set native for %s since no environ yetenvp %p(srcp - envp) == n/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/environ.cc(size_t) envc <= (n + SPENVS_SIZE)env count %d, bytes %d=(s - envblock) <= tlenvp %p, envc %denv var converted to %sCYGWINno%s %s (called func)%s %d%s%s%s %xreturningProgram Optionsinternal error reading the windows environment - too many environment variables?defaultGetEnvironmentStrings returned NULL, %EGetEnvironmentStrings returned %pTERM=CYGWIN=%p: %sPATH=HOME=LD_LIBRARY_PATH=TMPDIR=TMP=TEMP=HOMEDRIVE=HOMEPATH=LOGONSERVER=SYSTEMDRIVE=SYSTEMROOT=USERDOMAIN=USERNAME=USERPROFILE=WINDIR=char** build_env(const char* const*, WCHAR*&, int&, bool)char* spenv::retrieve(bool, const char*)char* getwinenveq(const char*, size_t, int)void environ_init(char**, int)ACHNOPSTW ALLUSERSPROFILE=COMMONPROGRAMFILES=COMPUTERNAME=COMSPEC=NUMBER_OF_PROCESSORS=OS=PATHEXT=PROCESSOR_ARCHITECTURE=PROCESSOR_IDENTIFIER=PROCESSOR_LEVEL=PROCESSOR_REVISION=PROGRAMFILES=DaUaia waaa a aaaaaaaaa a a avaaaavoid posify_maybe(char**, const char*, char*)detect_blodadosfilewarningerror_startexportglobnormalpipe_byteproc_retryreset_comttywinsymlinksvoid parse_options(const char*)int unsetenv(const char*)int __set_errno(const char*, int, int)int setenv(const char*, const char*, int)win_env* getwinenv(const char*, const char*, win_env*)void win_env::add_cache(const char*, const char*)windows error %u == errno %dunknown windows error %u, setting errno to %d%s:%d windows error %d%s:%d status %p -> windows error %dUnknown error %d%s:%d setting errno %d %s:%d: %s:%s: %sNo errorOperation not permittedNo such file or directoryNo such processInterrupted system callInput/output errorNo such device or addressArgument list too longExec format errorBad file descriptorNo child processesResource temporarily unavailableCannot allocate memoryPermission deniedBad addressBlock device requiredDevice or resource busyFile existsInvalid cross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentToo many open files in systemToo many open filesInappropriate ioctl for deviceText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeNumerical argument out of domainNumerical result out of rangeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedResource deadlock avoidedNo locks availableInvalid exchangeInvalid request descriptorExchange fullNo anodeInvalid request codeInvalid slotFile locking deadlock errorBad font file formatDevice not a streamNo data availableTimer expiredOut of streams resourcesMachine is not on the networkPackage not installedObject is remoteLink has been severedAdvertise errorSrmount errorCommunication error on sendProtocol errorMultihop attemptedInode is remote (not really error)RFS specific errorBad messageInappropriate file type or formatName not unique on networkFile descriptor in bad stateRemote address changedCan not access a needed shared libraryAccessing a corrupted shared library.lib section in a.out corruptedAttempting to link in too many shared librariesCannot exec a shared library directlyFunction not implementedNo more filesDirectory not emptyFile name too longToo many levels of symbolic linksOperation not supportedProtocol family not supportedConnection reset by peerNo buffer space availableAddress family not supported by protocolProtocol wrong type for socketSocket operation on non-socketProtocol not availableCannot send after transport endpoint shutdownConnection refusedAddress already in useSoftware caused connection abortNetwork is unreachableNetwork is downConnection timed outHost is downNo route to hostOperation now in progressOperation already in progressDestination address requiredMessage too longProtocol not supportedSocket type not supportedCannot assign requested addressNetwork dropped connection on resetTransport endpoint is already connectedTransport endpoint is not connectedToo many references: cannot spliceToo many processesToo many usersDisk quota exceededStale NFS file handleNot supportedNo medium foundNo such host or network pathFilename exists with different caseInvalid or incomplete multibyte or wide characterValue too large for defined data typeOperation canceledState not recoverablePrevious owner diedStreams pipe errorchar* strerror_r(int, char*, size_t)int __set_errno(const char*, int, int)char* strerror(int)void seterrno_from_nt_status(const char*, int, NTSTATUS)void seterrno_from_win_error(const char*, int, DWORD)ACCESS_DENIEDACTIVE_CONNECTIONSALREADY_EXISTSBAD_DEVICEBAD_EXE_FORMATBAD_NETPATHBAD_NET_NAMEBAD_NET_RESPBAD_PATHNAMEBAD_PIPEBAD_UNITBAD_USERNAMEBEGINNING_OF_MEDIABROKEN_PIPEBUSYBUS_RESETCALL_NOT_IMPLEMENTEDCANNOT_MAKECHILD_NOT_COMPLETECOMMITMENT_LIMITCRCDEVICE_DOOR_OPENDEVICE_IN_USEDEVICE_REQUIRES_CLEANINGDIRECTORYDIR_NOT_EMPTYDISK_CORRUPTDISK_FULLDUP_NAMEEAS_DIDNT_FITEAS_NOT_SUPPORTEDEA_LIST_INCONSISTENTEA_TABLE_FULLEND_OF_MEDIAEOM_OVERFLOWEXE_MACHINE_TYPE_MISMATCHEXE_MARKED_INVALIDFILEMARK_DETECTEDFILENAME_EXCED_RANGEFILE_CORRUPTFILE_EXISTSFILE_INVALIDFILE_NOT_FOUNDHANDLE_DISK_FULLHANDLE_EOFINVALID_ADDRESSINVALID_AT_INTERRUPT_TIMEINVALID_BLOCK_LENGTHINVALID_DATAINVALID_DRIVEINVALID_EA_NAMEINVALID_EXE_SIGNATUREINVALID_FUNCTIONINVALID_HANDLEINVALID_NAMEINVALID_PARAMETERINVALID_SIGNAL_NUMBERIOPL_NOT_ENABLEDIO_DEVICEIO_INCOMPLETEIO_PENDINGLOCK_VIOLATIONMAX_THRDS_REACHEDMETA_EXPANSION_TOO_LONGMOD_NOT_FOUNDMORE_DATANEGATIVE_SEEKNETNAME_DELETEDNOACCESSNONE_MAPPEDNONPAGED_SYSTEM_RESOURCESNOT_CONNECTEDNOT_ENOUGH_MEMORYNOT_OWNERNOT_READYNOT_SAME_DEVICENOT_SUPPORTEDNO_DATANO_DATA_DETECTEDNO_MEDIA_IN_DRIVENO_MORE_FILESNO_MORE_ITEMSNO_MORE_SEARCH_HANDLESNO_PROC_SLOTSNO_SIGNAL_SENTNO_SYSTEM_RESOURCESNO_TOKENOPEN_FAILEDOPEN_FILESOUTOFMEMORYPAGED_SYSTEM_RESOURCESPAGEFILE_QUOTAPATH_NOT_FOUNDPIPE_BUSYPIPE_CONNECTEDPIPE_LISTENINGPIPE_NOT_CONNECTEDPOSSIBLE_DEADLOCKPROCESS_ABORTEDPROC_NOT_FOUNDREM_NOT_LISTSECTOR_NOT_FOUNDSEEKSETMARK_DETECTEDSHARING_BUFFER_EXCEEDEDSHARING_VIOLATIONSIGNAL_PENDINGSIGNAL_REFUSEDTHREAD_1_INACTIVETOO_MANY_LINKSTOO_MANY_OPEN_FILESWAIT_NO_CHILDRENWORKING_SET_QUOTAWRITE_PROTECTPRIVILEGE_NOT_HELDint geterrno_from_win_error(DWORD, int)process %d stopped by signal %dWaitSingleObject failed, %Eunknown.stackdumpDumping stack trace to %Sexiting with status %pSetConsoleCtrlHandler failed, %E%s "%s" (more stack frames may be present)Exception: %s at eip=%08x eax=%08x ebx=%08x ecx=%08x edx=%08x esi=%08x edi=%08x ebp=%08x esp=%08x program=%W, pid %u, thread %s cs=%04x ds=%04x es=%04x fs=%04x gs=%04x ss=%04x Stack trace: Frame Function Args Signal %d at eip=%08x %08x %08x (%s%08x, ) End of stack trace%s couldn't get memory info, pc %p, %E\\?\pc %p, h %p, inside_kernel %ddebugger_command '%s' %uCYGWIN=error_startCYGWIN*** starting debugger for pid %u, tid %u Failed to start debugger, %E*** continuing pid %u from debugger call (%d) armed signal_arrived %p, signal %d, res %dnot trying to send signal %d but signal %d already armedcontrolled interrupt. stackptr %p, stack %p, stackptr[-1] %psuspending thread, tls %p, _main_tls %pcouldn't get context of thread, %Ecouldn't interrupt. trying again.signal %d %sdeliveredoldmask %p, newmask %p, deltamask %poldmask %p, newmask %p, mask_bits %p%s:%d setting errno %dSIG_ERR = sigset (%d, %p)signal %d out of rangeoldmask %p, newmask %psignal %d processingtls %p, use_tls %psignal %d blockeddefault signal %d ignoredsignal %d ignoredsignal %d, about to call %preturning %dreleasing sigwait for threadmask_syncRedirecting to main_tls signal %dIn cygwin_except_handler exception %p at %p sp %pIn cygwin_except_handler signal %d at %psignal %d, masked %pIn cygwin_except_handler calling %pException: %sError while dumping state (probably corrupted stack)%s[%d]: segfault at %08x rip %08x rsp %08x error %dcYgSiGw00f %d %p %pint _cygtls::call_signal_handler()int __set_errno(const char*, int, int)int sigpacket::process()int setup_handler(int, void*, sigaction&, _cygtls*)void sig_handle_tty_stop(int)void set_signal_mask(sigset_t, sigset_t&)sigset_t set_process_mask_delta()void (* sigset(int, void (*)(int)))(int)int sigrelse(int)int sighold(int)void _cygtls::interrupt_setup(int, void*, sigaction&)int handle_sigsuspend(sigset_t)STATUS_ABANDONED_WAIT_0STATUS_ACCESS_VIOLATIONSTATUS_ARRAY_BOUNDS_EXCEEDEDSTATUS_BREAKPOINTSTATUS_CONTROL_C_EXITSTATUS_DATATYPE_MISALIGNMENTSTATUS_FLOAT_DENORMAL_OPERANDSTATUS_FLOAT_DIVIDE_BY_ZEROSTATUS_FLOAT_INEXACT_RESULTSTATUS_FLOAT_INVALID_OPERATIONSTATUS_FLOAT_OVERFLOWSTATUS_FLOAT_STACK_CHECKSTATUS_FLOAT_UNDERFLOWSTATUS_GUARD_PAGE_VIOLATIONSTATUS_ILLEGAL_INSTRUCTIONSTATUS_INTEGER_DIVIDE_BY_ZEROSTATUS_INTEGER_OVERFLOWSTATUS_INVALID_DISPOSITIONSTATUS_IN_PAGE_ERRORSTATUS_NONCONTINUABLE_EXCEPTIONSTATUS_NO_MEMORYSTATUS_PENDINGSTATUS_PRIVILEGED_INSTRUCTIONSTATUS_SINGLE_STEPSTATUS_STACK_OVERFLOWSTATUS_TIMEOUTSTATUS_USER_APCSTATUS_WAIT_0static int exception::handle(EXCEPTION_RECORD*, exception_list*, CONTEXT*, void*)void san::leave()int try_to_debug(bool)bool _cygtls::inside_kernel(CONTEXT*)void open_stackdumpfile()void init_console_handler(bool)BOOL ctrl_c_handler(DWORD)PATH=%s:%d setting errno %d-1 = fexecve (%d, %p, %p)pid_t sexecve_is_bad()int __set_errno(const char*, int, int)int fexecve(int, char* const*, char* const*)cygheap_fdget::cygheap_fdget(int, bool, bool)%s:%d setting errno %d&a&aA*a&a &a&a/aT&a(a'ag'aT'aP&aW(aP&aP&a'a'a,a ,a+a*a/a.aw.aP.a&.a@-a!-a-a(a(a(a(a)a)a)a)a)a*a*aR*ap(a0*a *a*a@(a&along unsigned int cygwin_internal(cygwin_getinfo_types, ...)int __set_errno(const char*, int, int)fcntl(%d, %d, ...)%s:%d setting errno %d%R = fcntl(%d, %d, %p)int fcntl64(int, int, ...)cygheap_fdget::cygheap_fdget(int, bool, bool)cygheap_fdnew::cygheap_fdnew(int, bool)int __set_errno(const char*, int, int)set close_on_exec for %s to %dfinished waiting for I/O from %s, res %dhere for '%s'SetHandleInformation failed, %Ein fhandler_base dupdup(%s) failed, handle %x, %E/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler.ccclosing '%s' handle %pCloseHandle failed, %E%p = NtFsControlFile(%S, FSCTL_SET_SPARSE)text write/dev%s:%d setting errno %dioviovcnt >= 1tot >= 0^a^a@^a^a3_aw_a7^a7^a^ap^ap^a7^aw^a7^a_a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a]a^a^acwcsdup would have returned NULLsetting file pointer to %Ubinarytextreturning %d, %s moderead %d bytes (%s%s)ReadFile %s(%p) failed, %Eflags %p, supplied_bin %pO_TEXT/O_BINARY set in flags %pfilemode set to %sGETFL: %pcreated new fhandler_base for handle %p, bin %d(%S, %p)%x = NtCreateFile (%p, %x, %S, io, NULL, %x, %x, %x, %x, NULL, 0)%d = fhandler_base::open(%S, %p).sa`uawa0vava'tareturning %dline %d: %s<%p> usecount + %d = %dclosing passed in archetype, usecount %dnot closing passed in archetype, usecount %dclosing archetypenot closing archetypeWaitForSingleObject failed, possible data loss in pipe, %EflasioasioCreateEvent failed, %Estarted thread to handle asynchronous closing for %shandle %p already opened%s - %E, handle %s<%p>inheriting '%s' from parentio_handle%d = ioctl(%x, %p)writereadwfres %d, wores %d, bytes %usignalGetOverLappedResult failed, h %p, bytes %u, %Enormal %s, %u bytes ispipe() %dno data to read for nonblocking I/OEOF, %Eres %u, Win32 Error %uvirtual ssize_t fhandler_base_overlapped::raw_write(const void*, size_t)int __set_errno(const char*, int, int)fhandler_base_overlapped::wait_return fhandler_base_overlapped::wait_overlapped(bool, bool, DWORD*, bool, DWORD)virtual int fhandler_base::fpathconf(int)virtual int fhandler_base::fsync()virtual int fhandler_base::utimens(const timespec*)virtual int fhandler_base::link(const char*)virtual int fhandler_base::ftruncate(_off64_t, bool)virtual int fhandler_base::fadvise(_off64_t, _off64_t, int)virtual int fhandler_base::fsetxattr(const char*, const void*, size_t, int)virtual ssize_t fhandler_base::fgetxattr(const char*, void*, size_t)virtual int fhandler_base::facl(int, int, __aclent32_t*)virtual int fhandler_base::closedir(DIR*)virtual void fhandler_base::rewinddir(DIR*)virtual void fhandler_base::seekdir(DIR*, long int)virtual long int fhandler_base::telldir(DIR*)virtual DIR* fhandler_base::opendir(int)virtual int fhandler_base::rmdir()virtual int fhandler_base::mkdir(mode_t)virtual void fhandler_base::fixup_after_exec()virtual void fhandler_base::fixup_after_fork(void*)virtual void fhandler_base::set_close_on_exec(bool)bool fhandler_base::fork_fixup(void*, void*&, const char*)virtual void fhandler_base::set_no_inheritance(void*&, bool)virtual int fhandler_base::ptsname_r(char*, size_t)virtual pid_t fhandler_base::tcgetsid()virtual int fhandler_base::tcgetpgrp()virtual int fhandler_base::tcsetpgrp(pid_t)virtual int fhandler_base::tcgetattr(termios*)virtual int fhandler_base::tcsetattr(int, const termios*)virtual int fhandler_base::tcflow(int)virtual int fhandler_base::tcdrain()virtual int fhandler_base::tcsendbreak(int)virtual int fhandler_base::tcflush(int)virtual int fhandler_base::fcntl(int, void*)virtual int fhandler_base::dup(fhandler_base*, int)virtual int fhandler_base::init(void*, DWORD, mode_t)virtual int fhandler_base::lock(int, __flock64*)virtual int fhandler_base::ioctl(unsigned int, void*)void fhandler_base_overlapped::check_later()static void fhandler_base_overlapped::flush_all_async_io()DWORD flush_async_io(void*)virtual int fhandler_base::close()int fhandler_base::close_with_arch()virtual ssize_t fhandler_base::pwrite(void*, size_t, _off64_t)virtual ssize_t fhandler_base::pread(void*, size_t, _off64_t)virtual _off64_t fhandler_base::lseek(_off64_t, int)virtual ssize_t fhandler_base::writev(const iovec*, int, ssize_t)virtual ssize_t fhandler_base::readv(const iovec*, int, ssize_t)virtual ssize_t fhandler_base::write(const void*, size_t)virtual void fhandler_base::read(void*, size_t&)virtual int fhandler_base::open(int, mode_t)int fhandler_base::open_with_arch(int, mode_t)int fhandler_base::fhaccess(int, bool)virtual void fhandler_base::raw_read(void*, size_t&)void fhandler_base::set_flags(int, int)error opening clipboard, %ECouldn't realloc() clipboard buffer for write/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler_clipboard.cc%s:%d setting errno %dcwcsdup would have returned NULLvirtual ssize_t fhandler_dev_clipboard::write(const void*, size_t)CYGWIN_NATIVE_CLIPBOARDint set_clipboard(const void*, size_t)int __set_errno(const char*, int, int)virtual int fhandler_dev_clipboard::dup(fhandler_base*, int).Current.DefaultAppsSchemesAppEvents\media\ding.wav/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler_console.cc%d = tcgetattr(%p) enable flags %p, t->lflag %p, t->iflag %pcwcsdup would have returned NULL%s:%d setting errno %d%S-cons%pconsole device allocation failure - too many consoles in use, max consoles is 32endisraw keyboard mode %sabledWINSZ: (row=%d,col=%d)WINSZ failed%d = tcsetattr(,%x) (ENABLE FLAGS %x) (lflag %x oflag %x)this %p, get_ttyp () %p, t %p%d = tcsetattr(,%x) enable flags %p, c_lflag %p iflag %pCONIN$CONOUT$opened conin$ %p, conout$ %pinsert mode %sabledunknown h/l command: %d[>67;%d%02d;0c[%d;%dRaPa!aaaaasa0aaa aaVaaaaaaaaaaa$aaaaaaaaaa@aaaa0aa@aaaa@aaaaaa5aaaaaaaa|apaadaUaaIa=aaaaaaaaaaa.aamaaaaUa.aaGa9a+aaaaaaaaaaaa aa aaaaCP437multibyte sequence write failed, handle %pconversion error, handle %pwrite failed, handle %p a!aaaPa aKaa`aaaaaaaaReadConsoleInput failed, %E{%u;%u;%u;%u;%u;%luKmouse: double-click -> clickbtn upbtn1 downbtn2 downbtn3 down[<%d;%d;%d%c[%d;%d;%dM%c%c%c%cmouse: %s at (%d,%d)title '%W'%x, %dat %d(%c) state is %d%d = fhandler_console::write(...)caaa@aaaaa0apa%p = CreateWindowStation(NULL), %ESetProcessWindowStation %d, %E%d = AllocConsole (), %E/bin/cygwin-console-helper.exe %p %pinvisible cygwin consolefreed console, res %dwindow station is not visibleinvisible_console %d@static bool fhandler_console::need_invisible()static void fhandler_console::free_console()static bool fhandler_console::create_invisible_console(HWINSTA__*)void set_console_title(char*)[5~[5;2~[5;5~[5;6~[6~[6;2~[6;5~[6;6~[1~[1;2~[1;5~[1;6~[4~[4;2~[4;5~[4;6~[2~[2;2~[2;5~[2;6~[3~[3;2~[3;5~[3;6~[[A[23~[11^[23^[[B[24~[12^[24^[[C[25~[13^[25^[[D[26~[14^[26^[[E[28~[15^[28^[17~[29~[17^[29^[18~[31~[18^[31^[19~[32~[19^[32^[20~[33~[20^[33^[21~[34~[21^[34^[23$[23@[24$[24@virtual ssize_t fhandler_console::write(const void*, size_t) const unsigned char* fhandler_console::write_normal(const unsigned char*, const unsigned char*)%% $ $ $ $$$ $%% %%<%##%##%$%4%,%%d"e"`"void fhandler_console::char_command(char)virtual int fhandler_console::tcgetattr(termios*)int fhandler_console::input_tcsetattr(int, const termios*)int fhandler_console::output_tcsetattr(int, const termios*)virtual int fhandler_console::ioctl(unsigned int, void*)int __set_errno(const char*, int, int)virtual int fhandler_console::open(int, mode_t)virtual void fhandler_console::read(void*, size_t&)bool fhandler_console::set_raw_win32_keyboard_mode(bool)returning %dcwcsdup would have returned NULL%s:%d setting errno %d%p = opendir (%s)virtual int fhandler_dev::readdir(DIR*, dirent*)virtual DIR* fhandler_dev::opendir(int)int __set_errno(const char*, int, int)cygheap_fdnew::cygheap_fdnew(int, bool)virtual int fhandler_dev::open(int, mode_t)/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler_disk_file.cc%p = NtFsControlFile(%S, FSCTL_GET_NTFS_VOLUME_DATA)%d = fstatvfs(%s, %p)%d = closedir(%p, %s)cwcsdup would have returned NULL%s:%d setting errno %d%p = NtFsControlFile(%S, FSCTL_SET_SPARSE)file '%S' exists?%p = opendir (%s)%p = NtOpenFile(%S)%p = NtReadFile(%S)0 = fstat (%S, %p) st_size=%D, st_mode=%p, st_ino=%Dst_atim=%x.%x st_ctim=%x.%x st_mtim=%x.%x st_birthtim=%x.%x%p = NtQueryDirectoryFile(%S)%p = NtQueryInformationFile(%S, FileNetworkOpenInformation)%p = NtQueryInformationFile(%S, FileStandardInformation)%p = NtQueryInformationFile(%S, FileInternalInformation)Buggy open detected.%d = fhandler_disk_file::open(%S, %p)Faking chown worked on standalone SambaOpening file failedincoming lastaccess %08x %08x%x = NtOpenFile (%p, %x, %S, io, %x, %x)%d = pwrite(%p, %d, %d) %d = pread(%p, %d, %d) %p = readdir (%p) (%s)X:***NtQueryDirectoryFile failed, status %p, win32 error %lu%d = readdir(%p, %p) (L"%lS" > "%ls") (attr %p > type %d)virtual int fhandler_cygdrive::readdir(DIR*, dirent*)virtual int fhandler_cygdrive::open(int, mode_t)int __set_errno(const char*, int, int)virtual int fhandler_disk_file::closedir(DIR*)virtual int fhandler_disk_file::readdir(DIR*, dirent*)virtual DIR* fhandler_disk_file::opendir(int)cygheap_fdnew::cygheap_fdnew(int, bool)virtual int fhandler_disk_file::rmdir()virtual ssize_t fhandler_disk_file::pwrite(void*, size_t, _off64_t)virtual ssize_t fhandler_disk_file::pread(void*, size_t, _off64_t)int fhandler_disk_file::prw_open(bool)int fhandler_base::open_fs(int, mode_t)int fhandler_base::utimens_fs(const timespec*)virtual int fhandler_disk_file::link(const char*)virtual int fhandler_disk_file::ftruncate(_off64_t, bool)virtual int fhandler_disk_file::fadvise(_off64_t, _off64_t, int)virtual int fhandler_disk_file::fsetxattr(const char*, const void*, size_t, int)virtual ssize_t fhandler_disk_file::fgetxattr(const char*, void*, size_t)virtual int fhandler_disk_file::facl(int, int, __aclent32_t*)virtual int fhandler_disk_file::fchown(__uid32_t, __gid32_t)virtual int fhandler_disk_file::fstatvfs(statvfs*)int fhandler_base::fstat_helper(__stat64*, DWORD)int fhandler_base::fstat_by_name(__stat64*)int fhandler_base::fstat_by_handle(__stat64*)audio_in=%08x audio_out=%08x, close_on_exec %dcwcsdup would have returned NULL%s:%d setting errno %dACCMODE=0x%08x audio_in=%d audio_out=%d, err=%dInitializeCriticalSectionQueue overflowU8_S8S16LE_U16LES16LE_U16BES16LE_S16BEnoneparent=0x%08x%d = waveOutOpen(freq=%d bits=%d channels=%d)Internal Error i=%d100ms%d = waveOutUnprepareHeader(0x%08x)%d blocks in Qisr2apppHdr=0x%08x bytes=%d%d = waveOutPrepareHeader(0x%08x)%d = waveOutWrite(0x%08x)dev_=%08x%d = waveOutReset()%d = waveOutClose()Deleting Critical SectionDiscard %d bytes wave headerptr=%08x len=%dAllocating=> ptr_s=%08x len_s=%daudio_in=%08x audio_out=%08x%d = waveInOpen(freq=%d bits=%d channels=%d)%d = waveInReset()%d = waveInUnprepareHeader(0x%08x)%d = waveInClose()%d = waveInPrepareHeader(0x%08x)%d = waveInAddBuffer(0x%08x)%d = waveInStart(), queued=%d%d = waveInOpen(rate=%d bits=%d channels=%d)pSampleData=%08x nBytes=%dgot %dend nBytes=%dSNDCTL_DSP_RESET/dev/dsp: ioctl %sSNDCTL_DSP_GETBLKSIZESNDCTL_DSP_SETFMTSNDCTL_DSP_SPEEDSNDCTL_DSP_STEREOSNDCTL_DSP_CHANNELSSNDCTL_DSP_GETOSPACEbuf=%p frags=%d fragsize=%d bytes=%dSNDCTL_DSP_GETISPACESNDCTL_DSP_SETFRAGMENTSNDCTL_DSP_GETFMTSSNDCTL_DSP_GETCAPSSNDCTL_DSP_POSTSNDCTL_DSP_SYNCvirtual void fhandler_dev_dsp::fixup_after_exec()virtual void fhandler_dev_dsp::fixup_after_fork(void*)virtual int fhandler_dev_dsp::ioctl(unsigned int, void*)int __set_errno(const char*, int, int)virtual int fhandler_dev_dsp::close()virtual void fhandler_dev_dsp::read(void*, size_t&)virtual ssize_t fhandler_dev_dsp::write(const void*, size_t)virtual int fhandler_dev_dsp::open(int, mode_t)bool fhandler_dev_dsp::Audio_in::waitfordata()bool fhandler_dev_dsp::Audio_in::read(char*, int&)bool fhandler_dev_dsp::Audio_in::init(unsigned int)bool fhandler_dev_dsp::Audio_in::queueblock(WAVEHDR*)void fhandler_dev_dsp::Audio_in::stop()void fhandler_dev_dsp::Audio::queue::dellock()bool fhandler_dev_dsp::Audio_in::start(int, int, int)bool fhandler_dev_dsp::Audio_in::query(int, int, int)void fhandler_dev_dsp::Audio_in::fork_fixup(void*)bool fhandler_dev_dsp::Audio_out::parsewav(const char*&, int&, int, int, int)bool fhandler_dev_dsp::Audio_out::sendcurrent()void fhandler_dev_dsp::Audio_out::waitforallsent()bool fhandler_dev_dsp::Audio_out::waitforspace()void fhandler_dev_dsp::Audio_out::init(unsigned int)void fhandler_dev_dsp::Audio_out::stop(bool)bool fhandler_dev_dsp::Audio_out::start()bool fhandler_dev_dsp::Audio_out::query(int, int, int)void fhandler_dev_dsp::Audio_out::fork_fixup(void*)void fhandler_dev_dsp::Audio::setconvert(int)fhandler_dev_dsp::Audio::~Audio()bool fhandler_dev_dsp::Audio::queue::send(WAVEHDR*)void fhandler_dev_dsp::Audio::queue::reset()read_readywrite_ready/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler_fifo.cccwcsdup would have returned NULL%s.%08x.%016X%s:%d setting errno %dDisconnecttNamedPipe failed, %EConnectNamedPipe failed, %ESetEvent for %s failed, %Er-eventCreatEvent for %s failed, %Ew-eventfifocreate of reader failedcreate of writer failedsetup_overlapped failed, %Eres %dvirtual void fhandler_fifo::raw_read(void*, size_t&)bool fhandler_fifo::arm(void*)bool fhandler_fifo::wait(void*)int __set_errno(const char*, int, int)virtual int fhandler_fifo::open(int, mode_t)cwcsdup would have returned NULL%s:%d setting errno %d/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler_floppy.ccfsys geometry: (%D units)*(%u sec)*(%u bps)disk geometry: (%D cyl)*(%u trk)*(%u sec)*(%u bps)partition info: offset %D length %Ddrive size: %DHDIO_GETGEOBLKGETSIZEBLKRRPARTBLKSSZGETDeviceIoControl (FSCTL_ALLOW_EXTENDED_DASD_IO) failed, %E%d (err %d) = ReadFile (%d, %d, to_read %d, read %d, 0)into bufferdirectlyread %d bytes from buffer (rest %d)read %d bytes from pos %U %sreturn -1, set errno to ENOSPCread %d bytes from pos %U directlyDeviceIoControl (FSCTL_LOCK_VOLUME) failed, %ENtQueryInformationFile(FilePositionInformation): %pDeviceIoControl(IOCTL_DISK_GET_DRIVE_LAYOUT_EX): %E%d %D->%D : %D->%D%dNtCreateFile(%W): %pDeviceIoControl (%W, FSCTL_LOCK_VOLUME) failed, %E%d (err %d) = WriteFile (%d, %d, write %d, written %d, 0)virtual int fhandler_dev_floppy::ioctl(unsigned int, void*)virtual _off64_t fhandler_dev_floppy::lseek(_off64_t, int)int __set_errno(const char*, int, int)virtual int fhandler_dev_floppy::raw_write(const void*, size_t)virtual void fhandler_dev_floppy::raw_read(void*, size_t&)virtual int fhandler_dev_floppy::open(int, mode_t)BOOL fhandler_dev_floppy::write_file(const void*, DWORD, DWORD*, int*)BOOL fhandler_dev_floppy::lock_partition(DWORD)BOOL fhandler_dev_floppy::read_file(void*, DWORD, DWORD*, int*)int fhandler_dev_floppy::get_drive_info(hd_geometry*)NtSetInformationFile (%X): %08x/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler_mailslot.ccherecwcsdup would have returned NULL%s:%d setting errno %dvirtual int fhandler_mailslot::ioctl(unsigned int, void*)virtual int fhandler_mailslot::open(int, mode_t)int __set_errno(const char*, int, int)virtual int fhandler_mailslot::fstat(__stat64*)%s:%d setting errno %d/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler_mem.cccwcsdup would have returned NULL%s is accessible under NT4/W2K/XP onlyNtQuerySystemInformation: status %p, %EMemSize: %d MBKMemSize: %d MBPortSize: 64 KBIllegal minor numbervirtual _off64_t fhandler_dev_mem::lseek(_off64_t, int)int __set_errno(const char*, int, int)virtual void fhandler_dev_mem::read(void*, size_t&)virtual ssize_t fhandler_dev_mem::write(const void*, size_t)virtual int fhandler_dev_mem::open(int, mode_t)WNetOpenEnumWnetEnumResource%d = readdir(%p, %p)fstat (%s)cwcsdup would have returned NULL%s:%d setting errno %d%d = fhandler_netdrive::open(%p, %d)virtual int fhandler_netdrive::open(int, mode_t)int __set_errno(const char*, int, int)virtual int fhandler_netdrive::readdir(DIR*, dirent*)virtual int fhandler_netdrive::fstat(__stat64*)cwcsdup would have returned NULL%s:%d setting errno %dvirtual int fhandler_nodevice::open(int, mode_t)int __set_errno(const char*, int, int)self/mountsgcc version 4.5.3 20110428 (Fedora Cygwin 4.5.3-4) (GCC) calimero.vinschen.decorinna%s version %s (%s@%s) (%s) %s %3d clipboard %3d windows nodev%s %s Character devices: %3d mem %3d cons %3d /dev/tty %3d /dev/console %3d /dev/ptmx %3d st %3d misc %3d sound %3d ttyS %3d tty Block devices: %3d fd %3d sd %3d sr %3d sd %3d sd %3d sd %3d sd %3d sd %3d sd %3d sd %U.%02u %U.%02u NtQuerySystemInformation(SystemTimeOfDayInformation), status %p%d%d = readdir(%p, %p) (%s)Filename Type Size Used Priority file%-40s%-16s%-8llu%-8llu%-8d NtQuerySystemInformation(SystemProcessorTimes), status %pcpu %U %U %U %U cpu%d %U %U %U %U NtQuerySystemInformation(SystemPerformanceInformation), status %p/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler_proc.ccpage %u %u swap %u %u intr %u ctxt %u btime %u NtOpenDirectoryObject, status %pHarddisk\Partition0NtOpenFile(%S), status %pDeviceIoControl (%S, IOCTL_DISK_GET_PARTITION_INFO{_EX}) %E%5d %5d %9U %s DeviceIoControl(%S, IOCTL_DISK_GET_DRIVE_LAYOUT{_EX}): %E\DeviceMemTotal: %10llu kB MemFree: %10llu kB HighTotal: 0 kB HighFree: 0 kB LowTotal: %10llu kB LowFree: %10llu kB SwapTotal: %10llu kB SwapFree: %10llu kB %u.%02u %u.%02u %u.%02u %u/%u noyes\Registry\Machine\HARDWARE\DESCRIPTION\System\CentralProcessor\%dSetThreadAffinityMask failed %EVendorIdentifierIdentifier~Mhzprocessor : %d vendor_id : %S identifier : %S cpu MHz : %u 386 processor - no cpuid486 processorprocessor supports CPUID instructionprocessor does not support CPUID instructionflags :GenuineIntelvendor_id : %s cpu family : %d model : %d model name : %s stepping : %d cpu MHz : %d cache size : %d KB physical id : %d core id : %d cpu cores : %d fpu : %s fpu_exception : %s cpuid level : %d wp : yes TLB size : %d 4K pages clflush size : %d cache_alignment : %d address sizes : %u bits physical, %u bits virtual cpu MHz : %d fpu : %s processor : %d AuthenticAMDcwcsdup would have returned NULL.%s:%d setting errno %d%d = fhandler_proc::open(%p, %d)fstat (%s)exists (%s)get_proc_fhandler(%s)/proc..cpuinfodevicesfilesystemsloadavgmeminfomiscmountsnetpartitionsregistryregistry32registry64selfstatswapssyssysvipcuptimeversionga@haChaaKha@aSha pa_haP agha aohaathaa{haha 0ahaha ha haahaahaahahahaahaa_off64_t format_proc_uptime(void*, char*&)_off64_t format_proc_stat(void*, char*&)_off64_t format_proc_partitions(void*, char*&)_off64_t format_proc_cpuinfo(void*, char*&)virtual int fhandler_proc::open(int, mode_t)int __set_errno(const char*, int, int)virtual int fhandler_proc::readdir(DIR*, dirent*)virtual int fhandler_proc::fstat(__stat64*)virtual virtual_ftype_t fhandler_proc::exists()static fh_devices fhandler_proc::get_proc_fhandler(const char*)%d %d%d = readdir(%p, %p) (%s)/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler_process.ccOpenProcess, %ENtQueryVirtualMemory: status %pNtQueryInformationProcess: status %p%ld %ld %ld %ld %ld %ld %ldrorw%d %d %d:%d / %s %s - %s %s %s %s %s %s %s %d %d %s exists (%s)pipe:[socket:[cwcsdup would have returned NULL.exe%s:%d setting errno %d.GaGaFaEaFa;Fa;Fa%d = fhandler_proc::open(%p, %d)NtQuerySystemInformation, %psptebstack%08lx-%08lx %s %08lx %04x:%04x %U [%s (tid %ld)[win heap %ld default noserial debug[shared-user-data][cygwin-shared][cygwin-user-shared][procinfo][heap]NtQuerySystemInformation: status %p, %luunknownName: %s State: %c (%s) Tgid: %d Pid: %d PPid: %d Uid: %d %d %d %d Gid: %d %d %d %d VmSize: %8d kB VmLck: %8d kB VmRSS: %8d kB VmData: %8d kB VmStk: %8d kB VmExe: %8d kB VmLib: %8d kB SigPnd: %016x SigBlk: %016x SigIgn: %016x %d (%s) %c %d %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %ld %ld %ld %ld %ld %ld %lu %lu %ld %luOpenProcess: ret %dNtQueryInformationProcess: status %p, %Eint get_process_state(DWORD)...cmdlinecttycwdexeexenamefdgidmapsmountinfomountspgidppidrootsidstatstatmstatusuidwinexenamewinpidsasasaP?asa>asa>asaAasaAasaGasa3asaLasa `>asa@>asa2asa2asa@9asaP2asa_asaP8ata[a ta2ata 4ata1avirtual bool fhandler_process::fill_filebuf()bool get_mem_values(DWORD, long unsigned int*, long unsigned int*, long unsigned int*, long unsigned int*, long unsigned int*, long unsigned int*)_off64_t format_process_stat(void*, char*&)thread_info::thread_info(DWORD, void*)_off64_t format_process_fd(void*, char*&)int __set_errno(const char*, int, int)virtual int fhandler_process::open(int, mode_t)virtual int fhandler_process::readdir(DIR*, dirent*)virtual int fhandler_process::fstat(__stat64*)virtual virtual_ftype_t fhandler_process::exists()sleepingrunningrunnablestoppedzombiexaqaqaqaqaqaqaqaqaqaqaxaqaqaxaxaxaqaqaqaqaqaxa%04x%02lx %02x %02x %02x %s %d = readdir(%p, %p) (%s)exists (%s)cwcsdup would have returned NULL%s:%d setting errno %d%d = fhandler_proc::open(%p, %d)...if_inet6yayazama@ virtual int fhandler_procnet::open(int, mode_t)int __set_errno(const char*, int, int)virtual int fhandler_procnet::readdir(DIR*, dirent*)virtual int fhandler_procnet::fstat(__stat64*)virtual virtual_ftype_t fhandler_procnet::exists()/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler_procsys.cc%d = readdir(%p, %p)cwcsdup would have returned NULLNtOpenDirectoryObject: %pNtOpenSymbolicLinkObject: %pNtOpenFile: %pNtQueryAttributesFile: %pNtQueryVolumeInformationFile: %pNtQueryInformationFile: %p%s:%d setting errno %d%d = fhandler_procsys::open(%p, %d)fstat (%s)aaaӈaÈaaaawawawa/proc/sys virtual int fhandler_procsys::open(int, mode_t)int __set_errno(const char*, int, int)virtual int fhandler_procsys::readdir(DIR*, dirent*)virtual int fhandler_procsys::fstat(__stat64*)virtual_ftype_t fhandler_procsys::exists(__stat64*) key shmid perms size cpid lpid nattch uid gid cuid cgid atime dtime ctime %10llu %10u %5o %10u %5d %5d %6u %5lu %5lu %5lu %5lu %10ld %10ld %10ld key semid perms nsems uid gid cuid cgid otime ctime %10llu %10u %5o %10d %5lu %5lu %5lu %5lu %10ld %10ld key msqid perms cbytes qnum lspid lrpid uid gid cuid cgid stime rtime ctime %10llu %10u %5o %11lu %10lu %5d %5d %5lu %5lu %5lu %5lu %10ld %10ld %10ld %d = readdir(%p, %p) (%s)exists (%s)cwcsdup would have returned NULL%s:%d setting errno %d%d = fhandler_proc::open(%p, %d)...msgsemshmuawazaa~apaaavirtual int fhandler_procsysvipc::open(int, mode_t)int __set_errno(const char*, int, int)virtual int fhandler_procsysvipc::readdir(DIR*, dirent*)virtual int fhandler_procsysvipc::fstat(__stat64*)virtual virtual_ftype_t fhandler_procsysvipc::exists()cwcsdup would have returned NULL%s:%d setting errno %dMicrosoft Base Cryptographic Provider v1.0%E = CryptAquireContext()%E = CryptGenRandom()/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler_random.ccvirtual _off64_t fhandler_dev_random::lseek(_off64_t, int)int __set_errno(const char*, int, int)virtual void fhandler_dev_random::read(void*, size_t&)virtual ssize_t fhandler_dev_random::write(const void*, size_t)bool fhandler_dev_random::crypt_gen_random(void*, size_t)/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler_raw.cc%s:%d setting errno %dherecwcsdup would have returned NULLvirtual int fhandler_dev_raw::open(int, mode_t)int __set_errno(const char*, int, int)virtual int fhandler_dev_raw::fstat(__stat64*)here/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler_registry.cc%val%d = closedir(%p)/proc/registry32/proc/registry64cwcsdup would have returned NULL.%s:%d setting errno %dexists (%s)/VirtualStore/MACHINE/SOFTWARE/Classes 0123456789%%%02xClasses/VirtualStore/MACHINE/SOFTWARE%d = readdir(%p, %p)%d = fhandler_registry::open(%p, %d)virtual int fhandler_registry::dup(fhandler_base*, int)virtual bool fhandler_registry::fill_filebuf()int __set_errno(const char*, int, int)..HKEY_CLASSES_ROOTHKEY_CURRENT_CONFIGHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_USERSHKEY_PERFORMANCE_DATAagaja|aaaaavirtual int fhandler_registry::open(int, mode_t)HKEY__* open_key(const char*, REGSAM, DWORD, bool)virtual int fhandler_registry::closedir(DIR*)aga@CostlyGlobalaaavirtual int fhandler_registry::readdir(DIR*, dirent*)virtual int fhandler_registry::fstat(__stat64*)virtual virtual_ftype_t fhandler_registry::exists()action %d0 = fhandler_serial:tcsendbreak (%d)error detected %x/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler_serial.cccwcsdup would have returned NULLInvalid tcflush queue %d%s:%d setting errno %dflushed file buffersInvalid t->c_ospeed %dInvalid t->c_cflag byte size %dSetCommState() failed, %Evtime %d, vmin %dReadTotalTimeoutConstant %d, ReadIntervalTimeout %d, ReadTotalTimeoutMultiplier %dSetCommTimeouts() failed, %EInvalid baud rate %dInvalid byte size %dvmin_ %d, vtime_ %dulen %d, vmin_ %d, vtime_ %d, hEvent %pWaitCommEvent succeeded: ev %xn %d, ev %xinq %dvtime_ %d, vmin_ %d, n %d, tot %derr %Eio_status.hEvent %p, close_on_exec %dio_status.hEvent %pfhandler_serial::open (%s, %p, %p)setting initial state on %s (reset_com %d)couldn't set initial state for %s, %E%p = fhandler_serial::open (%s, %p, %p)%d = ioctl(%p, %p)virtual void fhandler_serial::fixup_after_exec()virtual void fhandler_serial::fixup_after_fork(void*)virtual int fhandler_serial::tcgetattr(termios*)int __set_errno(const char*, int, int)virtual int fhandler_serial::tcsetattr(int, const termios*)virtual int fhandler_serial::tcflush(int)virtual int fhandler_serial::ioctl(unsigned int, void*)virtual int fhandler_serial::tcflow(int)virtual int fhandler_serial::tcsendbreak(int)virtual int fhandler_serial::open(int, mode_t)virtual ssize_t fhandler_serial::raw_write(const void*, size_t)virtual void fhandler_serial::raw_read(void*, size_t&)set close_on_exec for %s to %downer set to %dsocket:[%d]wsock_mtxwsock_evtWSASocket succeeded (%lx)WSADuplicateSocket succeeded (%lx)socket.%dCouldn't create/open shared socket mutex %S, %pWFSO failed for shared socket mutex, %ENo free socket slotcwcsdup would have returned NULL%s:%d setting errno %dstartedcancellednonerror in get_ifconfifr == NULLcmd not supported on this platform name: %stestname: %sAsync I/O on socket %ssocket is now %sblocking%d = ioctl_socket(%x, %x)/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler_socket.cc!%hu %c %08x-%08x-%08x-%08x%08x-%08x-%08x-%08xNtCreateMutant(%S), %pCreateEvent, %EWSAEventSelect, %E%d = fhandler_socket::close()Received eid credentials: pid: %d, uid: %d, gid: %dReceiving eid credentials failedReceived af_local secret: %08x-%08x-%08x-%08xReceiving af_local secret mismatchReceiving af_local secret failedSending eid credentials succeededSending eid credentials failedsucceededfailedSending af_local secret %saf_local_accept calledconnect from unauthorized clientaf_local_connect calledaccept from unauthorized serverAF_LOCAL: bind failedAF_LOCAL: getsockname failedAF_LOCAL: socket bound to port %u%s%u %c Setting delete dispostion failed, status = %p%d = setsockopt(SO_EXCLUSIVEADDRUSE), %Eres %dhereint fhandler_socket::getpeereid(pid_t*, __uid32_t*, __gid32_t*)int __set_errno(const char*, int, int)virtual void fhandler_socket::set_close_on_exec(bool)virtual int fhandler_socket::fcntl(int, void*)ioctlvirtual int fhandler_socket::ioctl(unsigned int, void*)virtual int fhandler_socket::close()closeshutdownssize_t fhandler_socket::send_internal(_WSAMSG*, int)send_internalrecv_internalgetpeernamegetsocknameint fhandler_socket::accept4(sockaddr*, int*, int)accept4cygheap_fdnew::cygheap_fdnew(int, bool)listenconnectbindint fhandler_socket::bind(const sockaddr*, int)virtual int fhandler_socket::facl(int, int, __aclent32_t*)virtual int fhandler_socket::fchown(__uid32_t, __gid32_t)virtual int fhandler_socket::fchmod(mode_t)virtual int fhandler_socket::fstatvfs(statvfs*)virtual int fhandler_socket::dup(fhandler_base*, int)virtual void fhandler_socket::fixup_after_fork(void*)fixup_after_forkvirtual int fhandler_socket::fixup_before_fork_exec(DWORD)fixup_before_fork_execinit_eventsbool fhandler_socket::init_events()wsa_event* search_wsa_event_slot(LONG)int fhandler_socket::af_local_accept()int fhandler_socket::af_local_connect()bool fhandler_socket::af_local_send_cred()bool fhandler_socket::af_local_recv_cred()bool fhandler_socket::af_local_send_secret()bool fhandler_socket::af_local_recv_secret()virtual int fhandler_socket::open(int, mode_t)int get_inet_addr(const sockaddr*, int, sockaddr_storage*, int*, int*, int*)mt_mtxmt_evtcwcsdup would have returned NULL%s:%d setting errno %d/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler_tape.ccdup(%s) failed, mutex handle %x, %Edup(%s) failed, event handle %x, %Elseek (%s, %d, %d)get_dp%s: Win32 error %dget_mpget_posset_posUoanana[napaoaqa[naoarewind in position 0openonetwoFormat tape with %s partition(s)partitionset_partitionwrite_markseraseprepareaaUa>aaawriteCreating event failed, %Ereadread %d bytes from buffer (rest %d)read %d bytes from tape (rest %d)read %d bytes from tape (one block)writing filemarkrewindingcloseset_compressionset_blocksizeset_optionsCouldn't relock drive after bus reset.ɤaaa{aNa(aaإaʥaaa}a:aaaaaaaa aaҦaaaxaKaaaϧaaإa3aataɤaaa{aNa(aaإaʥaaa}a:aaaaaaaa aaҦaaaxaKaaaϧaaإa3aataunit: %dbool fhandler_dev_tape::_lock(bool)int __set_errno(const char*, int, int)virtual int fhandler_dev_tape::dup(fhandler_base*, int)virtual int fhandler_dev_tape::fstat(__stat64*)virtual _off64_t fhandler_dev_tape::lseek(_off64_t, int)virtual ssize_t fhandler_dev_tape::raw_write(const void*, size_t)virtual void fhandler_dev_tape::raw_read(void*, size_t&)virtual int fhandler_dev_tape::open(int, mode_t)fhandler_dev_tape::fhandler_dev_tape()int mtinfo_drive::ioctl(void*, unsigned int, void*)int mtinfo_drive::error(const char*)int mtinfo_drive::create_partitions(void*, long int)int mtinfo_drive::close(void*, bool)int mtinfo_drive::open(void*)cwcsdup would have returned NULL%s:%d setting errno %d%s, pgid %d, sid %d, tsid %dchecking pgid %d, my sid %d, my parent %dchecking pid %d - has pgid %d ppid->pgid %d, ppid->sid %d%s, bg I/O pgid %d, tpgid %d, myctty %sclosed by masterprocess group is orphanedchar %cgot interrupt %d, sending signal %d  EOFEOLmyself->ctty %d, myself->sid %d, myself->pid %d, arg %d, tc()->getsid () %d int fhandler_termios::ioctl(int, void*)int __set_errno(const char*, int, int)virtual pid_t fhandler_termios::tcgetsid()virtual _off64_t fhandler_termios::lseek(_off64_t, int)line_edit_status fhandler_termios::line_edit(const char*, int, termios&)virtual bg_check_types fhandler_termios::bg_check(int)int tty_min::is_orphaned_process_group(int)virtual int fhandler_termios::tcgetpgrp()virtual int fhandler_termios::tcsetpgrp(pid_t)inherited%s %s, %susecount %dclosing masterpty%d <%p,%p> closingCloseHandle (input_mutex<%p>), %ECloseHandle (output_mutex<%p>), %ECloseHandle (get_handle ()<%p>), %ECloseHandle (get_output_handle ()<%p>), %Etcflush(%d) handle %p%d=tcflush(%d)duped masterclosedinherited masterWrite to %p failed, %Eopened pty master for pty%dcygtty.input.availduped slaveopened(%d): pty output_mutex(%p) releasedclosing last open %s handleCloseHandle (inuse), %ECloseHandle (input_available_event<%p>), %E(%d): pty output_mutex (%p): waiting %d ms(%d): pty output_mutex: acquiredall other handles closedsending EOF to slaveabout to write %d chars to slaveerror writing to pipe %p %Eto_slave pipe is fullSetting process group leader to %d since %W(%d) is not a cygwin processclosing from_master(%p)/to_master(%p) since we own them(%d)\\.\pipe\cygwin-%S-pty%d-master-ctlerror closing from_master %p, %Enot clearing: %d, master_pid %dcwcsdup would have returned NULL%s:%d setting errno %d/dev/pty%dpty%d, write(%x, %d)WriteFile failed, %E/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler_tty.ccopen output mutex failed, %Eopen input mutex failed, %Eopen input event failed, %Ecan't duplicate output, %Ecan't call master, %Eerror duplicating pipes, %Epty handles have been closed*** master is closedcygtty.output.mutexcygtty.input.mutexdup handles within myself.*** couldn't find pty masterdup handles directly since I'm the ownercan't duplicate input from %u/%p, %Edup handles via master control pipe %sduplicated from_master %p->%p from pty_ownerduplicated to_master %p->%p from pty_ownerPeekNamedPipe(%p) failed, %Eioctl (%x)bg ioctl pgid %d, tpgid %d, %s%d = ioctl(%x)read(%x, %d) handle %pwait catched signalwait timed out, time_to_wait %uwait for input event failed, %Ewait for mutex caught signalfailed to acquire input mutex after input event arrivedwait for input mutex failed, %Ereading %d bytes (vtime %d)read failed, %Esaw EOF%d=read(%x, %d)ReadFile failed, %Ebytes read %uinternal error: %d unexpected charactersreturning %dEnteredReadFile, %Eget_object_sd, %EImpersonateNamedPipeClient, %ENtOpenThreadToken, %pNtAccessCheck, %pRevertToSelf, %EOpenProcess, %EDuplicateHandle (from_master), %EDuplicateHandle (to_master), %EReply: from %p, to %p, error %luWriteFile, %EDisconnectNamedPipe, %ELeavingoutput pipepty master control pipecan't set output_handle(%p) to non-blocking modepty%d-to-masterptymthis %p, pty%d opened - from_pty %p, to_pty %ppty%d open failed - failed to create %s/dev/ptmxvirtual void fhandler_pty_master::fixup_after_fork(void*)bool fhandler_pty_master::setup()DWORD fhandler_pty_master::pty_master_thread()virtual void fhandler_pty_slave::fixup_after_fork(void*)virtual int fhandler_pty_master::ptsname_r(char*, size_t)int __set_errno(const char*, int, int)virtual int fhandler_pty_master::ioctl(unsigned int, void*)virtual int fhandler_pty_master::tcflush(int)virtual int fhandler_pty_master::close()virtual void fhandler_pty_master::cleanup()virtual int fhandler_pty_common::close()virtual _off64_t fhandler_pty_common::lseek(_off64_t, int)virtual void fhandler_pty_master::open_setup(int)virtual int fhandler_pty_slave::ioctl(unsigned int, void*)virtual int fhandler_pty_slave::tcflush(int)virtual int fhandler_pty_slave::tcsetattr(int, const termios*)virtual int fhandler_pty_master::dup(fhandler_base*, int)virtual int fhandler_pty_slave::dup(fhandler_base*, int)virtual void fhandler_pty_slave::read(void*, size_t&)virtual ssize_t fhandler_pty_slave::write(const void*, size_t)virtual int fhandler_pty_slave::init(void*, DWORD, mode_t)virtual int fhandler_pty_slave::close()virtual void fhandler_pty_slave::cleanup()virtual void fhandler_pty_slave::open_setup(int)virtual int fhandler_pty_slave::open(int, mode_t)int fhandler_pty_master::process_slave_output(char*, size_t, int)virtual bool fhandler_pty_master::hit_eof()virtual int fhandler_pty_master::accept_input()virtual void fhandler_pty_master::doecho(const void*, DWORD)bool bytes_available(DWORD&, void*)cwcsdup would have returned NULL%s:%d setting errno %d%p = opendir (%s)virtual int fhandler_virtual::fchown(__uid32_t, __gid32_t)int __set_errno(const char*, int, int)virtual int fhandler_virtual::fchmod(mode_t)virtual ssize_t fhandler_virtual::write(const void*, size_t)virtual void fhandler_virtual::read(void*, size_t&)virtual _off64_t fhandler_virtual::lseek(_off64_t, int)virtual DIR* fhandler_virtual::opendir(int)cygheap_fdnew::cygheap_fdnew(int, bool)hWnd_/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fhandler_windows.cccwcsdup would have returned NULL%s:%d setting errno %dvirtual int fhandler_windows::ioctl(unsigned int, void*)int __set_errno(const char*, int, int)virtual void fhandler_windows::read(void*, size_t&)%s:%d setting errno %dcwcsdup would have returned NULLvirtual ssize_t fhandler_dev_zero::write(const void*, size_t)int __set_errno(const char*, int, int)NtQueryObject: %p NtQuerySecurityObject: %pRtlAddAccessAllowedAce: %pNtSetSecurityObject: %plf_findoverlap: default splitlock != NULL/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/flock.cc%s:%d setting errno %dflock-%08x-%016XNtCreateDirectoryObject(inode): %pNtCreateMutant(inode): %plockf_guard%02x-%01x-%016X-%016X-%016X-%08x-%04xNtCreateEvent(lock): %pOpenProcess (%u): %EDuplicateHandle (lf_obj): %ECreateRemoteThread: %E@>a">a>a>av>aV>aAdding <%S> lock failedWarning, can't handle more than %d locks per file.Za\a\a[a[a\a%R = flock(%d, %d)%R = lockf(%d, %d, %D)int lockf(int, int, off_t)cygheap_fdget::cygheap_fdget(int, bool, bool)int __set_errno(const char*, int, int)int flock(int, int)virtual int fhandler_disk_file::lock(int, __flock64*)ULONG get_obj_handle_count(void*)void allow_others_to_sync()void lf_split(lockf_t*, lockf_t*, lockf_t**)void lockf_t::create_lock_obj()DWORD create_lock_in_parent(void*)lockf_t* inode_t::get_all_locks_list()signalled childsignalling parent: %sawakeWFSO timed out %sno problemsWFSO failed %s, fork_finished %p, %Eprefork: couldn't create pipe process tracker%Eprefork: couldn't set process pipe(%p) inherit state, %Eafter longjmploaded dllschild is running. pid %d, ppid %d, stack here %phParent %p, load_dlls %drecreate_shm areas after fork failedperformed fork fixup%s - hp %p low %p, high %p, res %d/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/fork.cc%s %s copy failed, %p..%p, done %d, windows pid %u, %Edone%s:%d setting errno %dimpurepriority class %dCONOUT$unable to allocate forker_finished eventstack - bottom %p, top %p, addr %p, guardsize %pCreateProcessW (%W, %W, 0, 0, 1, %p, 0, 0, %p, %p)forked process %u died unexpectedly, retry %d, exit code %dforked pid %uCreateProcessW failed for '%W'pinfo failedchild is alive (but stopped)stackpid %u, exitval %pcopying data/bss of a linked dlllinked dll bsslinked dll datacouldn't copy linked dll data/bssdied waiting for dll loadingcopying data/bss for a loaded dllloaded dll bssloaded dll datareturning -1enteringunable to allocate subproc_ready event, %Efork failed - child pid %d, errno %d%R = fork()stub calledbool child_copy(void*, bool, ...)readwriteaaint __set_errno(const char*, int, int)int vfork()int fork()int frok::parent(volatile char*)void resume_child(void*)int frok::child(volatile char*)void sync_with_parent(const char*, bool)...֜apaTaPaGa֜aa֜aPa֜a@a@a a@aPOSIXLY_CORRECTunknown option -- %coption requires an argument -- %cambiguous option -- %.*soption doesn't take an argument -- %.*soption requires an argument -- %sunknown option -- %sHOME\?*[]a.lnk a.exe a.dll 4a.com Ha.scr \a.sys paproc adeva\Device\PhysicalMemory,.a\??\ a\??\UNC\amtxaCSC-CACHE aFAT<aMVFS LaNFS`aNTFS paReFS aSUNWNFSaUDFaUNIXFS aNWFS aNcFsd a\??\Volume{a\\?\PIPE\ a\\.\GLOBALROOT<aFortunately, I keep my feathers numbered for just such an emergencyLpglock%s:%d setting errno %d\etc\grouppasswd/group_GID_clash(%lu/%lu)%s:%s:%lu:%sCompleting /etc/group: %s%lu = NtQueryInformationToken(NULL) %puser != NULL/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/grp.cc%d = initgroups(%s, %u)ngroups != NULL%d = getgrouplist(%s, %u, %p, %d)setgroups32 (%d)No sid found for gid %dint setgroups32(int, const __gid32_t*)int __set_errno(const char*, int, int)int getgrouplist(const char*, gid_t, gid_t*, int*)int get_groups(const char*, gid_t, cygsidlist&)int initgroups32(const char*, __gid32_t)int getgroups(int, __gid16_t*)int internal_getgroups(int, __gid32_t*, cygpsid*)void pwdgrp::read_group()unable to allocate heap, heap_chunk_size %p, %Ecouldn't allocate heap, %E, base %p, top %p, reserve_size %d, allocsize %d, page_const %dheap allocated at wrong address %p (mapped) != %p (expected)MEM_COMMIT failed, %Eheap base %p, heap top %p, heap size %p (%u)%s:%d setting errno %dvoid* sbrk(int)int __set_errno(const char*, int, int)void heap_init()?found itcygwin1.dll_%s%sLD_PRELOAD: /home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/hookapi.ccerror while loading shared libraries: %s: cannot open shared object file: %sNOTUSED6432qaya|a%s:%d setting errno %dioctl(fd %d, cmd %p)%R = ioctl(%d, %p, ...)int ioctl(int, int, ...)cygheap_fdget::cygheap_fdget(int, bool, bool)int __set_errno(const char*, int, int)localtimeposixrules%d:%d,M%d.%d.%d/%dtzset_guardTZmn(%p), called by %p(%d) = %x, called by %p(%x, %d) = %x, called by %x(%d, %d) = %x, called by %x%s:%d setting errno %dmallockusing internal mallocusing external mallocvoid __set_ENOMEM()int __set_errno(const char*, int, int)void malloc_init()mallinfo mallinfo()void malloc_stats()int mallopt(int, int)int malloc_trim(size_t)size_t malloc_usable_size(void*)void* valloc(size_t)void* memalign(size_t, size_t)void* calloc(size_t, size_t)void* realloc(void*, size_t)void* malloc(size_t)void free(void*)server "%s" no space for server "%s" DnsQuery: %lu (Windows) Unknown code %lu for %s %d %s Section %d Type %u Windows Record Length %u Unexpected section order %s %d Null byte count has an unexpected value No structure for wType %d ?aEadEadEadEadEa8DadEadEadEaCaCadEaBapBaFaBapBaFaBaBaFa?a?a?a?a?a?a?a?a?a?a?aEaTcpip\ParametersNameServerDhcpNameServerSearchListusing dnsapi.dll GetNetworkParams: error %lu (Windows) GetNetworkParams: OK key %s RtlCheckRegistryKey: status %p RtlQueryRegistryValues: status %p getdomainname "%s" Minires: read: %s read %d out of %d OKr/etc/resolv.conf/etc/resolv.conf: %s resolv.conf %snameserverinvalid server "%s" no space for server "%s" server "%s" searchdomaindomain|search "%s" no space for "%s" optionsdebug%s: 1 inet6osqueryretryattempts%s: %d retranstimeoutunknown option: "%s" search "%s" no dns server found close sockfd %d: %s opening UDP socket socket(UDP): %s fcntl: %s bind: %s Flushed %d bytes Unexpected errno for flushing recvfrom: %ssendto: server %08x sockfd %d %s timeout for server %08x select: %s recvfrom: %s recvfrom: %d bytes from %08x retrying with TCP socket(TCP): %s connect: %s write: %s unexpected answer too many retries "%s" invalid or buffer too short query "%s" type %d search "%s" type %d name too long during search querydomain: name too long %s:%d setting errno %dssize_t check_iovec(const iovec*, int, bool)int __set_errno(const char*, int, int)%s:%d setting errno %d/dev/urandom0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzint _gettemp(char*, int*, int, size_t, int)int __set_errno(const char*, int, int)%p (status %p) = NtMapViewOfSection (h:%x, addr:%x, len:%u, off:%X, protect:%x, type:%x)%s:%d setting errno %dWarning: VirtualProtect (addr: %p, len: 0x%x, new_prot: 0x%x, old_prot: 0x%x), %Emap_pages (fd=%d, off=%D, len=%u)/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/mmap.ccmap_pages (addr=%x, len=%u)VirtualFree in unmap_pages () failed, %EVirtualProtect in unmap_pages () failed, %Emmap_guardaddr %x, len %u, prot %x, flags %x, fd %d, off %Dconftest.txtWarning: Mapping beyond EOF failed, %E%p = mmap() munmap (addr %x, len %u)0 = munmap(): %xmsync (addr: %p, len %u, flags %x)%R = msync()mprotect (addr: %p, len %u, prot %x)%R = mprotect ()%R = mlock(%p, %u)%R = munlock(%p, %u)%d = posix_madvise(%p, %u, %d)VirtualAlloc: address shift with MAP_FIXED givenCreateMapping failed with %EMapView: address shift with MAP_FIXED givenrequested %p != %p mem alloc base %p, state %p, size %d, %E-1 = mmap(): illegal parameter, set EINVAL-1 = mmap(): NtOpenSection failed with %Efd %d, h 0x%x, address %p, len 0x%x, prot: 0x%x, flags: 0x%x, offset %XWarning: Fixup mapping beyond EOF failedVirtualQueryEx failed for MAP_PRIVATE address %p, %EVirtualAlloc failed for MAP_PRIVATE address %p, %EVirtualProtectEx failed for MAP_PRIVATE address %p, %EReadProcessMemory failed for MAP_PRIVATE address %p, %EWARNING: VirtualProtectEx to return to PAGE_NOACCESS state in parent failed for MAP_PRIVATE address %p, %EVirtualProtect failed for address %p, parentstate: 0x%x, state: 0x%x, parentprot: 0x%x, prot: 0x%x, %Esucceededint fixup_mmaps_after_fork(void*)virtual bool fhandler_dev_mem::fixup_mmap_after_fork(void*, int, int, _off64_t, DWORD, void*)void* MapView(void*, void*, size_t, DWORD, int, int, _off64_t)virtual void* fhandler_dev_mem::mmap(char**, size_t, int, int, _off64_t)int __set_errno(const char*, int, int)virtual bool fhandler_disk_file::fixup_mmap_after_fork(void*, int, int, _off64_t, DWORD, void*)virtual void* fhandler_disk_file::mmap(char**, size_t, int, int, _off64_t)virtual bool fhandler_dev_zero::fixup_mmap_after_fork(void*, int, int, _off64_t, DWORD, void*)virtual void* fhandler_dev_zero::mmap(char**, size_t, int, int, _off64_t)virtual bool fhandler_base::fixup_mmap_after_fork(void*, int, int, _off64_t, DWORD, void*)virtual int fhandler_base::msync(void*, char*, size_t, int)virtual int fhandler_base::munmap(void*, char*, size_t)virtual void* fhandler_base::mmap(char**, size_t, int, int, _off64_t)int posix_madvise(void*, size_t, int)int munlock(const void*, size_t)int mlock(const void*, size_t)int mprotect(void*, size_t, int)int msync(void*, size_t, int)int munmap(void*, size_t)void* mmap64(void*, size_t, int, int, int, _off64_t)cygheap_fdget::cygheap_fdget(int, bool, bool)char* mmap_list::try_map(void*, size_t, int, _off64_t)bool mmap_record::unmap_pages(char*, DWORD)bool mmap_record::map_pages(char*, DWORD)_off64_t mmap_record::map_pages(_off64_t, DWORD)void mmap_record::init_page_map(mmap_record&)msgctl (msqid = %d, cmd = 0x%x, buf = %p)-1 [%d] = msgctl ()%s:%d setting errno %dmsgget (key = %U, msgflg = 0x%x)-1 [%d] = msgget ()msgrcv (msqid = %d, msgp = %p, msgsz = %d, msgtyp = %d, msgflg = 0x%x)-1 [%d] = msgrcv ()msgsnd (msqid = %d, msgp = %p, msgsz = %d, msgflg = 0x%x)-1 [%d] = msgsnd ()int msgsnd(int, const void*, size_t, int)int __set_errno(const char*, int, int)ssize_t msgrcv(int, void*, size_t, long int, int)int msgget(key_t, int)int msgctl(int, int, msqid_ds*)flags: text (%p)flags: binary (%p)%s:%d setting errno %dCannot access path %S, status %08lxCannot get volume attributes (%S), %08lxunknown\%c:\%s%csrc '%s', dst '%s'/conv_to_win32_path (%s)attempt to access outside of chroot '%s - %s'src_path %s, dst %s, flags %p, rc %dadd-slashno-add-slashno-keep-relkeep-relconv_to_posix_path (%s, %s, %s)ENAMETOOLONG%s = conv_to_posix_path (%s)%d = conv_to_posix_path(%s)\\?\invalid fstab option - '%s'binmodetextmode\/:\%s[%s], %s[%s], %p/usr/bin/usr/lib\040cygdrive.d\Try to read mounts from %WNtOpenFile(%S) failed, %p%W: Line %d too long, skipping...*native_root != '\0'/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/mount.ccadd_item ("%s", "/", ...) failed, errno %d\etc\fstabroot_idx %d, user_shared magic %p, nmounts %d\:%R = mount(%s, %s, %p)%R = cygwin_umount(%s, %d)\Device\CdRomFloppyHarddiskLanmanRedirector\MRxNfs\B a a a a a a a a a a aA:B:%s%c%s%c%s%c%sFindFirstVolumeW, %EUnable to determine the native mapping for %ls (error %lu)\Device\Mup\fsi_lockaclautobinarybindcygexecdosexecihashnoaclnosuidnotexecnouseroverrideposix=0posix=1textusernonevfatntfssmbfsnfsnetappiso9660udfcsc-cachesunwnfsunixfsmvfscifsnwfsncfsddos_drive_mappings::dos_drive_mappings()int cygwin_umount(const char*, unsigned int)int umount(const char*)int __set_errno(const char*, int, int)int mount(const char*, const char*, unsigned int)int mount_info::del_item(const char*, unsigned int)int mount_info::add_item(const char*, const char*, unsigned int)int mount_info::write_cygdrive_info(const char*, unsigned int)bool mount_info::from_fstab(bool, WCHAR*, WCHAR*)bool fstab_read_flags(char**, unsigned int&, bool)int mount_info::conv_to_posix_path(const char*, char*, int)int mount_info::cygdrive_win32_path(const char*, char*, int&)int mount_info::conv_to_win32_path(const char*, char*, device&, unsigned int*)void set_flags(unsigned int*, unsigned int)void mount_info::create_root_entry(WCHAR*)bool fs_info::update(_UNICODE_STRING*, void*)freeaddrinfogetaddrinfogetnameinfoklog_guardws2_32.dllwship6.dllTcpip\Parameters\Interfaces\EnableDHCPIPAddressDhcpIPAddressDhcpSubnetMaskSubnetMasktokethpppslp%s%u:%u%s%u%s:%d setting errno %d%s:%d - winsock error %d -> errno %dprotoold %sent structure "%s" %p duping %sent "%s", %pprotoent %s %x %x(dp - (char *) dst) == sz/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/net.ccduped %sent "%s", %pLSP handle: %pWSAIoctl: %lu Potential BLODA detected! Layered Socket Service Provider: %s DuplicateHandle failed, %Efd %d, name '%s', soc %psetsockopt(SO_RCVBUF) failed, %lugetsockopt(SO_RCVBUF) failed, %lusetsockopt(SO_SNDBUF) failed, %lugetsockopt(SO_SNDBUF) failed, %lusocket (%d, %d (flags %p), %d)Reset SIO_UDP_CONNRESET: WinSock error %lu%R = socket(%d, %d (flags %p), %d)%R = sendto(%d, %p, %d, %x, %p, %d)%R = recvfrom(%d, %p, %d, %x, %p, %p)setsockopt optval=%xFaked IP_TOS success%R = setsockopt(%d, %d, %x, %p, %d)WinSock SO_ERROR = %d%R = getsockopt(%d, %d, 0x%x, %p, %p)%R = connect(%d, %p, %d)serv%p = getservbyname (%s, %s)%p = getservbyport (%d, %s)name %s%u.%u.%u.%u%chosth_name %sdup_ent returned NULL for name %s, h %p%R = accept(%d, %p, %p)%R = accept4(%d, %p, %p, %p)%R = bind(%d, %p, %d)%R =getsockname (%d, %p, %p)%R = listen(%d, %d)%R = shutdown(%d, %d)Unknown resolver error: %R = getpeername(%d) %d%R = recv(%d, %p, %d, %x)%R = send(%d, %p, %d, %x)CreateThread: %E%s:%ufirst socket call failedbind failedgetsockname errorsecond socket call failedconnect erroraccept error%R = socketpair(...)%R = recvmsg(%d, %p, %x)%R = sendmsg(%d, %p, %x)%xlocalhost0.0.0.0tcpudp%dUnknown errorcygwin_getnameinfoSuccessAddress family for hostname not supportedTemporary failure in name resolutionInvalid value for ai_flagsNon-recoverable failure in name resolutionai_family not supportedMemory allocation failureNo address associated with hostnamehostname nor servname provided, or not knownservname not supported for ai_socktypeai_socktype not supportedSystem error returned in errnoInvalid value for hintsResolved protocol is unknownAn argument buffer overflowedaa*a&'9a*Ta?'aa*a*a}'a<'/aLakaa'a0123456789%u.%u.%u.%u0123456789ABCDEF0123456789abcdefint cygwin_sendmsg(int, const msghdr*, int)fhandler_socket* get(int)cygheap_fdget::cygheap_fdget(int, bool, bool)int __set_errno(const char*, int, int)int cygwin_recvmsg(int, msghdr*, int)socketpairint socketpair(int, int, int, int*)cygheap_fdnew::cygheap_fdnew(int, bool)int cygwin_bindresvport_sa(int, sockaddr*)if_nameindex* if_nameindex()char* if_indextoname(unsigned int, char*)int get_ifconf(ifconf*, int)int getifaddrs(ifaddrs**)bool get_adapters_addresses(_IP_ADAPTER_ADDRESSES**, ULONG)int cygwin_send(int, const void*, size_t, int)int cygwin_recv(int, void*, size_t, int)int cygwin_getpeername(int, sockaddr*, socklen_t*)Unknown hostHost name lookup failureUnknown server errorNo address associated with nameint cygwin_shutdown(int, int)int cygwin_listen(int, int)int cygwin_getsockname(int, sockaddr*, socklen_t*)int cygwin_bind(int, const sockaddr*, socklen_t)int accept4(int, sockaddr*, socklen_t*, int)int cygwin_accept(int, sockaddr*, socklen_t*)hostent* gethostbyname2(const char*, int)hostent* gethostby_helper(const char*, int, int, int, int)hostent* cygwin_gethostbyaddr(const char*, int, int)dup_entvoid* dup_ent(unionent*&, unionent*, unionent::struct_type)hostent* cygwin_gethostbyname(const char*)int cygwin_gethostname(char*, size_t)cygwin_gethostnameservent* cygwin_getservbyport(int, const char*)servent* cygwin_getservbyname(const char*, const char*)int cygwin_connect(int, const sockaddr*, socklen_t)int cygwin_getsockopt(int, int, int, void*, socklen_t*)cygwin_getsockopt WSAEINTRWSAEWOULDBLOCKWSAEINPROGRESSWSAEALREADYWSAENOTSOCKWSAEDESTADDRREQWSAEMSGSIZEWSAEPROTOTYPEWSAENOPROTOOPTWSAEPROTONOSUPPORTWSAESOCKTNOSUPPORTWSAEOPNOTSUPPWSAEPFNOSUPPORTWSAEAFNOSUPPORTWSAEADDRINUSEWSAEADDRNOTAVAILWSAENETDOWNWSAENETUNREACHWSAENETRESETWSAECONNABORTEDWSAECONNRESETWSAENOBUFSWSAEISCONNWSAENOTCONNWSAESHUTDOWNWSAETOOMANYREFSWSAETIMEDOUTWSAECONNREFUSEDWSAELOOPWSAENAMETOOLONGWSAEHOSTDOWNWSAEHOSTUNREACHWSAENOTEMPTYWSAEPROCLIMWSAEUSERSWSAEDQUOTWSAESTALEWSAEREMOTEWSAEINVALWSAEFAULTNOERRORcygwin_setsockoptint cygwin_setsockopt(int, int, int, const void*, socklen_t)int cygwin_recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*)int cygwin_sendto(int, const void*, size_t, int, const sockaddr*, socklen_t)cygwin_socketint cygwin_socket(int, int, int)bool fdsock(cygheap_fdmanip&, const device*, SOCKET)bool cygheap_fdmanip::isopen() constvoid __set_winsock_errno(const char*, int)Resolver internal errorResolver error 0 (no error)aarthandle to netdb file %s: %pnew alias alloc %paliases alloc %p*current entry strdup %pline fragment allocated %pconcatenated line allocated %pservicessetservent (%d)#%p = getservent()sep->s_name strdup %psep->s_proto strdup %pendservent ()protocolsetprotoent (%d)%p = getprotoent()pep->p_name strdup %pendprotoent ()void cygwin_endprotoent()protoent* cygwin_getprotoent()FILE* open_system_file(const char*) bool parse_protocol_line(FILE*, protoent*)void parse_alias_list(char***, char**)char* get_entire_line(FILE*)void cygwin_setprotoent(int)void cygwin_endservent()servent* cygwin_getservent()bool parse_services_line(FILE*, servent*)void cygwin_setservent(int)9 a a a a a9 a a9 a a9 a a a a aLCID=0x%04xCsr-sr-Cyrl-CS@latinuz-@cyrillicsr_edaAyyyYmmbBlIkH a a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a a9 a a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a a9 a9 a9 a9 a a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a9 a a9 a9 a a a9 a9 a9 a9 a a9 a9 a9 a9 a9 a a a9 a9 a9 a9 a admmdASCII@cjknarrow%s:%d setting errno %dCP874EUCJPGB2312EUCKRBIG5ISO-8859-1CP1251UTF-8ISO-8859-7ISO-8859-8ISO-8859-6ISO-8859-13ISO-8859-3ISO-8859-2ISO-8859-5KOI8-UISO-8859-14ISO-8859-15ISO-8859-9PT154GEORGIAN-PS@iqtelif@euroEURrt/usr/share/locale/locale.aliascjknarrow PATHCygwin charset changed from %s to %svoid internal_setlocale()LCID __get_lcid_from_locale(const char*)bs_BAnn_NOno_NOsr_BAsr_CSsr_MEsr_RSsr_SP)a/a5a;aAa Ga Ma Sa az-AZaz-Latn-AZbs-BAbs-Latn-BAha-NGha-Latn-NGiu-CAiu-Latn-CAmn-CNmn-Mong-CNno-NOnb-NOsr-BAsr-Cyrl-BAsr-CSsr-MEsr-Cyrl-MEsr-RSsr-Cyrl-RStg-TJtg-Cyrl-TJtzm-DZtzm-Latn-DZuz-UZuz-Latn-UZaaaaaaaaaa4a:aFaLabaTahanaaaaaaaaasize_t strxfrm(char*, const char*, size_t)int __set_errno(const char*, int, int)size_t wcsxfrm(wchar_t*, const wchar_t*, size_t)int strcoll(const char*, const char*)int wcscoll(const wchar_t*, const wchar_t*)aa_DJ^[oOyY].*^[mnMN].*aa_ER^[yY].*aa_ER@saahoaa_ETaf_ZA^[jJyY]^[nN]am_ET^[nN].*an_ES^[sSyY].*ar_AE^[FyY].*^[DnN].*F9ED'ar_BHar_DZar_EGar_INar_IQar_JOar_KWar_LBar_LYar_MAar_OMar_QAar_SAar_SDar_SYar_TNar_YEas_IN^[yY ].*^[nN ].* ast_ESaz_AZ^[Bb].*^[YyNn].*bYliyoxbe_BY^["BYy].*^[=Nn].*be_BY@latin^[TtYy].*^[Nn].*bem_ZM^[yYeE].*^[nNaA].*ber_DZber_MAbg_BG^[+14DdYyOo].*^[-0=NnKk].*bn_BD^[ yY]^[ nN] bn_INbo_CN^[hYy].*^[XNn].*hrSXzSbo_INbr_FRbr_FR@euro^[dDyY]*.^[nN]*.byn_ERca_ADca_ESca_ES@euroca_FRca_ITcrh_UA^[yYeE]^[nNhH]ebethay1rcs_CZ^[aAyY].*anonecsb_PL^[JjTtYy].*cv_RUcy_GB^[iItTyY].*ienada_DK^[1JjYy].*^[0Nn].*de_AT^[jJyY].*de_AT@eurode_BEde_BE@eurode_CHde_DEde_DE@eurode_LUde_LU@eurodv_MVdz_BTel_CY^[yY].*^[nN].*el_GRen_AGen_AUen_BW^[yY]en_CA^[yYoO].*en_DK^[1JjsSyYoO].*^[0nN].*en_GBen_HKYesNoen_IEen_IE@euroen_INen_NGen_NZen_PHen_SGen_USen_ZAen_ZMen_ZWes_ARes_BOes_CLes_COes_CRes_DOes_ECes_ESes_ES@euroes_GTes_HNes_MXes_NIes_PAes_PEes_PRes_PYes_SVes_USes_UYes_VEet_EE^[JjYy].*^[EeNn].*eu_ES^[bBsSyY].*^[eEnN].*eu_ES@eurofa_IR^[yY"(Hf].*^[nN.Fok].*ff_SNfi_FI^[KkJjYy].*^[NnEe].*fi_FI@eurofil_PH[oOyY].*[hHnN].*oohindifo_FOfr_BE^[oOjJyY1].*^[nN0].*fr_BE@eurofr_CAfr_CH^[OojJsSyY].*fr_FRfr_FR@eurofr_LUfr_LU@eurofur_IT^[sSjJoOyY].*fy_DEfy_NLga_IE^[tTyY].*ga_IE@eurogd_GBgez_ERgez_ER@abegedegez_ETgez_ET@abegedegl_ESgl_ES@eurogu_IN^[yY ]^[nN ]gv_GBha_NG^[TtiIYy].*^[bBaAnN].*TohBabuhe_IL^[Yy].*^[Nn].*hi_INhne_IN^[9 5 yY]^[(  nN]9 5 (  hr_HR^[dDyY].*hsb_DE^[hHyY].*hajnht_HT^[ooyy].*^[nn].*hu_HU^[IiYy].*hy_AM^[yYsSa1]^[nNxH]auxxyid_ID^[tTnN].*ig_NG^[EeIiYy].*^[0MmNn].*EeMbaik_CA[yYiIaA].*[nNqQ].*aaqaaais_ISit_CHit_ITit_IT@euroiu_CA[yYsS].*[nN].*iw_ILja_JP^([yYY9]|o0D0|00)^([nNN.]|D0D0H0|000)o0D0D0D0H0ka_GE^[1yYkKxX].*^[0nNaA].*kk_KZ^[8Yy].*^[6Nn].*kl_GL^[JjYyAa].*km_KH^[yY]([eE][sS])?^[nN][oO]?yes:YES:y:Yno:NO:n:Nkn_INko_KR^[yY]^[nND]DȲ$kok_IN^(9 / |[yY])^(( M 9 @ |[nN])ks_IN^["yY].*^[FnN].*"F9ks_IN@devanagariku_TR^[eEdDyY].*ernkw_GB^[eEyY].*ky_KG^[>Yy].*>10>:lb_LUlg_UGli_BEli_NLlij_ITlo_LA^[yY]^[nN]lt_LTlv_LVmai_INmg_MGmhr_RU^[#CNn].*mi_NZ^[1yYaA].*^[0nNkK].*ekoremk_MK^[4DdYy1].*^[=Nn0].*40=5ml_IN^[ $ F yY]^[ 2 M 2 nN] $ F  2 M 2 mn_MN^[B"yY].*^[nN].*mr_IN^(Yes|[yY])^(No|[nN])ms_MY^[tT]YaTidakmt_MTmy_MM^[yY].*^[nN].*/::/:08nan_TW@latin^[sS].*^[mM].*S+M-S+nb_NOnds_DEnds_NLne_NPnl_AWnl_BEnl_BE@euronl_NLnl_NL@euronr_ZAnso_ZA^[nNaA]oc_FR^[oOsSyY].*om_ETom_KEor_INos_RU^[#4Yy].*^[C=Nn].*pa_INpa_PK^[yYG(f].*^[nNFo].*(DCDFGJpap_ANpl_PLps_AF^[yY(f].*^[nN.Fo].*pt_BR^[SsyY].*pt_PTpt_PT@euroro_RO^[DdYy].*ru_RU^[4Yy].*ru_UArw_RW^[nNoO]sa_INsc_ITsd_INsd_IN@devanagarise_NO^[Ii].*shs_CAsi_LK^[ Yy]^[ Nn] sid_ETsk_SK^[aAyY].*noniesl_SI^[YyJj].*so_DJso_ETso_KEso_SOsq_AL^[yYpP].*^[nNjJ].*sq_MK^[4DdYy]^[=Nn]sr_CS@latin^[dDyY]sr_ME@latinsr_RS@latinsr_SP@latinss_ZAst_ZAsv_FIsv_FI@eurosv_SEsw_KE^[nNyY].*^[hHlL].*sw_TZta_IN^[ yY]^[ nN] te_IN^[yY ].*^[nN ].* 5 ( A  > & A tg_TJ^[%E4Yy].*=5Bth_TH^[yY ]^[nN!]C HD!HC Hti_ERti_ETtig_ERtk_TM^[hH].*^[nN].*hawaoktl_PHtn_ZAtr_CYevettr_TRts_ZAtt_RU95.:tt_RU@iqtelif^[Ee].*eyyuqug_CNyesnouk_UA^([Yy+]|["B][0][:]?)$^([Nn-]|[=][V])$B0:=Vur_PKuz_UZuz_UZ@cyrillic^[Yy].*^[9Nn].*0^ve_ZAvi_VN^[1yYcC].*CKhngwa_BE^[oOyYaAwW].*OyiNeniwa_BE@eurowae_CHJaNeiwo_SN^[wWyY].*^[dDnN].*xh_ZAyi_US^[Yy].*^[Nn].*yo_NG^[EeyY].*^[rROoKkNn].*B niB kyue_HKzh_CN^[yY/f]^[nN N&T]zh_HKzh_SGzh_TWzu_ZA^[nNcC]+ %A %Oe %B %Oy  3'9* %OH:%OM:%OS (%Z), %Oy/%Om/%Od+ %A %Oe %B %Oy  %OH:%OM:%OS, %OH:%OM:%OS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;%Yt^ %b %ee %A %H:%M:%S %Z%Yt^%mg%de%Yt^%mg%de %HBf%MR%Sy%HBf%MR%Sy%p%IBf%MR%Sy+:2:1990/01/01:+*:s^b:%EC%Eyt^;+:1:1989/01/08:1989/12/31:s^b:%ECCQt^;+:2:1927/01/01:1989/01/07:-fT:%EC%Eyt^;+:1:1926/12/25:1926/12/31:-fT:%ECCQt^;+:2:1913/01/01:1926/12/24:'Yck:%EC%Eyt^;+:1:1912/07/30:1912/12/31:'Yck:%ECCQt^;+:6:1873/01/01:1912/07/29:fl:%EC%Eyt^;+:1:0001/01/01:1872/12/31:f:%EC%Eyt^;+:1:-0001/12/31:-*:}CQMR:%EC%Eyt^%EY%mg%de%EY%mg%de %HBf%MR%Sy0;N;N; N;V;N;mQ;N;kQ;]N;AS;ASN;ASN;AS N;ASV;ASN;ASmQ;ASN;ASkQ;AS]N;NAS;NASN;NASN;NAS N;NASV;NASN;NASmQ;NASN;NASkQ;NAS]N; NAS; NASN; NASN; NAS N; NASV; NASN; NASmQ; NASN; NASkQ; NAS]N;VAS;VASN;VASN;VAS N;VASV;VASN;VASmQ;VASN;VASkQ;VAS]N;NAS;NASN;NASN;NAS N;NASV;NASN;NASmQ;NASN;NASkQ;NAS]N;mQAS;mQASN;mQASN;mQAS N;mQASV;mQASN;mQASmQ;mQASN;mQASkQ;mQAS]N;NAS;NASN;NASN;NAS N;NASV;NASN;NASmQ;NASN;NASkQ;NAS]N;kQAS;kQASN;kQASN;kQAS N;kQASV;kQASN;kQASmQ;kQASN;kQASkQ;kQAS]N;]NAS;]NASN;]NASN;]NAS N;]NASV;]NASN;]NASmQ;]NASN;]NASkQ;]NAS]N%a %e %b %Ey %H:%M:%S %Z%d/%m/%Ey%a %e %b %Ey, %H:%M:%S%H:%M:%S%I:%M:%S %p+:1:-543/01/01:+*:..:%EC %Ey%e %b %Ey%A %e %B %EC %Ey, %H.%M.%S .%H.%M.%S .%a %b %e %H:%M:%S %Z %Y%OC%Oy %b %Od %A%OC%Oy %b %Od %A %OI:%OM:%OS %Op %Z%OI:%OM:%OS %p@@;@A;@B;@C;@D;@E;@F;@G;@H;@I;A@;AA;AB;AC;AD;AE;AF;AG;AH;AI;B@;BA;BB;BC;BD;BE;BF;BG;BH;BI;C@;CA;CB;CC;CD;CE;CF;CG;CH;CI;D@;DA;DB;DC;DD;DE;DF;DG;DH;DI;E@;EA;EB;EC;ED;EE;EF;EG;EH;EI;F@;FA;FB;FC;FD;FE;FF;FG;FH;FI;G@;GA;GB;GC;GD;GE;GF;GG;GH;GI;H@;HA;HB;HC;HD;HE;HF;HG;HH;HI;I@;IA;IB;IC;ID;IE;IF;IG;IH;II%Od-%Om-%Oy%Oe %B %Oy %OI:%OM:%OS %p %Zf ;g ;h ;i ;j ;k ;l ;m ;n ;o ;g f ;g g ;g h ;g i ;g j ;g k ;g l ;g m ;g n ;g o ;h f ;h g ;h h ;h i ;h j ;h k ;h l ;h m ;h n ;h o ;i f ;i g ;i h ;i i ;i j ;i k ;i l ;i m ;i n ;i o ;j f ;j g ;j h ;j i ;j j ;j k ;j l ;j m ;j n ;j o ;k f ;k g ;k h ;k i ;k j ;k k ;k l ;k m ;k n ;k o ;l f ;l g ;l h ;l i ;l j ;l k ;l l ;l m ;l n ;l o ;m f ;m g ;m h ;m i ;m j ;m k ;m l ;m m ;m n ;m o ;n f ;n g ;n h ;n i ;n j ;n k ;n l ;n m ;n n ;n o ;o f ;o g ;o h ;o i ;o j ;o k ;o l ;o m ;o n ;o o +:1:-543/01/01:+*:.(.:%EC %Ey'1%A5H %e %B %EC %Ey, %H.%M.%S .%H.%M.%S .%A, %-d %Om %Y %X %z%d.%m.%y%a, %d-%b-%Y %X %z%T0;AVG=O;;NB>3>;15@57=O;:2VB=O;B@02=O;G5@2=O;;8?=O;A5@?=O;25@5A=O;6>2B=O;;8AB>?040;3@C4=Ogot %d error from path_conv%s:%d setting errno %dread_ea (%S, %s, %p, %lu)/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/ntea.ccuser.%d = read_ea(%S, %s, %p, %lu)write_ea (%S, %s, %p, %lu, %d)%d = write_ea(%S, %s, %p, %lu, %d)cygheap_fdget::cygheap_fdget(int, bool, bool)int __set_errno(const char*, int, int)int setxattr_worker(path_conv&, const char*, const void*, size_t, int)int fsetxattr(int, const char*, const void*, size_t, int)int lsetxattr(const char*, const char*, const void*, size_t, int)int setxattr(const char*, const char*, const void*, size_t, int)ssize_t getxattr_worker(path_conv&, const char*, void*, size_t)ssize_t fgetxattr(int, const char*, void*, size_t)ssize_t lgetxattr(const char*, const char*, void*, size_t)ssize_t getxattr(const char*, const char*, void*, size_t)int write_ea(void*, path_conv&, const char*, const char*, size_t, int)ssize_t read_ea(void*, path_conv&, const char*, char*, size_t)\etc\passwdHOME%s:*:%lu:%lu:,%s:%s:/bin/shCompleting /etc/passwd: %sw+b/dev/tty void pwdgrp::read_passwd()%s:%d setting errno %d??\NtFsControlFile(FSCTL_GET_REPARSE_POINT) failed, %pReadFile1 failed %p!!IntxLNKReadFile2 failedsymlink string too long:\.lnktN aN afN aXN aN aN aN ais a devicenot a symlink%p = NtCreateFile (%S)%p = NtOpenFile (no-EAs %S)%p = NtOpenFile (broken-UDF, %S)%p = NtQueryInformationFile (%S)%p = NtOpenFile(%S)%p = NtQueryDirectoryFile(%S)%s%d = symlink.check(%s, %p) (%p)ntdll.dllRtlGetCurrentDirectory_URtlEnterCriticalSectionWARNING: Couldn't compute FAST_CWD pointer. Please report this problem to the public mailing list cygwin@cygwin.comRtlAllocateHeap failedRtlSetCurrentDirectory_U(%S) failed, %pCouldn't set directory to %S temporarily. Cannot continue./home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/path.cccwd_lockhas restricted permissions which render it inaccessible as Win32 working directoryis a virtual Cygwin directory which does not exist for a native Windows applicationhas a path longer than allowed for a Win32 working directoryis not accessible for some unknown reasonposix %s(%s) = cwdstuff::get (%p, %d, %d, %d), errno %dPWD%s = normalize_win32_path (%s)src %sENAMETOOLONG = normalize_posix_path (%s)%s = normalize_posix_path (%s)src::ENAMETOOLONG::%s is a non-directory\\.\this->path(%s), has_acls(%d)3 aq a~ a} aR a a aQ a a a~ a\??\..\\??\UNC\.\cygwin warning: MS-DOS style path detected: %ls POSIX equivalent preferred. CYGWIN environment variable option "nodosfilewarning" turns off this warning. Consult the user's guide for more details about POSIX paths: http://cygwin.com/cygwin-ug-net/using.html#using-pathnames MS-DOS style path detected: %ls Preferred POSIX equivalent is: %ls dir '%s'-1 = chdir (%s)%R = chdir() cygheap->cwd.posix '%s' native '%S'%R = fchdir(%d)[path too long]symlink (%s, %S)Setting attributes failed, status = %pSetting delete dispostion failed, status = %p%d = symlink_worker(%s, %s, %d, %d)-1 = readlink (%s, %p, %d)NtQueryFullAttributesFile (%S) failed, %pfn[%d] %S res %dinternal errorfn[%d] %S, curr_ix %d/etcfn[%d] %S change_possible %d/\.exestatic bool etc::file_changed(int)static bool etc::dir_changed(int)static bool etc::test_file_change(int)static int etc::init(int, _OBJECT_ATTRIBUTES*)char* cwdstuff::get(char*, int, int, unsigned int)int __set_errno(const char*, int, int)void cwdstuff::override_win32_cwd(bool, ULONG)fcwd_access_t** find_fast_cwd()ssize_t cygwin_conv_path_list(cygwin_conv_path_t, const void*, void*, size_t)int cygwin_posix_to_win32_path_list(const char*, char*)int cygwin_win32_to_posix_path_list(const char*, char*)ssize_t env_PATH_to_posix(const void*, void*, size_t)char* realpath(const char*, char*)ssize_t cygwin_conv_path(cygwin_conv_path_t, const void*, void*, size_t)int fchdir(int)cygheap_fdget::cygheap_fdget(int, bool, bool)int chdir(const char*)char* getcwd(char*, size_t)ssize_t readlink(const char*, char*, size_t)int symlink_info::check(char*, const suffix_info*, fs_info&, path_conv_handle&)int symlink_info::check_reparse_point(void*, bool)int symlink_info::check_sysfile(void*)Fint symlink_worker(const char*, const char*, bool, bool)int normalize_win32_path(const char*, char*, char*&)void path_conv::check(const char*, unsigned int, const suffix_info*)int normalize_posix_path(const char*, char*, char*&)%s: error while loading shared libraries: %s: cannot open shared object file: No such file or directory *** STATUS_%p pid %d, exit value - old %p, windows %p, cygwin %pwinpid %d, exit %dCalling ExitProcess n %p, exitcode %pTerminateProcess failed, %Ecygpid/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/pinfo.ccMapViewOfFileEx h0 %p, i %d failed, %E%s:%d setting errno %di == 0execed process windows pid %d, cygwin pid %dretrieval of execed process info for pid %d failed due to recursion.looping because pid %d, procinfo->pid %d, procinfo->dwProcessid %u has PID_EXITED|PID_REAPED setmyself dwProcessId %uSet nice to %dpid %d, pgid %dRtlSetDaclSecurityDescriptor %pNtSetSecurityObject %pcouldn't duplicate parent rd_proc_pipe handle %p for forked child %d after exec, %Ecouldn't duplicate parent process handle %p for forked child %d after exec, %Ectty %sold %s, ctty device number %p, tc.ntty device number %p flags & O_NOCTTY %pcygheap->ctty %p, archetype %pctty was NULLline %d: %s<%p> usecount + %d = %dctty %p, usecount %dctty%s %s, %susecount %dattaching %s sid %d, pid %d, pgid %d, tty->pgid %d, tty->sid %dcygheap->ctty now %p, archetype %pcommuneprocessing PICOM_CMDLINEWritePipeOverlapped sizeof argv failed, %EWritePipeOverlapped arg %d failed, %Eprocessing PICOM_CWDWritePipeOverlapped sizeof cwd failed, %EWritePipeOverlapped cwd failed, %Eprocessing PICOM_ROOTWritePipeOverlapped sizeof root failed, %EWritePipeOverlapped root failed, %Eprocessing PICOM_FDSWritePipeOverlapped sizeof fds failed, %EWritePipeOverlapped fd %d failed, %EWritePipeOverlapped sizeof hdl failed, %EWritePipeOverlapped hdl failed, %Eprocessing PICOM_FDWritePipeOverlapped sizeof fd failed, %EWritePipeOverlapped fd failed, %EWFSO failed - %d, %Esynchronized with pid %d aJ a a a1 a aQ a/waitproccreated tracking thread for pid %d, winpid %p, rd_proc_pipe %psending %d notification to parent failed, %Eerror on read of child wait pipe %p, %Eunknown value %d on proc pipeloopingexiting wait thread for pid %dcygpid.out of memory reading system process informationerror %p reading system process informationDWORD winpids::enum_processes(bool)pid_t cygwin_winpid_to_pid(int)int __set_errno(const char*, int, int)bool _pinfo::alert_parent(char)bool pinfo::wait()DWORD proc_waiter(void*)cygheap_fdget::cygheap_fdget(int, bool, bool)commune_result _pinfo::commune_request(__uint32_t, ...)DWORD commune_process(void*)bool _pinfo::set_ctty(fhandler_termios*, int)pinfo::pinfo(void*, pinfo_minimal&, pid_t)void pinfo::set_acl()void pinfo::init(pid_t, DWORD, void*)void pinfo::exit(DWORD)void pinfo::maybe_set_exit_code_from_windows()DWORD status_exit(DWORD)void pinfo_init(char**, int)void pinfo::thisproc(void*)pipe:[%d]%s:%d setting errno %d/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/pipe.ccres %dcwcsdup would have returned NULL(%d, %d)/proc/%d/fd/pipe:[%d]PIPE_TYPE_MESSAGEPIPE_TYPE_BYTE, retrying\\.\pipe\cygwin-%S-%u-%spipe-%pname %s, size %lu, mode %spipe read handle %ppipe busypipe access denied%sfailed, %Epipe write handle NULLCreateFile: name %sCreateFile failed, r %p, %Epipe write handle %p%R = pipe([%p, %p], %d, %p)/dev/fd/pipe:[%d]%R = _pipe([%d, %d], %u, %p)%R = pipe([%d, %d])%R = pipe2([%d, %d], %p)int pipe2(int*, int)cygheap_fdnew::cygheap_fdnew(int, bool)int __set_errno(const char*, int, int)int pipe(int*)int _pipe(int*, unsigned int, int)virtual int fhandler_pipe::fstatvfs(statvfs*)virtual int fhandler_pipe::ioctl(unsigned int, void*)static int fhandler_pipe::create(fhandler_pipe**, unsigned int, int)static DWORD fhandler_pipe::create(_SECURITY_ATTRIBUTES*, void**, void**, DWORD, const char*, DWORD)virtual int fhandler_pipe::dup(fhandler_base*, int)virtual int fhandler_pipe::ftruncate(_off64_t, bool)virtual int fhandler_pipe::fadvise(_off64_t, _off64_t, int)virtual _off64_t fhandler_pipe::lseek(_off64_t, int)virtual int fhandler_pipe::open(int, mode_t)mqueue/mtx_%sNtCreateMutant: %pmqueue/evt_%s%cNtCreateEvent: %p%s:%d setting errno %dsem.Warning: '%s' does not exists or is not a directory. %ss require the existance of this directory. Create the directory '%s' and set the permissions to 01777. For instance on the command line: mkdir -m 01777 %s /\Invalid %s name '%s'%s name '%s' too long%s/%s%smq_receive: curmsgs = %ld; head = 0mq_send: curmsgs = %ld; free = 0Invalid oflag 0%o%016X%08x%08x/dev/shmPOSIX shared memory object/dev/mqueuePOSIX message queuePOSIX semaphoreQna Znauna naQnanabool check_path(char*, ipc_type_t, const char*, size_t)int __set_errno(const char*, int, int)semaphore** sem_open(const char*, int, ...)int mq_close(mqd_t)ssize_t _mq_receive(mqd_t, char*, size_t, unsigned int*, const timespec*)int ipc_mutex_lock(void*)int _mq_send(mqd_t, const char*, size_t, unsigned int, const timespec*)int mq_notify(mqd_t, const sigevent*)int mq_setattr(mqd_t, const mq_attr*, mq_attr*)int mq_getattr(mqd_t, mq_attr*)mqd_t mq_open(const char*, int, ...)int ipc_mutex_init(void**, const char*)int ipc_cond_init(void**, const char*, char)int shm_open(const char*, int, mode_t)%s%s: %s VirtualQuery failed for %d bytes at address %p Unknown pseudo relocation protocol version %d. Unknown pseudo relocation bit size %d. Cygwin runtime failure: : random: not enough state (%lu bytes); ignored. /dev/random?[:<:]][:>:]] ab ab ab a} a} a} a} a} a~ a~ a a} a} a} a} a} a} a~ a"~ a ab ab ab a} a} a} a} a} a~ a~ a a} a} a} a} a} a} a~ a"~ ah a a a a a= a a a a a` a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a@ a a ae a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a aUTF-8NULSOHSTXETXEOTENQACKBELalertBSbackspaceHTtabLFnewlineVTvertical-tabFFform-feedCRcarriage-returnSOSIDLEDC1DC2DC3DC4NAKSYNETBCANEMSUBESCIS4FSIS3GSIS2RSIS1USspaceexclamation-markquotation-marknumber-signdollar-signpercent-signampersandapostropheleft-parenthesisright-parenthesisasteriskplus-signcommahyphenhyphen-minusperiodfull-stopslashsoliduszeroonetwothreefourfivesixseveneightninecolonsemicolonless-than-signequals-signgreater-than-signquestion-markcommercial-atleft-square-bracketbackslashreverse-solidusright-square-bracketcircumflexcircumflex-accentunderscorelow-linegrave-accentleft-braceleft-curly-bracketvertical-lineright-braceright-curly-brackettildeDEL%dREG_0x%xREG_NOMATCHregexec() failed to matchREG_BADPATinvalid regular expressionREG_ECOLLATEinvalid collating elementREG_ECTYPEinvalid character classREG_EESCAPEtrailing backslash (\)REG_ESUBREGinvalid backreference numberREG_EBRACKbrackets ([ ]) not balancedREG_EPARENparentheses not balancedREG_EBRACEbraces not balancedREG_BADBRinvalid repetition count(s)REG_ERANGEinvalid character rangeREG_ESPACEout of memoryREG_BADRPTrepetition-operator operand invalidREG_EMPTYempty (sub)expressionREG_ASSERT"can't happen" -- you found a bugREG_INVARGinvalid argument to regex routineREG_ILLSEQillegal byte sequence*** unknown regexp error code ***shut up gcc\Registry\Machine.DEFAULT\Registry\User\failed to create key %S in the registryCygwinSOFTWAREProfileImagePathProfileList\ProfileImagePath for %W not found, status %pProfileImagePath for %W: %W\??\\ntuser.datLoading user registry hive %S into %S failed: %p_Classes\Local Settings\Application Data\Microsoft\Windows\UsrClass.datLoading user registry hive %S into %S SUCCEEDED: %pLoading user classes hive %S into %S failed: %pLoading user classes hive %S into %S SUCCEEDED: %pvoid load_registry_hive(const WCHAR*)WCHAR* get_registry_hive_path(const WCHAR*, WCHAR*)void reg_key::build_reg(HKEY__*, REGSAM, char*)%s:%d setting errno %d%R = getrusage(%d, %p)couldn't get stack info, returning def.values. %E$ a$ a$ a a a0 a$ aint setrlimit(int, const rlimit*)int __set_errno(const char*, int, int)int getrlimit(int, rlimit*)int getrusage(int, rusage*).HOME%s/.netrcr%sanonymousError: .netrc file is readable by others.Remove password or make file unreadable by others.Remove account or make file unreadable by others.Missing macdef name argument.Limit of 16 macros have already been definedMacro definition missing null line terminator.4K macro buffer exceededUnknown .netrc keyword %srexec: socketgetsocknameaccept%udefaultloginpasswordpasswdaccountmachinemacdef0%drcmd: getaddrinfo: %s rcmd: socket: All ports in use rcmd: socket: %s connect to address %s: Trying %s... %s: %s rcmd: write (setting up stderr): %s rcmd: too many files rcmd: select (setting up stderr): %s select: protocol failure in circuit setup rcmd: accept: %s socket: protocol failure in circuit setup. rcmd: %s: %s .rhosts lstat failed.rhosts not regular file.rhosts fstat failedbad .rhosts owner.rhosts writeable by other than ownerrt/etc/hosts.equiv%s:%d setting errno %dint scandir(const char*, dirent***, int (*)(const dirent*), int (*)(const dirent**, const dirent**))int __set_errno(const char*, int, int)%s:%d setting errno %dPriorityControlControlCurrentControlSetSYSTEMWin32PrioritySeparationint sched_setscheduler(pid_t, int, const sched_param*)int __set_errno(const char*, int, int)int sched_setparam(pid_t, const sched_param*)int sched_rr_get_interval(pid_t, timespec*) $ $$$int sched_getparam(pid_t, sched_param*)int sched_get_priority_min(int)int sched_get_priority_max(int)%s:%d setting errno %d/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/sec_acl.ccACL-Size: %dCreated SD-Size: %dgot %d error from build_fh_name%R = acl(%s)-1 = facl (%d)%R = facl(%s) )%R = getacl(%S)user::%suser:%d:%sgroup::%sgroup:%d:%smask::%sother::%s\ a@` a_ a\ aP_ a\ a\ a\ a^ a\ a\ a\ a\ a\ a\ a\ a7^ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a] a\ aF` a_ a\ aV_ a\ a\ a\ a^ a\ a\ a\ a\ a\ a\ a\ a=^ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a] a,defaultuser:group:mask:other:int lacl(const char*, int, int, __aclent16_t*)int __set_errno(const char*, int, int)__aclent32_t* aclfromtext32(char*, int*)char* acltotext32(__aclent32_t*, int)int aclfrommode32(__aclent32_t*, int, mode_t*)int acltomode32(__aclent32_t*, int, mode_t*)int aclsort32(int, int, __aclent32_t*)int facl32(int, int, int, __aclent32_t*)cygheap_fdget::cygheap_fdget(int, bool, bool)int lacl32(const char*, int, int, __aclent32_t*)int acl32(const char*, int, int, __aclent32_t*)int getacl(void*, path_conv&, int, __aclent32_t*)int setacl(void*, path_conv&, int, __aclent32_t*, bool&)Linked Token: %pLinked Token is not a primary token!/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/sec_auth.ccLookupAccountName(%W), %EGlobal group %W invalid. Use: %dCoding error: wincap privilege %u doesn't exist in sys_privsmalloc (system_privs) failed.realloc (privs) failed.set_imp_token (%d, %d)U-pw_gecos %x (%s)%s:%d setting errno %dLogonUserW (%W, %W, ...)DuplicateTokenEx: %EImpersonateLoggedOnUser: %E%R = logon_user(%s,...)DC: rediscovery: %d, server: %WRejecting local %W. use: %dLookupAccountSid(BUILTIN), %E\NtQueryInformationToken(), %pCygwin.1NtQuerySecurityObject(), %pRtlGetGroupSecurityDescriptor(), %pNtQueryInformationToken(token, TokenGroups), %pNtQueryInformationToken(my_token, TokenGroups), %pNtQueryInformationToken(hProcToken, TokenStatistics), %pNtQueryInformationToken(hProcToken, TokenGroups), %pmalloc (my_tok_gsids) failed.DuplicateTokenEx %E%p = create_token () (*) (+)NULLCygwinLsaRegisterLogonProcess: %pCouldn't load Secur32.dllCygwinLsaLsaLookupAuthenticationPackage: %p-- begin sidlist ---No elementstmp_gsids%s %s%s-- ende sidlist ---LsaLogonUser: %p (sub-status %p)%p = lsaauth ()_microsoft_sfu_utilityL$CYGWIN_%W_%W%WTry logon for %W\%Wvoid* lsaprivkeyauth(passwd*)void* get_full_privileged_inheritable_token(void*)void* lsaauth(cygsid&, user_groups&, passwd*)void cygsidlist::debug_print(const char*) constvoid cygsid::debug_print(const char*) const_TOKEN_PRIVILEGES* get_priv_list(void*, cygsid&, cygsidlist&, size_t&, cygpsid*) !"#_TOKEN_PRIVILEGES* get_system_priv_list(size_t&)void* create_token(cygsid&, user_groups&, passwd*)bool verify_token(void*, cygsid&, user_groups&, bool*)bool get_user_groups(WCHAR*, cygsidlist&, WCHAR*, WCHAR*)bool get_user_local_groups(WCHAR*, WCHAR*, cygsidlist&, WCHAR*)bool get_logon_server(WCHAR*, WCHAR*, bool)void* cygwin_logon_user(const passwd*, const char*)int __set_errno(const char*, int, int)void extract_nt_dom_user(const passwd*, WCHAR*, WCHAR*)void set_imp_token(void*, int)%u-%luS-1-NULLget_sids_info: owner SID =%s %sget_sids_info: group SID =<unknown privilege>/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/sec_helper.cc%d = set_privilege((token %x) %W, %d)RtlCreateAcl: %pRtlAddAccessAllowedAce(sid1) %pRtlAddAccessAllowedAce(original) %pRtlAddAccessAllowedAce(sid2) %pRtlAddAccessAllowedAce(admin) %pRtlAddAccessAllowedAce(system) %pRtlFirstFreeAce: %pRtlSetDaclSecurityDescriptor %pRtlAddAccessAllowedAce: %p_SECURITY_DESCRIPTOR* _everyone_sd(void*, ACCESS_MASK)SECURITY_ATTRIBUTES* __sec_user(void*, void*, void*, DWORD, BOOL)bool sec_acl(_ACL*, bool, bool, void*, void*, DWORD)int set_privilege(void*, DWORD, bool)SeCreateTokenPrivilegeSeAssignPrimaryTokenPrivilegeSeLockMemoryPrivilegeSeIncreaseQuotaPrivilegeSeMachineAccountPrivilegeSeTcbPrivilegeSeSecurityPrivilegeSeTakeOwnershipPrivilegeSeLoadDriverPrivilegeSeSystemProfilePrivilegeSeSystemtimePrivilegeSeProfileSingleProcessPrivilegeSeIncreaseBasePriorityPrivilegeSeCreatePagefilePrivilegeSeCreatePermanentPrivilegeSeBackupPrivilegeSeRestorePrivilegeSeShutdownPrivilegeSeDebugPrivilegeSeAuditPrivilegeSeSystemEnvironmentPrivilegeSeChangeNotifyPrivilegeSeRemoteShutdownPrivilegeSeUndockPrivilegeSeSyncAgentPrivilegeSeEnableDelegationPrivilegeSeManageVolumePrivilegeSeImpersonatePrivilegeSeCreateGlobalPrivilegeSeTrustedCredManAccessPrivilegeSeRelabelPrivilegeSeIncreaseWorkingSetPrivilegeSeTimeZonePrivilegeSeCreateSymbolicLinkPrivilegeFaFaHaxaaaaHahaaĚaa$aPaaЛaa<a`aaaԜaa4adaaaa aPaaaaaTa|avoid cygpsid::debug_print(const char*) constNO RtlGetOwnerSecurityDescriptor: %pRtlGetGroupSecurityDescriptor: %puid %d, gid %d/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/security.cc%sACL %x, uid %d, gid %d%s:%d setting errno %dNtQuerySecurityObject (%S), status %pNtOpenFile (%S), status %pRtlConvertToAutoInheritSecurityObject (%S), status %p (+)NULLuid %d, gid %d, attribute %x (*)alloc_sd: owner SID =%s %s%salloc_sd: group SID =ACL-Size: %dCreated SD-Size: %u%d = set_file_attribute(%S, %d, %d, %p)flags %x, ret %dint check_registry_access(void*, int, bool)int get_reg_sd(void*, security_descriptor&)int check_access(security_descriptor&, GENERIC_MAPPING&, ACCESS_MASK, int, bool)int __set_errno(const char*, int, int)int check_file_access(path_conv&, int, bool)int set_file_attribute(void*, path_conv&, __uid32_t, __gid32_t, mode_t)_SECURITY_DESCRIPTOR* alloc_sd(path_conv&, __uid32_t, __gid32_t, int, security_descriptor&)void cygsid::debug_print(const char*) constvoid get_info_from_sd(_SECURITY_DESCRIPTOR*, mode_t*, __uid32_t*, __gid32_t*)int get_object_sd(void*, security_descriptor&)LONG get_file_sd(void*, path_conv&, security_descriptor&, bool)pipeselserselmailselme %p, testing fd %d (%s)ready %dread_ready: %d, write_ready: %d, except_ready: %dstuff_start %psockselstuff_start %p, timeout %uleaving thread_socketsi %p si->thread %preturningfd %d, %s, NtQueryInformationFile failedfd %d, %s, read avail %ufd %d, %s, write: size %lu, avail %lufd, %s, write tiny pipe: size %lu, avail %lureadaheadalready readycwcsdup would have returned NULLmailslot %d(%p) error %Emailslot %d(%p) readymailslot %d(%p) not readystoppingstopping from outer loopwindow %d(%p) readywindow %d(%p) not ready%s, already ready for readread: %s, n %dread: %s, ready for read: avail %dread: %s, saw EOFwrite: %s, gotone %dfh->overlapped_armed %dClearCommErrorWaitCommEventWaitForMultipleObjectsoperation aborted/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/select.herror %Eexitingcalling cleanup routinesdeleting select recordsm %d, ms %uwait_ret %d. verifyingsignal receivedWaitForMultipleObjects failedtimed out%s:%d setting errno %dgotone %dreturning %daborting due to test_and_set errorsel.always_ready %drecalculating mstimed out after verificationms now %uselect(%d, %p, %p, %p, %p)to->tv_sec %d, to->tv_usec %d, ms %dto NULL, ms %x%R = select(%d, %p, %p, %p, %p)int peek_mailslot(select_record*, bool)DWORD thread_mailslot(void*)int peek_windows(select_record*, bool)int set_bits(select_record*, _types_fd_set*, _types_fd_set*, _types_fd_set*)int peek_socket(select_record*, bool)int start_thread_socket(select_record*, select_stuff*)DWORD thread_socket(void*)void socket_cleanup(select_record*, select_stuff*)int peek_serial(select_record*, bool)DWORD thread_serial(void*)int peek_pipe(select_record*, bool)int pipe_data_available(int, fhandler_base*, void*, bool)DWORD thread_pipe(void*)int peek_console(select_record*, bool)select_stuff::wait_states select_stuff::wait(_types_fd_set*, _types_fd_set*, _types_fd_set*, DWORD)void select_stuff::destroy()int __set_errno(const char*, int, int)void select_stuff::cleanup()int cygwin_select(int, _types_fd_set*, _types_fd_set*, _types_fd_set*, timeval*)int select(int, _types_fd_set*, _types_fd_set*, _types_fd_set*, DWORD)semctl (semid = %d, semnum = %d, cmd = %d, arg.val = 0x%x)-1 [%d] = semctl ()%s:%d setting errno %dsemget (key = %U, nsems = %d, semflg = 0x%x)-1 [%d] = semget ()semop (semid = %d, sops = %p, nsops = %d)-1 [%d] = semop ()int semop(int, sembuf*, size_t)int __set_errno(const char*, int, int)int semget(key_t, int, int)int semctl(int, int, int, ...)%s:%d setting errno %dL$CYGWIN_/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/setlsapwd.cclong unsigned int setlsapwd(const char*, const char*)int __set_errno(const char*, int, int)\BaseNamedObjects\%s%s-%SNtCreateDirectoryObject(%S): %p\Sessions\BNOLINKS\%d\%s%s-%S%s.%d%W.%dCreateFileMapping %W, %E. Terminating.MapViewOfFileEx '%W'(%p), %E. Terminating.name %W, n %d, shared %p (wanted %p), h %p, *m %duser shared memory versionuser shared memory sizeUnmapViewOfFile %ECloseHandle %Eopening user shared for '%W' at %puser shared version %xobcaseinsensitiveSession Manager\kernel\SYSTEMROOTsystem shared memory versionInstallation root: <%W> key: <%S>size of shared memory region changed from %u to %usharedvoid shared_info::initialize()static void user_info::create(bool)void* open_shared(const WCHAR*, int, void*&, DWORD, shared_locations*, _SECURITY_ATTRIBUTES*, DWORD)-1 [%d] = fixup_shms_after_fork ()%s:%d setting errno %dfixup_shms_after_fork: NtMapViewOfSection (%p), status %p. Terminating.shmctl (shmid = %d, cmd = %d, buf = 0x%x)-1 [%d] = shmctl ()shm_guardshmdt (shmaddr = %p)-1 [%d] = shmdt ()shmget (key = %U, size = %d, shmflg = 0x%x)-1 [%d] = shmget ()shmat (shmid = %d, shmaddr = %p, shmflg = 0x%x)/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/shm.cc-1 [%d] = shmat ()int shmget(key_t, size_t, int)int __set_errno(const char*, int, int)int shmdt(const void*)int shmctl(int, int, shmid_ds*)void* shmat(int, const void*, int)int fixup_shms_after_fork()%s:%d setting errno %dsignal %d, newact %p, oa %psignal %d, newact %p (handler %p), oa %pSIG_ERR = signal (%d, %p)%p = signal (%d, %p)clock_nanosleep (%ld.%09ld)%d = clock_nanosleep(%lu, %d, %ld.%09ld, %ld.%09.ld)Invalid how value %d%R = sigprocmask (%d, %p, %p)%d = sig_send, %E %d = _pinfo::kill (%d), pid %d, process_state %ppid %d, signal %dkilling pid %d, pgrp %d, p->%s, %s%R = kill(%d, %d)kill (%d, %d)signal %d out of range%R = sigaction(%d, %p, %p)SIG_ERR = sigaddset signal %d out of rangeSIG_ERR = sigdelset signal %d out of range%R = siginterrupt(%d, %p)/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/signal.ccreturning signal %dint sigqueue(pid_t, int, sigval)int __set_errno(const char*, int, int)int sigwaitinfo(const sigset_t*, siginfo_t*)int siginterrupt(int, int)int sigaction_worker(int, const sigaction*, sigaction*, bool)int sigismember(const sigset_t*, int)int sigdelset(sigset_t*, int)int sigaddset(sigset_t*, int)int sigaction(int, const sigaction*, sigaction*)int kill_pgrp(pid_t, siginfo_t&)int kill0(pid_t, siginfo_t&)int _pinfo::kill(siginfo_t&)int handle_sigprocmask(int, const sigset_t*, sigset_t*, sigset_t&)int sigprocmask(int, const sigset_t*, sigset_t*)unsigned int usleep(useconds_t)int nanosleep(const timespec*, timespec*)int clock_nanosleep(clockid_t, int, const timespec*, timespec*)void (* signal(int, void (*)(int)))(int)communepid %d wants some informationremoving procs[%d], pid %d, nprocs %dargs: %x, %dsync_proc_subproc is NULLCouldn't acquire %s for(%d,%d), last %d, %Eproc table overflow: hit %d processes, pid %d %s:%d setting errno %dadded pid %d to proc table, slot %dwval->pid %d, wval->options %dclear waiting threadslooking for processes to reap, nprocs %dnprocs %dconsidering pid %dstopped child, stop signal %dcouldn't wake up wait event %p, %Eno matching terminated children foundreturning %dreleased waiting threadonly found non-terminated childrenwaiting thread found no childrenfinished processing terminated/stopped childfinished clearingcouldn't get proc lock. what %d, val %dS a5 a٧ a ae a? ap aterminating captive processabout to call do_exit (%x)leavingsigwaitcouldn't create signal pipe, %Esync_proc_subprocsiginvalid pid %d(%x), signal %dsendsig handle never materialized/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/sigproc.ccOpenProcess failed, %EDuplicateHandle failed, %ECreatePipe for __SIGCOMMUNE failed, %EDuplicateHandle for __SIGCOMMUNE failed, %Esendsig %p, pid %d, signal %d, its_me %dwakeup %pWriteFile for pipe %p failed, %EI'm going away nowerror sending signal %d to pid %d, pipe handle %p, %EWaiting for pack.wakeup %pNot waiting for sigcomplete. its_me %d signal %dwait for sig_complete event failed, signal %d, rc %d, %Ereturning %p from sending signal %ddon't worry about signal threadalready performedenteringentering ReadFile loop, my_readsig %p, my_sendsig %pshort read from signal pipe: %d != %dsaw __SIGEXITsignal %d already queuedsignalling pack.wakeup %psignal thread exitingf a& a aH a a a a aw a asubproc_ready %pcouldn't create handle to myself for child, %Ecouldn't create signalling event for exec, %Esubproc_ready not setnot really readySetEvent failed, %Esignalled %p that I was readyn %d, waiting for subproc_ready(%p) and child process(%p)wait failed, pid %u, %Epid %u, WFMO returned %d, exit_code %p, res %dexit_code %pSTILL_ACTIVE? How'd we get here?bool child_info_fork::abort(const char*, ...)DWORD child_info::proc_retry(void*)bool child_info::sync(pid_t, void*&, DWORD)void child_info::ready(bool)bool get_proc_lock(DWORD, DWORD)child_info::child_info(unsigned int, child_info_types, bool)int sig_send(_pinfo*, siginfo_t&, _cygtls*)bool proc_can_be_signalled(_pinfo*)int __set_errno(const char*, int, int)void sigproc_terminate(exit_states)void wait_sig(void*)void talktome(siginfo_t*)void proc_terminate()void _cygtls::signal_exit(int)int proc_subproc(DWORD, DWORD)int checkstate(waitq*)bool stopped_or_terminated(waitq*, _pinfo*)bool remove_proc(int)(null)cygwin program(null)smallprint_buf5 a ao a a a a a a a a a a a a a a a a a a aE a a a a a a a a a a a a a| a a a a a a a ag a a a a a a a a a a a" a a a a a a a a ak a a a a a a a a aH a a a a: a a{ a a a a a a a a a a a a a a a a a a aL a a a a a a a a a a a a a a a a a a a a an a a a a a a a a a a a" a a a a a a a a a a a a a! a a a a aO a a a aWin32 error cygwin program a a a a a a a a a a a a a a a a a a a a a9 aU a a a a a a a a a a a a a a a a a9 a a a a a a a a a a a a a a9 a a a a a a a a a a a a a a a a a a a a aY a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a| a az a a aq a a a a a a a a a a a ad a a a a a a a a[ a a aR aI a a a a a@ a a a7 a0123456789ABCDEFprog '%s'buf %s, suffix found '%s'.exe.com%s:%d setting errno %dfind_exec (%s)/\%s%strying %s%s = find_exec (%s)/bin/sh.bat.cmd.btmzero length file, treat as script.%s is possibly a script %s is not a valid executablePATH=/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/spawn.ccprog_arg is NULLprog_arg is emptymode = %d, prog_arg = %.9500sargv is NULLError: Current working directory %s. Can't start native Windows application from here. command.comcmd.exe" priority class %dAdd CREATE_BREAKAWAY_FROM_JOBnull_app_name %d (%W, %.9500W)WinSta0CreateWindowStation failed, %ESetProcessWindowStation failed, %EDefaultCreateDesktop failed, %E\DefaultDesktop: %WCreateProcess failed, %Epid %d, prog_arg %s, cmd line %.9500s)new process name %Wpinfo failedspawned windows pid %dspawnve (%s, %s, %x)int av::fixup(const char*, path_conv&, const char*, bool)int __set_errno(const char*, int, int)int spawnve(int, const char*, const char* const*, const char* const*)int child_info_spawn::worker(const char*, const char* const*, const char* const*, int, int, int)const char* perhaps_suffix(const char*, path_conv&, int&, unsigned int)cygheap_fdget::cygheap_fdget(int, bool, bool)const char* find_exec(const char*, path_conv&, const char*, unsigned int, const char**)!?%W %s%s%7d [%s] %s .exe%d(%d)%x %scYg%08xcYg%8x %xarray bound exceeded %d CONOUT$App version: %d.%d, api: %d.%dDLL version: %d.%d, api: %d.%dDLL build: %scYg%8x %x %d(pid %d, ppid %d, windows pid %u)**********************************************Program name: %W %sOS version: Windows %s(windows pid %u)wndproc %d %s %d %dwndproc %d unknown %d %dWM_NULLWM_CREATEWM_DESTROYWM_MOVEWM_SIZEWM_ACTIVATEWM_SETFOCUSWM_KILLFOCUSWM_ENABLEWM_SETREDRAWWM_SETTEXTWM_GETTEXTWM_GETTEXTLENGTHWM_PAINTWM_CLOSEWM_QUERYENDSESSIONWM_QUITWM_QUERYOPENWM_ERASEBKGNDWM_SYSCOLORCHANGEWM_ENDSESSIONWM_SHOWWINDOWWM_WININICHANGEWM_DEVMODECHANGEWM_ACTIVATEAPPWM_FONTCHANGEWM_TIMECHANGEWM_CANCELMODEWM_SETCURSORWM_MOUSEACTIVATEWM_CHILDACTIVATEWM_QUEUESYNCWM_GETMINMAXINFOWM_PAINTICONWM_ICONERASEBKGNDWM_NEXTDLGCTLWM_SPOOLERSTATUSWM_DRAWITEMWM_MEASUREITEMWM_DELETEITEMWM_VKEYTOITEMWM_CHARTOITEMWM_SETFONTWM_GETFONTWM_SETHOTKEYWM_GETHOTKEYWM_QUERYDRAGICONWM_COMPAREITEMWM_COMPACTINGWM_WINDOWPOSCHANGINGWM_WINDOWPOSCHANGEDWM_POWERWM_COPYDATAWM_CANCELJOURNALWM_NCCREATEWM_NCDESTROYWM_NCCALCSIZEWM_NCHITTESTWM_NCPAINTWM_NCACTIVATEWM_GETDLGCODEWM_NCMOUSEMOVEWM_NCLBUTTONDOWNWM_NCLBUTTONUPWM_NCLBUTTONDBLCLKWM_NCRBUTTONDOWNWM_NCRBUTTONUPWM_NCRBUTTONDBLCLKWM_NCMBUTTONDOWNWM_NCMBUTTONUPWM_NCMBUTTONDBLCLKWM_KEYFIRSTWM_KEYDOWNWM_KEYUPWM_CHARWM_DEADCHARWM_SYSKEYDOWNWM_SYSKEYUPWM_SYSCHARWM_SYSDEADCHARWM_KEYLASTWM_INITDIALOGWM_COMMANDWM_SYSCOMMANDWM_TIMERWM_HSCROLLWM_VSCROLLWM_INITMENUWM_INITMENUPOPUPWM_MENUSELECTWM_MENUCHARWM_ENTERIDLEWM_CTLCOLORMSGBOXWM_CTLCOLOREDITWM_CTLCOLORLISTBOXWM_CTLCOLORBTNWM_CTLCOLORDLGWM_CTLCOLORSCROLLBARWM_CTLCOLORSTATICWM_MOUSEFIRSTWM_MOUSEMOVEWM_LBUTTONDOWNWM_LBUTTONUPWM_LBUTTONDBLCLKWM_RBUTTONDOWNWM_RBUTTONUPWM_RBUTTONDBLCLKWM_MBUTTONDOWNWM_MBUTTONUPWM_MBUTTONDBLCLKWM_MOUSELASTWM_PARENTNOTIFYWM_ENTERMENULOOPWM_EXITMENULOOPWM_MDICREATEWM_MDIDESTROYWM_MDIACTIVATEWM_MDIRESTOREWM_MDINEXTWM_MDIMAXIMIZEWM_MDITILEWM_MDICASCADEWM_MDIICONARRANGEWM_MDIGETACTIVEWM_MDISETMENUWM_DROPFILESWM_MDIREFRESHMENUWM_CUTWM_COPYWM_PASTEWM_CLEARWM_UNDOWM_RENDERFORMATWM_RENDERALLFORMATSWM_DESTROYCLIPBOARDWM_DRAWCLIPBOARDWM_PAINTCLIPBOARDWM_VSCROLLCLIPBOARDWM_SIZECLIPBOARDWM_ASKCBFORMATNAMEWM_CHANGECBCHAINWM_HSCROLLCLIPBOARDWM_QUERYNEWPALETTEWM_PALETTEISCHANGINGWM_PALETTECHANGEDWM_HOTKEYWM_PENWINFIRSTWM_PENWINLASTASYNCIO%%%d.%df0123456789abcdef  !"#$%&'()*+,-.\0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-.\0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~%m/%d/%y%H:%M%H:%M:%S%Y-%m-%dVahUahUahUahUahUa[ahUahUahUahUa[aVaVaVaVaVaVaVaVaVahUahUahUahUahUahUahUa!WaXWatWaXa-XaNXahUaXaXahUahUahUaYahUaEYahUahUafYaxYaYaYahUaYaYa!Za\ahUahUahUahUahUahUa!WaXWa\a\a\ahUahUaXWahUa[a\a\a.\aUahUaZahUaZahUaUa[ahUak[aQVaVaGMT;Zx0NUnknown signal %d%s: (%d [%p]) (%d %d %d %ld) (%d %d %ld)SIGHUPSIGINTSIGQUITSIGILLSIGTRAPSIGABRTSIGEMTSIGFPESIGKILLSIGBUSSIGSEGVSIGSYSSIGPIPESIGALRMSIGTERMSIGURGSIGSTOPSIGTSTPSIGCONTSIGCHLDSIGTTINSIGTTOUSIGIOSIGXCPUSIGXFSZSIGVTALRMSIGPROFSIGWINCHSIGPWRSIGUSR1SIGUSR2SIGRTMINHangupInterruptQuitIllegal instructionTrace/breakpoint trapAbortedEMT instructionFloating point exceptionKilledBus errorSegmentation faultBad system callBroken pipeAlarm clockTerminatedUrgent I/O conditionStopped (signal)StoppedContinuedChild exitedStopped (tty input)Stopped (tty output)I/O possibleCPU time limit exceededFile size limit exceededVirtual timer expiredProfiling timer expiredWindow changedPower failureUser defined signal 1User defined signal 2Real-time signal 0SIGCLD"Child exited"SIGPOLL"I/O possible"SIGLOST"Resource lost"SIGRTMAX"Real-time signal 0"_aXafa_amaiauana|aaaaaaaa aa aa aa aa aaa aaaa aa5aaFaaNaaXaVa]aaeaayaaalata aaaaaa'aa/aa8a aaa?aaGa-a OaCa aacouldn't allocate muto '%s', %Etextbinaryimprobable, but %d != %dfile was %s now %s:\%x:%x:%xNtCreateTransaction failed, %pChecking if directory %S is empty failed, status = %pDirectory %S not empty, found file <%S>, query status = %p.lnk.exelgot %d error from build_fh_name%s:%d setting errno %d%R = %schown(%s,...).cyg.cygNtQueryInformationFile (%S, FileNameInformation) failed, status = %p\$RECYCLE.BIN\\RECYCLER\\Recycled\NtOpenFile (%S) failed, status = %p\NtQueryInformationFile (%S, FileInternalInformation) failed, status = %pNtCreateFile (%S) failed, status = %pdesktop.iniNtWriteFile (%S) failed, status = %pINFO2Move %S to %S failed, status = %pCreating file for overwriting failed, status = %pOverwriting with another file failed, status = %p%S, return status %dX%R = dup(%d)%R = dup2(%d, %d)%R = dup3(%d, %d, %p)Trying to delete %S, isdir = %dOpening %S for removing R/O succeededRemoving R/O on %S failed, status = %pOpening %S for removing R/O failed, status = %pSharing violation when opening %SDelete %S already pendingOpening %S for delete failed, status = %pSetting delete disposition on %S failed, status = %pTry-to-bin %STry %S againOpening dir %S for check_dir_not_empty failed, status = %pCannot delete %S, try delete-on-closeSetting delete-on-close on %S failed, status = %p%S, return status = %punlinking a nonexistent fileunlinking a directory/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/syscalls.cc%R = unlink(%s)%R = remove(%s)-1 = remove (%s)%d = getpid()%d = getppid()hmm. pgid %d pid %dsid %d, pgid %d, %s%R = getsid(%d)nonread(%d, %p, %d) %sblocking%R = read(%d, %p, %d)readv(%d, %p, %d) %sblocking%R = readv(%d, %p, %d)%R = pread(%d, %p, %d, %d)write(%d, %p, %d)%R = write(%d, %p, %d)writev(%d, %p, %d)%R = writev(%d, %p, %d)%R = pwrite(%d, %p, %d, %d)open(%s, %p)%R = open(%s, %p)%D = lseek(%d, %D, %d)%D = lseek(%d, %D, %d), errno %dclose(%d)%R = close(%d)%R = isatty(%d)%R = link(%s, %s)-1 = fchown (%d,...)%R = fchown(%s,...)%R = chmod(%s, %p)-1 = fchmod (%d, 0%o)-1 = fsync (%d)\DeviceNtOpenDirectoryObject, status %pHarddiskVolumeNtOpenFile (%S), status %pNtFlushBuffersFile (%S), status %pentering/devgot %d error from path_conv(%S, %p, %p), file_attributes %d%d = (%S,%p)%R = fstat(%d, %p)returning %dstatus %p%s and %s are the same file%R = rename(%s, %s)sh-c/bin/shNULLreturning %d tty: %sfd %d: old APIfd %d: not openfd %d: opened as binaryfd %d: defaulting to text(%d<%S>, %p) returning %s%R = posix_fadvice(%d, %D, %D, %d)%R = posix_fallocate(%d, %D, %D)%R = ftruncate(%d, %D)%R = truncate(%s, %D)%R = get_osfhandle(%d)(%s, %p), file_attributes %d%R = statvfs(%s,%p)pid %d, pgid %d, res %duid: %u myself->uid: %u myself->gid: %uNothing happensSwitch to restricted tokenSwitch back from restricted tokenFound token %dlsaprivkeyauth failed, try lsaauth.lsaauth failed, try create_token.create_token failed, bail out of hereNtSetInformationToken (user.token, TokenOwner), %pNtSetInformationToken (user.token, TokenPrimaryGroup),%pNtSetInformationToken (TokenDefaultDacl), %preal: %d, effective: %dCannot restore original euid %ureal: %u, effective: %unew egid: %u current: %uNtSetInformationToken (primary_token, TokenPrimaryGroup), %pNtSetInformationToken (token, TokenPrimaryGroup), %pNtSetInformationToken (hProcToken, TokenPrimaryGroup), %pCannot restore original egid %u%R = chroot(%s)PATH=Set nice to %dInvalid fileNew UTMP file: %serror: utmp_fd %dut->ut_type %d, ut->ut_pid %d, ut->ut_line '%s', ut->ut_id '%s' ut->ut_user '%s', ut->ut_host '%s' CryptographyMicrosoftSOFTWARE00000000-0000-0000-0000-000000000000MachineGuidhostid 0x%08x from MachineGuid %Wrt/etc/shellsint unlinkat(int, const char*, int)int __set_errno(const char*, int, int)int gen_full_path_at(char*, int, const char*, bool)cygheap_fdget::cygheap_fdget(int, bool, bool)int linkat(int, const char*, int, const char*, int)int utimensat(int, const char*, const timespec*, int)int fstatat(int, const char*, __stat64*, int)int fchownat(int, const char*, uid_t, gid_t, int)int chown_worker(const char*, unsigned int, __uid32_t, __gid32_t)int fchmodat(int, const char*, mode_t, int)int faccessat(int, const char*, int, int)int pclose(FILE*)FILE* popen(const char*, const char*)cygheap_fdnew::cygheap_fdnew(int, bool)/bin/csh/usr/bin/sh/usr/bin/cshlong int gethostid()/var/run/utmputmp* pututline(const utmp*)void utmpname(const char*)int getpriority(int, id_t)int setpriority(int, id_t, int)int vhangup()int chroot(const char*)int setregid32(__gid32_t, __gid32_t)int setegid32(__gid32_t)int setreuid32(__uid32_t, __uid32_t)int setuid32(__uid32_t)int seteuid32(__uid32_t)int mknod32(const char*, mode_t, __dev32_t)int ptsname_r(int, char*, size_t)pid_t getpgid(pid_t)int setpgid(pid_t, pid_t)int statvfs(const char*, statvfs*)long int get_osfhandle(int)int truncate64(const char*, _off64_t)int ftruncate64(int, _off64_t)int posix_fallocate(int, _off64_t, _off64_t)int posix_fadvise(int, _off64_t, _off64_t, int)int setmode_helper(FILE*)int setmode(int, int)int _cygwin_istext_for_stdio(int)char* ttyname(int)int ttyname_r(int, char*, size_t)long int pathconf(const char*, int)int rename(const char*, const char*)Ta@a,aha|avoid start_transaction(void*&, void*&)int euidaccess(const char*, int)int access(const char*, int)int lstat64(const char*, __stat64*)int stat64(const char*, __stat64*)int stat_worker(path_conv&, __stat64*)void sync()void sync_worker(void*, USHORT, const WCHAR*)int fsync(int)int fstat64(int, __stat64*)int fchmod(int, mode_t)int chmod(const char*, mode_t)int fchown32(int, __uid32_t, __gid32_t)int link(const char*, const char*)int isatty(int)int close(int)_off64_t lseek64(int, _off64_t, int)int open(const char*, int, ...)ssize_t pwrite(int, void*, size_t, _off64_t)ssize_t writev(int, const iovec*, int)_ssize_t write(int, const void*, size_t)ssize_t pread(int, void*, size_t, _off64_t)ssize_t readv(int, const iovec*, int)_ssize_t read(int, void*, size_t)pid_t getsid(pid_t)pid_t setsid()pid_t getppid()pid_t getpid()int remove(const char*)int _remove_r(_reent*, const char*)int unlink(const char*)NTSTATUS unlink_nt(path_conv&)NTSTATUS check_dir_not_empty(void*, path_conv&)bin_status try_to_bin(path_conv&, void*&, ACCESS_MASK)int dup3(int, int, int)int dup2(int, int)int dup(int)/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/sysconf.ccNtQuerySystemInformation: status %d, %ENtQuerySystemInformation: status %p, %E%s:%d setting errno %dNtQuerySystemInformation(SystemTimeOfDayInformation), status %pNtQuerySystemInformation(SystemPagefileInformation), status %pint sysinfo(sysinfo*)int __set_errno(const char*, int, int)long int get_avphys(int)long int get_nproc_values(int)/bin:/usr/binPOSIX_V6_ILP32_OFFBIGPOSIXLY_CORRECT=1 a a a a a a a a asize_t confstr(int, char*, size_t)}pla jakakakaja6eD                   @@  cc           X      long int sysconf(int)DGRAMSTREAM/dev/logfound /dev/log, fd = %d, type = %sopenlog called with (%s, %d, %d)failed to allocate memory for syslog_globals.process_identwb/dev/nullfailed to open /dev/nullFAILURE ! fp_ and message_ both 0!! Cygwin%x %sfailing message %x due to priority mask %x%ls: PID %u: try_connect_guard<%d> RegisterEventSourceW, %EReportEventW, %Eklog_guard/dev/kmsgvoid vsyslog(int, const char*, char*)void connect_syslogd()int pass_handler::print_va(const char*, char*)int pass_handler::initialize(int)void openlog(const char*, int, int)%s:%d setting errno %d%R = tcsendbreak(%d, %d)tcdrain%R = tcdrain(%d)%R = tcflush(%d, %d)%R = tcflow(%d, %d)iflag %p, oflag %p, cflag %p, lflag %p, VMIN %d, VTIME %d%R = tcsetattr(%d, %d, %x)%R = tcgetattr(%d, %p)iflag %x, oflag %x, cflag %x, lflag %x, VMIN %d, VTIME %d%R = tcgetpgrp(%d)%R = tcgetsid(%d)%R = tcsetpgrp(%d, %d)int setspeed(speed_t&, speed_t)int __set_errno(const char*, int, int)int tcsetpgrp(int, pid_t)cygheap_fdget::cygheap_fdget(int, bool, bool)pid_t tcgetsid(int)int tcgetpgrp(int)int tcgetattr(int, termios*)int tcsetattr(int, int, const termios*)bool cygheap_fdmanip::isopen() constint tcflow(int, int)int tcflush(int, int)int tcdrain(int)int tcsendbreak(int, int)mutex %ppthread_mutex::_fixup_after_fork () doesn't understand PROCESS_SHARED mutex'spthread_mutex::_fixup_after_fork () failed to recreate win32 event for mutexsem %xfailed to create new win32 semaphore, error %dpthread_key::recreate_key_from_buffer () failed to reallocate Tls storageAttempt to push a cleanup handler across threadscouldn't create cancel event, %ENew thread object access mutex is not valid. this %pCreateEvent failed. %ECould not create win32 Mutex for pthread cond static initializer support.Could not create win32 Mutex for pthread rwlock static initializer support.Could not create win32 Mutex for pthread mutex static initializer support.Internal cond mutex is not valid. this %pCreateSemaphore failed. %EInternal rwlock synchronisation mutex is not valid. this %pInternal rwlock mutex is not valid. this %pInternal rwlock readers cond is not valid. this %pInternal rwlock writers cond is not valid. this %pfailed to create mainthread objectfailed to create mainthread handlecouldn't create cancel event for main threadCould not create mutex for list synchronisation.mutex %p, self %p, owner %p, lock_counter %d, recursion_counter %dNULL owner valueattempt to use destroyed mutexmutex %p, owner %p, self %p, lock_counter %d, recursion_counter %d, type %d, res %dtid %pstarted thread %p %p %p %p %p %ppthread_cond::_fixup_after_fork () failed to recreate win32 semaphoreCreateThread failed: this %p, %Epthread_rwlock::_fixup_after_fork () failed to recreate mutexAttempt to execute a cleanup handler across threadsspinlock %p, self %p, owner %pspinlock %p, owner %p, self %p, res %dNtQueryInformationThread(ThreadBasicInformation), status %precursion_counter %d res %d%d = pthread_sigmask(%d, %p, %p)*mutex %p, attr %p, initializer %pthreadcount %d. lockingthreadcount %d. unlocked*spinlock %p, pshared %dsemaphore/%016X%08x%08x/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/thread.cc%s:%d setting errno %dcancelable_wait failed. %Epotential attempt to reinitialise a semaphorebool fast_mutex::init()static int semaphore::getinternal(semaphore**, int*, long long unsigned int*, LUID*, unsigned int*)int __set_errno(const char*, int, int)static int semaphore::getvalue(semaphore**, int*)static int semaphore::post(semaphore**)static int semaphore::timedwait(semaphore**, const timespec*)static int semaphore::trywait(semaphore**)static int semaphore::wait(semaphore**)static semaphore** semaphore::open(long long unsigned int, LUID, int, int, mode_t, unsigned int, bool&)static int semaphore::close(semaphore**)static int semaphore::destroy(semaphore**)static int semaphore::init(semaphore**, int, unsigned int)void semaphore::_fixup_after_fork()int semaphore::_wait()int semaphore::_timedwait(const timespec*)int semaphore::_trywait()int semaphore::_getvalue(int*)static int pthread_spinlock::init(pthread_spinlock**, int)static int pthread_mutex::init(pthread_mutex**, pthread_mutexattr* const*, pthread_mutex*)int pthread_sigmask(int, const sigset_t*, sigset_t*)bool pthread_mutex::can_be_unlocked()bool pthread_mutex::no_owner()int pthread_getattr_np(pthread*, pthread_attr**)static DWORD pthread::thread_init_wrapper(void*)int pthread_spinlock::unlock()int pthread_spinlock::lock()void pthread_mutex::_fixup_after_fork()int pthread_mutex::unlock()int pthread_mutex::lock()pthread_rwlock::pthread_rwlock(pthread_rwlockattr*)pthread_cond::pthread_cond(pthread_condattr*)virtual bool pthread::create(void* (*)(void*), pthread_attr*, void*)void pthread::precreate(pthread_attr*)bool pthread::create_cancel_event()void __cygwin_lock_unlock(void**)void __cygwin_lock_lock(void**)%p waiting for %u mstimed out%p cancelled%p wait failed, %E%p sending signal %d%p starting threadthread creation failed, %Elooping%s:%d setting errno %dtimer_protectWFSO failed waiting for timer thread, %Eitimer%R = setitimer()%R = getitimer()%d = alarm(%d)%d = ualarm(%d , %d)useconds_t ualarm(useconds_t, useconds_t)unsigned int alarm(unsigned int)int getitimer(int, itimerval*)int __set_errno(const char*, int, int)int setitimer(int, const itimerval*, itimerval*)int timer_delete(timer_t)int timer_settime(timer_t, int, const itimerspec*, itimerspec*)int timer_create(clockid_t, sigevent*, timer_t*)int timer_gettime(timer_t, itimerspec*)int timer_tracker::settime(int, const itimerspec*, itimerspec*)bool it_bad(const timespec&)DWORD timer_thread(void*)dwHighDateTime %u, dwLowDateTime %utotal %08x %08x%s:%d setting errno %d%R = settimeofday(%x, %x)GMT%+d:%02d%d = time(%x)got %d error from build_fh_pc%R = utimes(%S, %p)%d = futimens(%d, %p)incoming utime act %xticks %d, CLOCKS_PER_SEC %duser_time %d, kernel_time %d, creation_time %d, exit_time %d/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/times.ccint clock_setres(clockid_t, timespec*)int __set_errno(const char*, int, int)int clock_getres(clockid_t, timespec*)LONGLONG hires_ns::resolution()int clock_settime(clockid_t, const timespec*)int clock_gettime(clockid_t, timespec*)LONGLONG hires_ns::nsecs()int utime(const char*, const utimbuf*)int futimens(int, const timespec*)cygheap_fdget::cygheap_fdget(int, bool, bool)int utimens_worker(path_conv&, const timespec*)time_t time(time_t*)long long unsigned int __to_clock_t(FILETIME*, int)int settimeofday(const timeval*, const timezone*)clock_t times(tms*)(knNInternal error: TP_NUM_C_BUFS too small: %u > %uInternal error: Out of memory for new path buf.Internal error: TP_NUM_W_BUFS too small %d >= %d.Internal error: Out of memory for new wide path buf./dev/ptmx%s:%d setting errno %dtty_list::mutexcan't create tty_list::mutex '%s', %Epty%d-from-masterexists %dttynum (%d) out of rangepty %d was not allocatedcygtty.slave_alive%s %pcouldn't open inuse event, %Ecouldn't create %screated event %sWFSO for mutex %p failed, %Epty%d allocatedNo pty allocatedlock_ttys::lock_ttys(DWORD)void* tty::get_event(const char*, _SECURITY_ATTRIBUTES*, BOOL)int __set_errno(const char*, int, int)void* tty::create_inuse(_SECURITY_ATTRIBUTES*)bool tty::exists()int tty_list::allocate(void*&, void*&)int tty_list::connect(int)int revoke(char*)cygheap_fdget::cygheap_fdget(int, bool, bool)USERNAMEUSERNtQueryInformationToken (TokenPrimaryGroup), %pNtQueryInformationToken (TokenUser), %pNtSetInformationToken(TokenOwner), %pNtSetInformationToken (TokenDefaultDacl), %pNtSetSecurityObject, %lxCannot get dacl, %Eunknown%s:%d setting errno %d/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygwin/uinfo.ccUSERDOMAIN=USERNAME=SYSTEMwhat %d, pw %pHOMEHOME is already in the environment %sSet HOME (from /etc/passwd) to %sSet HOME to default /home/USER/home/%sLOGONSERVER=/user not found in augmented /etc/passwdNtSetInformationToken (TokenPrimaryGroup), %pgsid not found in augmented /etc/groupGetSystemWindowsDirectoryW(), %Emalloc (%W) failed%SNtOpenFile(%S) failed, status %pNtQueryInformationFile(%S) failed, status %pmalloc (%d) failedNtReadFile(%S) failed, status %p%W curr_lines %d%W load %svoid pwdgrp::load(const wchar_t*)succeededfailedconst char* cygheap_user::env_systemroot(const char*, size_t)const char* cygheap_user::ontherange(homebodies, passwd*)char* getlogin()int __set_errno(const char*, int, int)void internal_getlogin(cygheap_user&)void cygheap_user::init()SNPCYGWIN_%ss%d.%d.%d%s(%d.%d/%d/%d)-WOW64i%d86`aRaCaaaa6aaa aa%s:%d setting errno %dcalling proc_subproc, pid %d, options %dproc_subproc returned 0%d = cancelable_wait (...)%R = wait4(%d, %p, %d, %p)pid_t wait4(int, int*, int, rusage*)int __set_errno(const char*, int, int)Cygwin requires at least Windows 2000.Windows 95/98/Me are not supported.NT-%d.%dwininfo_lockwincannot register window class, %Ecouldn't create window, %E ""\\""\ command line too long (>32K), return E2BIG%s:%d setting errno %d.exebool linebuf::fromargv(av&, const char*, bool)int __set_errno(const char*, int, int)expected allocbase: %p, stackbase: %pFailed to create process <%W> <%W>, %EWaiting for process %d failed, %Evoid wow64_eval_expected_main_stack(void*&, void*&)max system bytes = %10lu system bytes = %10lu in use bytes = %10lu BEGIN_CYGWIN_VERSION_INFO %%% Cygwin dll major: 1007 %%% Cygwin dll minor: 16 %%% Cygwin dll epoch: 19 %%% Cygwin dll old termios: 5 %%% Cygwin dll malloc env: 28 %%% Cygwin cygwin conv: 181 %%% Cygwin api major: 0 %%% Cygwin api minor: 262 %%% Cygwin shared data: 5 %%% Cygwin dll identifier: cygwin1 %%% Cygwin mount registry: 3 %%% Cygwin cygwin registry name: Cygwin %%% Cygwin program options name: Program Options %%% Cygwin installations name: Installations %%% Cygwin cygdrive default prefix: %%% Cygwin build date: %%% Cygwin shared id: cygwin1S5 END_CYGWIN_VERSION_INFO 2012-07-20 22:55conn/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygserver/client.cc!(msglen () && !_buf)msglen () <= _buflenerrnorequest header write failure: only %ld bytes sent of %ld, error = %d(%lu)request body write failure: only %ld bytes sent of %ld, error = %d(%lu)reply header read failure: only %ld bytes received of %ld, error = %d(%lu)no client buffer for reply body: %ld bytes neededclient buffer too small for reply body: have %ld bytes and need %ldreply body read failure: only %ld bytes received of %ld, error = %d(%lu)incompatible version of cygwin server: client version %d.%d.%d.%d, server version %ld.%ld.%ld.%ldrequest_code >= 0 && request_code < CYGSERVER_REQUEST_LAST(!_buf && !_buflen) || (_buf && _buflen)created: pid = %lu, master_pid = %lu, from_master = %lu, to_master = %lucygserver_running == CYGSERVER_UNKNOWN || cygserver_running == CYGSERVER_OK || cygserver_running == CYGSERVER_UNAVAILcygserver_running == CYGSERVER_OK || cygserver_running == CYGSERVER_UNAVAILcygserver un-availabletransportcygserver_running == CYGSERVER_UNKNOWN || cygserver_running == CYGSERVER_UNAVAILfailure in cygserver version request: %dprocess will continue without cygserver supportvoid cygserver_init()bool check_cygserver_available()int client_request::make_request()client_request::client_request(client_request::request_code_t, void*, size_t)virtual void client_request::send(transport_layer_base*)client_request::header_t::header_t(client_request::request_code_t, size_t)client_request_attach_tty::client_request_attach_tty(DWORD, void*, void*)bool client_request_get_version::check_version() const!_hPipe/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/winsup/cygserver/transport_pipes.cc!_is_accepted_endpoint!_is_listening_endpointTry to connect to named pipe: %W_hPipeError opening the pipe (%lu)lost connection to cygserver, error = %lu_hPipe != INVALID_HANDLE_VALUEerror reading from pipe (%lu)%s:%d setting errno %derror writing to pipe, error = %lu\\.\pipe\cygwin--lpcvirtual int transport_layer_pipes::connect()virtual ssize_t transport_layer_pipes::write(void*, size_t)int __set_errno(const char*, int, int)virtual ssize_t transport_layer_pipes::read(void*, size_t)virtual void transport_layer_pipes::close()acosacosfacoshacoshfasinasinfu<7~9B.?Iqr1?Oag?-DT!? s?-DT!?e/"+z<\3&I?^{??i71h!"33h!3?ɿIq?@?i>!kn==8=L>atanhatanhf__??42%ޑn۶m۶?m۶m?K ?P?4۶?n۶>u<7~Iqcosh}3@coshfԲB?Ain?>in?hf#w?OQ*?i}?hn? aBCо"]!?k"t?6UL? yw?? 8a땗Y6*?(>=c? Q_?ø@?M?8uYc?5WT?Qk?5c`&?\c?3oJ?#f>? VX? VX\š#WeRT@\g@f"(Ld@ 0O@&A%@`s4?5d `4?bt﮿JHG@,H([@pW!z@h(!+@q ){@!jR 5a@vp3@?8ܛN8~Y.ja@(u@C]d@Z_U 1@ޅp?Jo94?b-qBp6ct}@;@j$h@Q@ "\t@Q&V>@?@?ԧ>?Au?>u>VǷ;RℶI 9;c*=λ> Q==T>>h>;ZD<n_<3>=W ?1= VX? VX~+B8Ce"CWyB"(A1?!<w|?@EB CX!DoHCc C5Au #DAdD CKAԝL?!<CCΐEGEYDqCYA?@?ԧ>exp9B.@Q0-IexpfqB?v۪?UZ??@@@?7Iq`B q1?;?WT~6p8 :=@@@u<7~IqfmodfmodfZLgammagammagammafgammafhypothypotfj0y0-DT!ICj0fy0fIZj1y1-DT!ICj1fy1fIZjnyn-DT!ICjnfynfIZlgammalgammalgammaflgammafloglog10log10fZ??B.?v?x ?˖dF?xq?Y"$I??UUUUU?L??q1?7*?@>O>%3:>)c>%I>>`logfpow?powf?remainderremainderfscalbscalbfZYnu<7~$L`B Iq3sinhsinhfsqrtsqrtf?@?@-DT!????>??>@2?@>Z@9?@>L>> A@9B.?r1? A ??Zu<7~Yn$LIq`B 3-DT! @-DT!? =?uI?;h(?UDU?}o?UUUUUU?.Ÿ?Yl?ȊY*@K-':@?\3&<?I@?8O:F$= N>>*>.Ɲ=a30?-W@9@?h!3??I@9B.??r1??-DT!?\3&>*>.Ɲ=a30?-W@9@?.;3I?Z?B.?v?˖dF?Y"$I?UUUUU?x ?xq??L?q1?7>?@>%3:>%I>*?O>)c>>-DT!?-DT! @-DT! -DT!?-DT!!3|@!3|-DT!\3&<I@II?ɿ.3u<7~??Iq??!?! @|@!@zj@|"@%@!)@:F,@zj/@\G1@|2@k4@5@ۏ7@!9@:@:F<@Z=@zj?@L~@@\GA@lB@|B@C@kD@4E@E@F@ۏG@XH@!I@DNn)W'4b<ACcQޫa:n$MBI .)>5D.&pA~_֑9S99_(;/ Zmm~6 'FOf?-_'u={9Rk_]0V{Fk 6^ae_@h'sM1Vɨs{`k@T!?1cba=`a=sp.;m0_??.;I %{9K8?>?8ı!>RO~>>wQlV?LUUUUU??|Z:=+Z>}W>a*??IUUUUU???I@˖@@S@A/AIA1bAS{A:A˖A\AA~AAA1AASAB: BBBB\#B)B/B66B~5.Dp&_~A99S9_(;/Z mm6~' OF?f_-u'{=9Rk_]V0F{k 6a^e_h@Ms'1Vs`{k?CD57D57."??.21$C8?>?NGt1|4 7a :*=?./4/286 P9<*>??u<7~?IqB.?B.vkA>,%jV?lf?>UUUUU?@pq1?q17?Iq;?q1?7?L135U8a 6;*>@ ~2yO) c{pMnj=d6 Qg3"]@8iYP}@_n@@I,OwA@̕Gk p}Z/PcBgt׋(uŘ `N@d(~\m@`Z@8v@d ̢@o%KtENLJ5E B" Mؒr?}A@|JF9v@amn@~ø@7e@m'wB^IbC$96c$b&珯 YYe86@a@Bp@:M@f@9[6xd@ckNX@?TRfAC+ڃ(A= (k)A0,mٌ)==Lr?=W@鈇 `@ȝ @S@C^T@!ڠ;@mY{g@r#@Tz@ ۾Wj2>B?a @ݮ-OE@^Ye@!|d@C"aH@NT-@cMK@(jl<@O٪@ bkT;1>4>>ž?w'?o,@J)?@Kq@0@z]>@@Kp@""Ef@\|@eSj@1)j>Qg3"]@Ř `N@̕G}A@o%YYe86@m'w?9[6xd@C^T@ٌ)==C"aH@j2>z]>@kT;1>>mBP ?u<7~>?s39P ѱ>(??]t>ՄT;>WҦ?Ȃ??m0_?˙?ȳ?i=ŽԫN;WU>\s>k M6?lL??;P=-d>x?ɑp?NvSZ(ŘBoEەG|G :GH{Y›y7sBhD׺EeF`E/-RQhelBCs3DD-C̱W63 N-ñA4C2F]G GRh1p=V@|*B*C&C CBl1D_gEgEWEEY?ۉ!4*=?gAqTAAAC)2SD\DTCXBsBHlB/-ñA?#CBy- CBh1Aۉ!4>n?Iq><5.5G9€/l!4e8P<?5z*@.ey@2}E@݂'z@leE\@O'M܅@ŗ @,@- zi@}g=C?cn6@&E[@IR-@ ~@=cM@g6@WD@@Q^o0@ݞ!)>{![?^v@)ѦHA@7,MV@>GH@4IeA@_3 u@#7P|[@1.}֋@S.|mY@DU|> vB?@dq7|(@1@tIK@Պo5@,R_@ۢm@zk]@QN @?ygE0vSмt@$jeЦ[ަ,d@b@^WArS%A\wW$AiCY?K lmfOs1ithZQT@9{1@)d @ѺmW@K6|K@.oOȏө5TQ?3p]qL_GӇl\_fkg#G@>1@|DNh@T@K z@1 )p`&D&H>Nih3Jޣ)ERn96_5dx=@ho@I@)H%@><^~c@kleE\@=cM@}g=4IeA@ݞ!)>Պo5@DU|>?[ަ,d@ZQT@Cg#G@Oȏө5dx=@&D&>mBP ?u<7~? Fj>h>a,G W?=~*=,}Ɉ5>?3>d͹V_(?S~c ?m0_俸Vx>DHU_?,)vө?<f?*w9P=[:>NZ>dw%l*?M? e?m0_?=SAC+rESE,jB.dE5\GfGF?3h-=#@ʝBhD-DUmBwD#JE%ED O1={@Ez B*B|n?Iq?WU36.7l:=~VY-Fd15B9Y<"`ųX7*:ρ-15KdT9j(<"??mBP ??@(knN9B.@}Ô%IT??@(knNqBP!a!a!a!a"a$aM$aM$aE$aE$ax$ax$a?-DT! @?@Y?@Za??Vcb?lm4?-V?Dpx?5ߨɠ?8+?>5?sA?.ӂb?j쑺?AՔB?8$4a L?.n? f? ƍ'?PBü?E?9hs&^?a~H?徜?YO?x6?Ȱ}gij?@>[A}I?u.t?'?ӓ?tbE?@@@@C ZLgK?AˀC?8ϘJ?\.lf?;UUUUU?i}ɐ? +g?$ N?PDvI?o\G?]@?aWZj?|SU?PP?+%@aץ@RBtp>M,?]?oS?O@~?bU>?7X?}P?ƶ@?kحg?{T"?L?(a(a(au(a(a6(a:+a:+a/+a/+a[+a[+a?I@?@K?@ [>?k{9v:;GM=^>90 :;(<Z='gf:wq;=7<R1=g85:@<>z̦>Z$\>?#=6K:T8?;-?@@@@պ=[:\: P:a 6;=>7gg9T:~;=u,<8E84:n=;^<[Kz?:?"?R;r=D?-9@.@Z`PD?6+Y=&{?L >'T5[>??CL>@??u<7~;?D] T>>UUUUUU??+eG?ZNEJ(~?eɓJ?A`t?M&QUU?o۶m?33333?@@O8v?[/>: ?+eGkA>,%jV?lf?>UUUUU?@0C0??5??Iq?p6>>?;?KBS>U2l>>m>?@@8v?Ý6O8v?<83`B r1?r1?5L135U8a 6;*>@??}G}}G}?3t<{?½|??-DT!?\3&2?h&0?W?n&?A?cUUUUU??I?h!"3_E8&:ik;'<>S7z879H޾:7< ]=>?-DT! @T! @F !>nE1cbj+i)+`>Kacosacosfasinasinfatan2atan2fhypothypotfcoshcoshfexpexpfy0y0fy1y1fynynflgammalgammafloglogflog10log10fpowpowfsinhsinhfsqrtsqrtffmodfmodfremainderremainderfacoshacoshfatanhatanhfscalbscalbfj0j0fj1j1fjnjnfgammagammafNaZaPZa VaUa@[a`XaSa`SaZa`YaTaTa`WaWapRa RaZaYaUa5UaXaWaSaRaYaXaPTaTaVapVaQauQa QaPaOaOaPa0Pa@OaNa@NaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaZaPZa VaUa@[a`XaSa`SaZa`YaTaTa`WaWapRa RaZaYaUa5UaXaWaSaRaYaXaPTaTaVapVaQauQa QaPaOaOaPa0Pa@OaNa@NaNa?@!?-Dt>F<`Qx;9@ %z8"6i53K>A? ?973.P+'"D;C>A?LC_ALLLANGGB2312GBKPOSIXCASCIIcjknarrowUTF-8UTF8EUCJPEUCJPKREUCKRCNEUCCNSJISISO8859ISO-8859-CPKOI8CP20866CP21866GEORGIANPSCP101PT154CP102TIS620CP874BIG5jakozh}a|a0|a0xa{a0xaa{a0xaUza0xaza0xa0xa0xa0xaya0xa0xaya0yaxa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa}a|a0|a0xa{a0xaa{a0xaUza0xaza0xa0xa0xa0xaya0xa0xaya0yaxaya}a~a}a}a}aN}a/.LC_COLLATELC_CTYPELC_MONETARYLC_NUMERICLC_TIMELC_MESSAGESyay{a{a{a{a{a{asaCya(aja[aLa=a.aaaaaaԿaſaaaa(aazaka(a\aMa>a/a aaaa(aaվaƾa#a#aa#a#a#a#a#a#a#aaaa#a{ala#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a]a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#aNa(a(a(a(a?a(a0a!aaaaa#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#aֽa#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a(aǽaa(aaaa|ama^aOa@a#a#a#a1a"aaaa#a#a#aa#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a׼aȼa#a#a#a#a#a#a#a#a#a#a#a#a#a#a#aa#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#aaaaa#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a}a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#aqa#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#aea#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a(a(a7aAZazEptvwz}%1VYa!J`inoq/M$(9=PXafoqry (*0235689Y\^fort (*02359=\]_afoq (*359=XY`afo (*9=`afoz.0:@EGNPY )@GIl*?IPUZ]aefnpuHJMPVXZ]`Zlo  1@Q`lnp wFmpt T3EKPY#@IM} EHMPWY[]_}q $&(-/9<?EIN`.0^`%0eo/!)158@ACDF=Pptv!:AZf &(:<=?MP]@t0J 578@DFJPR46NPnp,1=?BFW_y{|4Aa`apaaaaaaaaaaPa ~wz~%1VY_a!^` JM-0>9<NPUXry (*0235689<>BGHKMQY\^fu (*02359<DGHKMVW\]_cfq (*359=DFHJMUVXY`cfox (*9=DFHJMW`cfuy:?[GIlqHJMPVXZ]`Z_|  6@S`lnprs w +0;@Dmpt^`|KP|7;IM EHMPWY[]_}'*djqt&@J` ')KMORV^aLPY.0^`%0eo1?A-1 +@_bs|+09@wS_|6@MPY\{-0mp68<>@ACDF?P &0RTfhkptv &(:<=?MP]37 #0J 578@DFJPR+0 .1=?BFJNW_y{|1@H4 ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaada_aaXaQaaa_aaJaCa<a_aa_aa_aa_aa_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}aaavaaaaaoaaahaaaaaaaZaaaaaaaaaaaaaUaaaUaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaaaaNaGa{|}5ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahaahaahahahaahahaha.a.a.ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahaha'ahahahahahahahahahahahahahahahahahahahahaha ahahahahahahahahahaaaaha aahahahaaaahahahahahahahahahahahahahahahahahahahahahahahahaaaahahaahahaahahaatolowertoupperalnumalphablankcntrldigitgraphlowerprintpunctspaceupperxdigit1apaaa a aa a a a aa a a a$a a aga aa a aaoK^pp0J  < < A H M M Q T b c   < < A B G H K M p q   < < ? ? A C M M V V > @ F H J M U V A C M M 114:GN557799q~-0226799XY`__24RSrs   "'(229;446:<<BBks  * . ` c j o *0/000 %& #      8 : ? ? gisBD &'++1388?BDDHKMMRSfgkkQQaaOQQ        " $ ' 0 0 2 3 5 5 ; ; > > t t   !!!! ! !!!!!!!"!&!&!+!+!S!T![!^!`!k!p!y!!!!!!!!!!!"""""" " """""""""" "#"#"%"%"'","."."4"7"<"="H"H"L"L"R"R"`"a"d"g"j"k"n"o"""""""""""""##`$$$K%P%s%%%%%%%%%%%%%%%%%%%%%%%%%%%&& & &&&&&&&&&@&@&B&B&`&a&c&e&g&j&l&m&o&o&='='v''rEOF` '`|'`&'`;'`<'`>'`('`)'`{'`}'command substitution--wordexp--protectedbash/bin/basha`a@aaa0aaa%aaaaaaaaa aaaaaa a a a a a a aa a a aa aa a aa a a a a a a a aa aaaaaa aa a a a aaaa a aa aa a aaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaa.aaaaaaaaaa^a^aa^a%aNa^aINFinfNANnan0123456789abcdef0123456789ABCDEF(null)01a a a1a a a a,&a a a&a'a aS2a>'a a'a1a1a1a1a1a1a1a1a1a a a a a a a a'a a*ae+a'a'a'a a a a aC/a a a.a a a a.a a,a a a-1a a a a a a a a a'a a*aB2a'a'a'a1aB2a#a a-a0-a+aU,aU/a#a a.a#a.a a a0a a#a0000000000000000 >A?%.3s %.3s%3d %.2d:%.2d:%.2d %d JanFebMarAprMayJunJulAugSepOctNovDecSunMonTueWedThuFriSat : len < (u_int)LONG_MAX/home/corinna/src/cygwin/cygwin-1.7.16/cygwin-1.7.16-1/src/src/newlib/libc/xdr/xdr_rec.csendsize < (u_int)INT_MAXrecvsize < (u_int)INT_MAXxdrrec_create: out of memoryaКaaa aa@aaaPaxdrrec_createxdrrec_inline NaN -Infinity Infinity NaNE%d5a9a9a9a9a9a9a9a9a9a5a9a9a5a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a5a9a9a9a9a9a9a9a9a9a9aa5aaa9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9awa9a9a9aa9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9awa9a9a9aa9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a$ae%lda`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a0aqa`a`a`a`a\a`a`a`a`a`aaaaaaaaaaa`a`a`a`a`a`a`aa`aaaaaa`a`a`a`aa`a`a7a`a`a`a!a`a`a`a`aa`a`aa`a`a`a`a`aa`aaaaaa/aZaa`aa`a+a>a}a`a`a(aLaa`a`aa`aLaMaPaMaaPaaaaaaaaaaaPaPaPaPaPaPaPaaPaPaPa%a aPaPaaPaPaPaPaaPaPaPaPaPaaPaPaPaPaiaPaPaPaPaPaPaPaaPaPaPa%a aPaPaaPaPaPaPaaPaPaPaPaPaaPaPaPaPaiaPaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;a  a aavavavavavavavavavavavavavavavavavavavavavavavavavavavavavaa aa-C6?EUC-KRKOI8-RCP932EUC-JPGB2312TIS-620PT154GEORGIAN-PSKOI8-UANSI_X3.4-1968EUCJPEUCKREUCCN8742086621866101102paa`aaPaa@aa0aa aaaaaaaaaaaaaaaaaa`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`ap`a``aP`a@`a0`a `a_a_a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^ap_a`_aP_a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a@_a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a0_a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a$_a^a^a^a^a^a^a^a^a^a^a^aaa aaaaa a$a(a,a0a4a8a<a@aDaHaLaPaT@a@a@a@a @a@a@a@a@a @a$@a(@a,@a0@a4@a8@a<@a@@aD@aH@aL@aP@aT@aX@a\@a`@ad@ah@al@ap@at@ax@a|@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@apa papapaaaaa aaaaa a$a(a,a0a4a8a<a@aDaHaLaPaTaXa\a`adahalaaaaa %s: %s %s %s%.*d%s%0.*d+-%.2d%2d%s%.2d/%.2d/%.2d%luY-%m-%d.*u%.3d%.2d:%.2d%.2d:%.2d:%.2d%d%+03ld%.2ld~a$xa$xa$xa$xa$xa$xa$xa$xa$xa$xa$xa$xa$xa$xa$xa$xa$xa$xa$xa$xa$xa$xa$xa$xa$xa$xa$xa~aaua3a$xa]a a;axa$xa$xa$xaya$xa$xaUza$xaza9{a{a{aaa~aa{a$xa$xa$xa$xa$xa$xaha}aw}a}a}a$xa~a}a$xaaXaxaa|a$xaUza$xa|a$xa؂aa$xaJataa)anfinityanpa3a3a3a3a3a3a3a3aіaіaіaіaіa3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3aіa3a3a3a3a3a3a3a3a3a3aȖa3aaaaa\aaaaؗҜ<3#I9=D2[%Cod(?@A5?55?5?t/tmp%s/%s%x.%xTMPDIRwb+wb+a0aaaaaaUaaPaaaPaRaaaaݶaa{aaaaݶaݶaݶaݶaݶaݶaݶa{aݶaݶaݶaoaݶa{aݶaݶaaݶaݶaݶaݶaݶaݶaݶaݶaaݶaWaaaaaݶaaݶaݶaݶaݶaoaaoaݶaݶaoaݶaaݶaݶaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaaaaaaaaaaaUaaaaaaUa.a.aa.aaa.a0123456789ABCDEF0123456789abcdef(null)^axaxaaxaxaxaaxaxaaaxaa axa1aFaFaFaFaFaFaFaFaFaxaxaxaxaxaxaxaxaxaa$axaxaxaxaxaxaxaxaxaxavaxaxaxaaxa axaxasaxaxaxaxaxaxaxaxaxaxaaaxaxaxawaaaxa)aFa/aaaaxaaaaxaxaaxaa0000000000000000 aaaaa#aaAaaaaaTaYaa^aaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaaaaaaaAaaaaaaAaaazaaaaaaaaaaaaaaaanaaaaaEaaaaaaaaaaa-aEaaaaaEaaaaanaEanaaanaaEaaaEaa+aaaaJaqa0123456789abcdef0123456789ABCDEFINFinfNANnan(null)0aaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRaaaaaaaaaaaaaaaaaaaaaaaaOaaaaaOawaajaaaaa*aaa~aaaaBaa~a0000000000000000 >A?e%ld;a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6a-6aQ;aK6a-6a-6a-6a-6a9a-6a-6a-6a-6a-6a :a :a :a :a :a :a :a :a :a :a-6a-6a-6a-6a-6a-6a-6a$:a-6a9:a-6a$:a$:a$:a-6a-6a-6a-6a@7a-6a-6a-6a-6a-6a-6a_7a-6a-6a-6a-6a7a-6a-6a 8a-6a-6a-6a-6a-6a$:a-6a_Ja8a$:a$:a$:a9a9a@7a-6a8a-6af9a8a9a-6a-6aI9a^9a8a-6a-6a7a-6a^9a?a<a?a?a<a\?a>a>a>a>a>a>a>a>a>a<a<a<a<a<a<a<a=Aa<a<a<a@a@a<a<a<a<a<a<a<a0@a<a<a<a<a<a@a<a<a<a<a@a<a<a<a<a<a<a<a=Aa<a<a<a@a@a<a<a?a<a<a<a<a0@a<a<a<a<a<a@a<a<a<a<a@aDa4CaDa4Ca4CaDamDamDamDamDamDamDamDaDaDa4Ca4Ca4Ca4Ca4Ca4Ca4Ca Da Da Da Da Da Da4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca4CaCa4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca Da Da Da Da Da Da4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca4Ca4CaCa  %s%.*d%s%0.*d+-%.2d%2d%ls%.2d/%.2d/%.2d%luY-%m-%d.*u%.3d%.2d:%.2d%.2d:%.2d:%.2d%d%+03ld%.2ldma"ga"ga"ga"ga"ga"ga"ga"ga"ga"ga"ga"ga"ga"ga"ga"ga"ga"ga"ga"ga"ga"ga"ga"ga"ga"ga"gama"nanakoa"gasarasaga"ga"ga"gaia"ga"gaia"ga>jajakaVkaWtataoapaAua"ga"ga"ga"ga"ga"gaualalaGmaGma"ga8vala"ga=ta6wagavala"gaia"gala"gaRralra"gapapa qaqaxdr_array: out of memoryxdr_bytes: out of memoryxdr_string: out of memoryxdr_reference: out of memoryaPaaaaaaa@aЙaa aaaaaИaaapa0a aaaaapaaaaJanFebMarAprMayJunJulAugSepOctNovDecJanuaryFebruaryMarchAprilJuneJulyAugustSeptemberOctoberNovemberDecemberSunMonTueWedThuFriSatSundayMondayTuesdayWednesdayThursdayFridaySaturday%H:%M:%S%m/%d/%y%a %b %e %H:%M:%S %YAMPM%a %b %e %H:%M:%S %Z %Ymd%I:%M:%S %pASCIIJanFebMarAprMayJunJulAugSepOctNovDecJanuaryFebruaryMarchAprilJuneJulyAugustSeptemberOctoberNovemberDecemberSunMonTueWedThuFriSatSundayMondayTuesdayWednesdayThursdayFridaySaturday%H:%M:%S%m/%d/%y%a %b %e %H:%M:%S %YAMPM%a %b %e %H:%M:%S %Z %Y%I:%M:%S %p@aDaHaLaPaTaXa\a`adahalapaxaaaPaaaaaaaaaaaaaaaaaaaaaaa a)a>aAaDapaxaaaPaaaaaaaa\a_akakakakakalarazaaaaaaaaaaaaaaaa aa a.aBaRadava~aaaaaaaaaaaaa a2aDanata|aaaaaaa^[yY]^[nN]yesnoASCII^[yY]^[nN]yesnoaaaaaaaaa.ASCII.@aBahaCaJaNaASCIIlalalalamalalamamamamamamamamamamamamamamaapapapapapapaASCII01234567890123456789 ata&a(a*a,a.a0a2a4a6a8a:a>aBaFaJaNaRaVaZa^a3aгaa3a`aa3aaaa+aHaaa aUa3a}a'aa3a3a3a}a}a}a}a}a}a}aa}a}a}aa}aa}a}a]a}a}a}a}a}a}a}a}a3a}aa]a3a3a3a}a]a}a}a}a}aa]aa}a}aa}a]a}a}a]aa2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2aa2aa2a2a2a2a2a2aa2a2aa2a2a2a2a2aaεaεaYaεaaaεa0123456789ABCDEF0123456789abcdef(null)YaaaaaaaNaaaaaaaaaaaaaaaaaaaaaaaaaaaa$a aaaaaaaaaaaaaaanaa4aaaaaaaaaaaaaa$aaaaabaaGaaaataaaGaanaNa aaaaaNa                   0000000000000000 a`a@aaa0aaa%aaaaaaaaa aaaaaa a a a a a a aa a a aa aa a aa a a a a a a a aa aaaaaa aa a a a aaaa a aa aa a aaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaa.aaaaaaaaaa^a^aa^a%aNa^aINFinfNANnan0123456789abcdef0123456789ABCDEF(null)0aaaaaaaaaaa/ aa1 a> aa a a a a a a a a a aaaaaaaa aa.aa a a aaaaa aaaaaaaaaaaaqaaaaaaaaa aa.a a a a aa aaa"aaa?aaaaaaaaaaaa0000000000000000 >A?e%ld?Aa@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@aBaCa@a@a@a@aBa@a@a@a@a@akBakBakBakBakBakBakBakBakBakBa@a@a@a@a@a@a@aBa@aAaZAaBaBaBa@a@a@a@aNAa@a@aAa@a@a@aAa@a@a@a@a=Ba@a@aCa@a@a@a@a@aBa@aCaCaBaBaBaBaBaNAa@aAa@aCa}CaBa@a@aBai@alAa@a@a=Ba@ai@aGaEaGaGaEaHanEanEanEanEanEanEanEanEanEaEaEaEaEaEaEaEaTHaEaEaEaGaGaEaEaGaEaEaEaEaHaEaEaEaEaEamHaEaEaEaEamGaEaEaEaEaEaEaEaTHaEaEaEaGaGaEaEaGaEaEaEaEaHaEaEaEaEaEamHaEaEaEaEamGaVKaIaVKaIaIaKaJaJaJaJaJaJaJaJaJaIaIaIaIaIaIaIaJaJaJaJaJaJaIaIaIaIaIaIaIaIaIaIaIaIaIaIaIaIaIaeJaIaIaIaIaIaIaIaIaJaJaJaJaJaJaIaIaIaIaIaIaIaIaIaIaIaIaIaIaIaIaIaeJa  ?$@Y@@@@j@.AcAחAeA _BvH7BmB@0BļB4&k C7yAC؅W4vCNgmC=`XC@xDPKDMDJ-DyCxD7yACnF?O8M20HwZA?e%ld aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxaaaaaababababababababababaaaaaaaaMaa*aaMaMaMaaaaavaaaaaaaaaaaaaaa3aaaaaaMaaa aMaMaMaaavaaaa*aaaaaa\aaaaaa\aaRaaaRaaLaLaLaLaLaLaLaLaLaRaRaRaRaRaRaRa!aRaRaRaaaRaRaRaRaRaRaRaYaRaRaRaRaRa6aRaRaRaRaDaRaRaRaRaRaRaRa!aRaRaRaaaRaRaaRaRaRaRaYaRaRaRaRaRa6aRaRaRaRaDawaawaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaa  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaPaPaPaPaPaPaPaPaPaPaaaaaaaaaafaaaaaaaaaTaaaaaaaaaaaaaaaaaaaaaaaaaaaa)aaTaaaaa1aUaaaaaaaaaaaa aa a aaaaaaaaaWaWa a a a a a a aaaaaaa a a a a a a a a a a a a a a a a awa a a a a a a a aaaaaaa a a a a a a a a a a a a a a a a awa  aaa`a`WaMaMaPWa>aRa@aAa>aVa Baa@a`Ra aWaaa aFa aa aa a`#aNaWaapa0WagaEaXapZaTaQa@ca`Ma`a]apaaaaqaSaRa RaQa@QaPa`PaOaOaaaaaaOaWa@RaPRa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaaPaaa`a aa` aRaJaIaPaa0aPaPapaaaaaa a0a@aPaOa@OaMaQa`Qaeaa`a`WaBaBaPWa>aRa aAa>aVa Baara`RaDaWaDaIapAa@Aa \apLaLaKaJa Ka@WaWaapa0WagaEaXapZaPTaSa@capSaBa]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaTaUaNa>a0NaMaPMaLaRaSaRaa`a`Wap\a@\aPWaaRaaЍa>aVa Baaa`RaaWaDaapAa@Aa \apLaLaKaJa Ka@WaWaapa0WagaEaXapZaPTaSa@capSaa]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa a0aOaWa@RaPRaaa0RapRaRaRaWa`$ a$ a % aRa@Wa WaTaUaNa>a0NaMaPMaLa@apXaWaa`a`Waaa`aPWa>aRaaЍa@ aVa Baa a`RaaWaDa0 apAa@Aa \apLaLaP a a Ka@WaWa apa0WagaEaXapZaPTaSa apSa a]a`aдa@aa0 aSaRa RaQa@QaPa`PaOaOaaPa@a aaOaWa@RaPRaaa0RapRaRaRaWa@# a# a$ aRa@Wa WaTaUaNa>a0NaMaPMaLa@a ]a\aa`a`WaeadaPWa>aRa a`a>aVa Baa)a`RaaWa.aaaaapLaLaKaJa Ka@WaWaapa0WapaaXapZaPTaSa`apSa@a]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaTaUa)aapaaapaRaaa0aa/aPaaa a a a`ea0eaeapaaeaeaeaa`a`Wapja@jaPWa>aRaa`a>aVa BaaPa`RaaWaDaIapAa@Aa \apLaLaKaJa Ka@WaWaapa0WagaEaXapZaPTaSa`fapSaa]a`aдa@aaaa@aaaaPa jajaOa`aaa aaOaWa@RaPRaa0a0RapRaRaRaWa' a ( ap( aRa@Wa WaTaUaNa>a0NaMaPMaLaRapfafaa`a`Wa@aaPWa0a aaaaoa Bapa0a`Ra%aWa`a@aapaapLaLaKaJaa@WaWaa a0Waa!aaaPTaSajapSaWa]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOa0oa@RaPRa0jaHa0RapRaRaRaWa) a) ap* aRa@Wa WaTaUaNa>a0NaMaPMaLaRakajaa`a`WasasaPWa@aRa`oaPoa>aVa Baa@aaaWaDaIapAa@Aa \apLaLaKaJa Ka@WaWaapa0Waa0aXapZaPTaSaЭapSa@a]a`aдa@aa`a`aRa RaQaa0aaa@aaaa aaOaWa@oaPRa0jaHa0RapRaaRaWa% a% a0& aRaa WaTaUaNa>a0NaMaPMaLaRa paoapsaЋaaaa`a`WaxawaPWa>aRaasa>aVa Baapta`Ra@aWaDaIapAa@Aa \apLaLaKaJa Ka@WaWaapa0Wa@aaXapZaPTaSasapSaBa]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaTaUaNa>a0NaMaPMaLaRapta taa`a`Waa aPWa>aRa aAa>aVa Baaa`RaDaWa`aIapAa@Aa \apLaLaKaJa Ka@WaWaapa0WaPaaXapZaPTaSaapSaBa]aaaa aqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaTaUaNa>a0NaMaPMaLaRapxa xaa`a`WaaaPWa>aRaPapa>aVa Baaa`RaDaWaaIapAa@Aa \apLaLaKaJa Ka@WaWaapa0WagaEaXapZaPTaSa@capSa0a]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaTaUaNa>a0NaMaPMaLaRa|a{aa`a`Wa0aaPWa>aRa a`a>aVa Baa0Ia`RaaWaEaaaaapLaLaKaJa Ka@WaWaapa0WapaaXapZaPTaSa`apSa@a]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaTaUa?aP3apaaa?aRaaPa0@aBaa`a`Wapa@aPWa>aRa a`a>aVa Baara`RaaWaraaaaapLaLaKaJa Ka@WaWaapa0WapaaXapZaPTaSa`apSa@a]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaTaUa)aoapaaapaRaaPapa@maa`a`WaaaPWa>aRa a`a>aVa Baaa`RavaWa@aaaaapLaLaKaJa Ka@WaWaapa0Wava`vaXapZaPTaSa`apSa@a]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaTaUa yawa@vaPvaa`waRaaa`a@zaa`a`WaЏaaPWa>aRa aAa>aVa Baara`RaDaWaDaIapAa@Aa \apLaLaKaJa Ka@WaWaapa0WagaEaXapZaPTaSaЭapSaBa]a`aдa@aaqaSaRa RaQa@QaPaaa@aaaa aaOaWa@RaPRa0jaHa0RapRaaRaWa( a) aP) aRaa WaTaUaNa>a0NaMaPMaLaRa`aaaЋaaaa`a`WaaaPWa>aRa a`a>aVa Baaa`RaaWaDaaaaapLaLaKaJa Ka@WaWaapa0WapaaXapZaPTaSa`apSa@a]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaTaUa!a>apaaaaRa@aaaaa`a`WaaPaPWa%aRa%aAa>aVa Baa&a`RaaWaDaIapAa@Aa \apLaLaKaJa Ka@WaWa*apa0Wa'a &aXapZaPTaSaapSaBa]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@Raa0jaHa0RapRaRaRaWa* aP+ a+ aRa@Wa WaTaUaNa>a0NaMaPMaLaRa aapaaЗaaa`a`WaЛaaPWa>aRa@aAa>aVa Baaa`RapaWaaa aFa aa aa a`#aNaWaapa0WagaEaXapZaTaQa@ca`Ma`a]apaaaaqaSaRa RaQa@QaPa`PaOaOaaaaaaOaWa@RaPRa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaaPara\a`a aaaRaPaaa`a`WaaaPWa>aRa aAa>aVa Baara`RaDaWaDaIapAa@Aa \apLaLaKaJa Ka@WaWaapa0WagaEaXapZaPTaSa@capSaBa]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRa0jaHa0RapRaRaRaWap a a aRa@Wa WaTaUaNa>a0NaMaPMaLaRa@aaa`a`WaУaaPWap\aRa\apa>aVa Baaua`RaPaWa`]aIapAa@Aa \apLaLaKaJa Ka@WaWa`apa0WagaEaXapZaPTaSapaapSa^a]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRaa@a0RapRaRaRaWa( a) aP) aRa@Wa WaTaUaNa>a0NaMaPMaLaRa0aaa`a`WaaPaPWa>aRa aAa>aVa Baa`+a`RaDaWaDaIapAa@Aa \apLaLaKaJa Ka@WaWaapa0Wa*a*aXapZaPTaSa*apSaBa]a aaaaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaTaUaNa>a0NaMaPMaLaRa@aaa`a`WaaaPWa>aRaaЍa>aVa Baaa`RaaWaaIapAa@Aa \apLaLaKaJa Ka@WaWaapa0WagaEaXapZaPTaSa@capSa0a]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRaa a0RapRaRaRaWa, a) aP) aRa@Wa WaTaUaNa>a0NaMaPMaLa@a0aaa`a`WaaaPWa>aRa a`a>aVa Baaa`RaaWaaaaaapLaLaKaJa Ka@WaWaapa0WapaaXapZaPTaSa`apSa@a]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaTaUa!a`apaa`a aRaa0aaaa`a`Wa`a0aPWa>aRa aAa>aVa Baa@a`RaDaWaDaIapAa@Aa \apLaLaKaJa Ka@WaWaapa0WagaEaXapZaPTaSa@capSaBa]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaTaUaNa>a0NaMaPMaLaRaSaRaaPa`WaaPaPWa>aRa a`a>aVa Baaa`RaaWaaaaaapLaLaKaJa Ka@WaWaapa0WapaaXapZaPTaSa`apSaa]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaTaUa@aa@aPaPaaRaаaaaaa@aaaaa a`a0a aaa aa`a`Wapa@aPWa>aRa@aAa>aVa BaapFa`Ra aWaPa`a aFa aa aa a`#aNaWaapa0WagaEaXapZaTaQa@ca`Ma`a]apaaaaqaSaRa RaQa@QaPa`PaOaOaaaaaaOaWa@RaPRa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaaPa*a`ea`a a a` aRa aеaa`a`WaaaaaRa`aa>aVa BaaaaaPaaIap aa \apLaLaKaJa Ka@WaWaapapaaaXapZaPTaSaapSaa]a`aдa@aa`aaRa RaQaPaaaa@aaaa aaOaWa@RaPRa0jaHa0RapRaaRaWa' a& a@' aRaa WaTaUaNa>a0NaMaPMaLaRaaaaЋaaPaa`aa`a`WaaaPWa>aRaPapa>aVa Baa`a`Ra`aWaaIapAa@Aa \apLaLaKaJa Ka@WaWaapa0WagaEaXapZaPTaSaеapSa a]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRaaa0RapRaRaRaWa( a) aP) aRa@Wa WaTaUaNa>a0NaMaPMaLaRa0aнaa`a`WaaaPWa>aRa aAa>aVa Baaa`RaaWaDaIapAa@Aa \apLaLaKaJa Ka@WaWaapa0WaaaXapZaPTaSaapSaa]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaTaUaNa>a0NaMaPMaLaRa`aaa`a`WaaaPWaaRa aAa>aVa Baara`RaaWaDaIapAa@Aa \apLaLaKaJa Ka@WaWaapa0WagaEaXapZaPTaSaapSaBa]a`aдa@aaqaSaRa RaQa@QaPaaa@aaaa aaOaWa@RaPRa0jaHa0RapRaaRaWa& a& a@' aRaa WaTaUaNa>a0NaMaPMaLaRaPaaaЋaaPaa`a`WaaaPWaaRaa a>aVa Baa0aaaaDaIapAa@Aa \apLaLaKaJa Ka@WaWaapa0WapaaXapZaPTaSaapSaa]a`aдa@aaqaaRa RaQa`aaaa@aaaa aaaWa@RaPRa0jaHa0RapRaaRaa& a& a@' aRaa WaTaUaNa>a0NaMaPMaLaRapaaa@aaPaa`a`Wa0aaPWa>aRa a`a>aVa Baa0a`RaaWa`aaaaapLaLaKaJa Ka@WaWaapa0WapaaXapZaPTaSa`apSa@a]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaTaUa)aapaaapaRa`aaPaa)a)a)a)apaaaPa aa a`aaa@aa`a`Wapa@aPWa>aRa aa>aVa Baa0a`RaPaWaaIapAa@Aa \apLaLaKaJa Ka@WaWaapa0Wa0aaXapZaPTaSaapSaa]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@Raa0jaHa0RapRaRaRaWa( a) aP) aRa@Wa WaTaUaNa>a0NaMaPMaLaRaaaa`a`Waa`aPWa>aRaaЍa>aVa Baara`RaaWaDaIapAa@Aa \apLaLaKaJa Ka@WaWaapa0WagaEaXapZaPTaSa@capSa0a]a`aдa@aaqaSaRa RaQa@QaPa`PaOaOaaaa aaOaWa@RaPRaaa0RapRaRaRaWa( a) aP) aRa@Wa WaTaUaNa>a0NaMaPMaLa@aaaaa@aaa aaaPa0aaaapaaaНaaa%| ,+aNAB FOU AB | D0-a AB IIHw AA A AH h A| T@.aEAB FIKa AA r AA i AB  AA | 8/aAB F] AAA G b AAA A Pv-$(##$Bb 8"d d d td d d te @ue u``P7 1q9" Lb Vb `b i u0vi i i jb vP`pPpPptb ~b b J0P`r b 9"D"b b b b b b b b b b c c c c (c Ї2c f p@Hf $<"i @i3 3@i Ji ^i hi ri  3 i 036=@:i i j j j &j c @A@BCpFP`pPpIIIJ J@JPJJJJJDj Nj Xj bj vj j j j c j j j j j j j @D>k *k \k 0>fk pk zk k k K Kk @KL`MPNlk k l $l 8l Bl `l jl l l @OOl c l l l l l l l m m m (m 2m z PHz \z pЄ@@fz zz c z z dh `{ t{ ~{ { { { { { { P{ { `  { h 4 { | 3 | | (| 2| <| F| P| Z| d| x| | P } } } } } } } } } } } ~ ЋК~ c ~ &~ 0~ pp PD~ N~ X~ l~  p~ `@e~ ~ Юc @ ~ @~ ~ ~ ``0f p z   <"   г   $ . 8 B L ` t c   ( c F P Z c d n x d ȁ @ " @ Rf d d "d g 6d Jd ^d rd d d d P !d / d d d td d d te @ue ue &e !p"0# $0e :e xc 0%'' '))\f De Ne `ж Јpf zf f 0p*0+Xe be pЕ``+,Pp-.0Н` le ve e e e e `pe e e e e e e e f f f 0mf ///0p1@20@У f P*f 4f >f @Hf ff f f f f f g ` h h a h h h ff f f f f f f f f j%g ` h h h a h h h h h i i p i rPjp0"i ,i Lb Vb `b 6i 3 3@i Ji Ti i ^i hi ri  f 3 f |i i i i u0vi i i 036=@:i i i 0 0 0 i i i i j j j &j 0j f @Apа@BCpFJJ:j Dj Xj bj lj vj j j j c j j j j j pj j 0;@9k 99<== k k k *k 4k >k =0=;Hk Rk \k 0>fk pk k k k k k K Kk k k k @KL pk `MPNlk k l l l $l .l 8l Bl Ll Vl `l jl g tl ~l l @OOl c l l l l l l m m m m (m p Hp Rp \p fp pp zp p p p p p p "p p p p g p p ` p 0U Vp q q q WWкg g < ; g g g g WX$q f 8q Bq Lq Vq 0`q `@`XPXpXX 00p`@XZ\^`bjq tq ~q q @eep2e g@hpiq q q g q кq III`q q q jklmp@sttq q r r a r J J@J 01r 2r u Hu Ru \u fu pu zu u u u u u u u u u u u u u v v v $v .v 8v Bv Lv Vv `v jv tv ~v v v v v v v v v v v v v w w w w (w 2w z Fh PJJJHz @Ph Zh Rz \z pЄ@@fz pz zz c z z z 5 z z z z z dh z z z z { { { ${ .{ 8{ B{ L{ V{ nh xh h `{ j{ t{ ~{ { { { P{ Ъ { ` {  0x{ h 4 { | | !h 3 | | (| 2| <| h F| h d P| Z| n| x| | | | | | | | | | | | | | | | | | h | | | } } } "} ,} 6} @} J} T} ^} h} r} |} } P@ } } } h } } } } } } } } } ~ ЋКe ~ c ~ 0~ :~ p p p PD~ N~ X~ b~ l~  pv~ `~ `@e~ ~ ~ ~ Ю0f@ ~ ~ ~ ~ ~ @~ ~ ~ ~ ``0    * 4 > H R \ f z p0 0         г0    p$ . 8 B L V ` j @t ~ Ā ΀ ؀ c   ( c 2 < F P Z c d n x d ȁ ҁ ܁ @`0@ ` @@`p@ P        @P`  " , 6 @ J T ^ h r | ‚ ̂ ւ    & 0 : D N X b l v ƃ Ѓ ڃ  Yp[p]`_pac-$-$-$-$-$-$-$-$-$-$.$.$.$*.$;.$D.$R.$_.$s.$.$.$.$.$.$.$.$.$.$.$/$/$/$&/$0/$;/$C/$L/$V/$a/$k/$v/$~/$/$/$/$/$/$/$/$/$/$/$/$/$0$0$0$ 0$)0$20$F0$M0$Z0$d0$y0$0$0$0$0$0$0$0$0$0$0$ 1$1$%1$71$D1$O1$[1$f1$q1${1$1$1$1$1$1$1$1$1$2$2$(2$C2$S2$h2$y2$2$2$2$2$2$2$2$2$2$2$2$2$3$3$3$$3$13$=3$K3$V3$c3$i3$p3$w3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$4$ 4$4$4$4$%4$+4$14$84$A4$H4$N4$U4$]4$c4$j4$p4$w4$~4$4$4$4$4$4$4$4$4$4$4$4$4$4$4$5$ 5$5$5$!5$*5$15$;5$E5$L5$Q5$]5$f5$l5$s5$x5$~5$5$5$5$5$5$5$5$5$5$5$5$5$5$5$5$5$6$ 6$6$6$6$$6$,6$56$?6$F6$N6$W6$a6$j6$t6$~6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$7$ 7$7$7$7$&7$.7$67$>7$H7$P7$[7$h7$o7$x7$~7$7$7$7$7$7$7$7$7$7$7$7$7$7$7$8$8$8$8$)8$08$88$>8$E8$N8$U8$^8$d8$m8$t8${8$8$8$8$8$8$8$8$8$8$8$8$8$8$8$8$9$ 9$9$9$#9$*9$09$;9$H9$P9$W9$`9$h9$r9$x9$9$9$9$9$9$9$9$9$9$9$9$:$ :$:$:$&:$0:$<:$F:$R:$\:$h:$s:$:$:$:$:$:$:$:$:$:$:$:$:$:$;$;$;$);$4;$:;$H;$P;$Z;$d;$m;$s;$z;$;$;$;$;$;$;$;$;$;$;$;$;$;$;$;$<$<$<$!<$*<$3<$<<$C<$K<$T<$[<$c<$l<$u<$~<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$ =$=$=$#=$/=$:=$G=$L=$S=$[=$b=$j=$p=$w=$}=$=$=$=$=$=$=$=$=$=$=$=$=$=$=$=$>$ >$>$>$">$+>$3>$;>$C>$I>$P>$W>$\>$b>$m>$x>$>$>$>$>$>$>$>$>$>$>$>$>$>$>$>$>$>$?$?$0?$6?$E?$N?$`?$h?$n?$y?$?$?$?$?$?$?$?$?$?$?$?$?$?$?$?$?$@$ @$@$@$"@$+@$4@$;@$D@$L@$U@$`@$h@$p@$@$@$@$@$@$@$@$@$@$@$@$@$@$A$ A$A$A$(A$2A$G$GG$RG$WG$]G$dG$jG$pG$wG$~G$G$G$G$G$G$G$G$G$G$G$G$G$G$G$G$G$G$G$H$ H$H$(H$-H$3H$9H$@H$GH$OH$UH$\H$cH$kH$pH$vH${H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$I$I$I$ I$4I$AI$OI$_I$lI$zI$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$J$ J$J$J$J$"J$(J$/J$4J$:J$@J$GJ$OJ$UJ$]J$eJ$kJ$J$J$J$J$K$K$(K$CK$eK$K$K$K$K$L$#L$4L$JL$iL$L$L$L$L$L$L$M$M$,M$LM$uM$M$M$M$M$M$N$#N$*N$3N$9N$AN$EN$MN$UN$\N$vN$N$N$N$N$N$N$N$N$N$N$N$N$N$N$N$O$O$O$O$O$(O$2O$>O$GO$RO$_O$hO$rO${O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$ P$!P$&P$1P$7P$>P$EP$KP$RP$YP$aP$fP$jP$pP$wP$|P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$Q$ Q$Q$Q$ Q$'Q$1Q$?Q$OQ$^Q$gQ$sQ$Q$Q$Q$Q$Q$Q$Q$Q$Q$Q$Q$Q$R$R$R$R$R$'R$-R$4R$;R$ER$LR$SR$[R$dR$oR$uR$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$S$ S$S$S$S$$S$1S$=S$JS$RS$XS$_S$fS$oS$uS$|S$S$S$S$S$S$S$S$S$S$S$S$S$S$S$S$ T$T$#T$,T$4T$FT$JT$VT$^T$gT$oT$yT$T$T$T$T$T$T$T$T$T$T$T$T$T$T$U$U$+U$7U$Z$FZ$MZ$UZ$]Z$eZ$mZ$sZ$zZ$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$[$ [$[$[$%[$.[$1[$5[$8[$<[$?[$C[$K[$P[$W[$\[$a[$f[$m[$u[${[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$\$ \$\$ \$*\$6\$<\$@\$F\$M\$S\$Z\$_\$e\$j\$p\$u\${\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$]$ ]$]$]$+]$>]$F]$N]$T]$[]$c]$k]$v]$]$]$]$]$]$]$]$]$]$]$]$]$]$]$]$]$]$^$^$^$^$#^$+^$4^$;^$B^$H^$M^$R^$X^$^^$g^$p^${^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$_$ _$_$_$_$(_$3_$=_$H_$M_$R_$^_$f_$l_$r_$z_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$`$ `$`$`$#`$3`$A`$P`$]`$k`$z`$`$`$`$`$`$`$`$`$`$`$`$`$a$a$a$2a$Na$ha$a$a$a$a$a$b$b$.b$Jb$db$b$b$b$b$b$b$c$'c$>c$Sc$ec$yc$c$c$c$c$c$d$!d$=d$Nd$]d$ld$zd$d$d$d$d$d$d$e$e$(e$;e$He$^e${e$e$e$e$e$e$f$$f$Bf$_f$yf$f$f$f$f$g$g$*g$>g$Tg$mg$g$g$g$g$g$h$!h$.h$Eh$[h$rh$h$h$h$h$h$h$h$ i$ i$4i$Di$Wi$ei$mi$wi$|i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$j$ j$j$j$"j$+j$6j$w$Ew$Lw$Tw$]w$ew$nw$xw$w$w$w$w$w$w$w$w$w$w$w$w$w$w$w$w$w$x$ x$x$ x$)x$4x$=x$Gx$Px$Zx$bx$nx$zx$x$x$x$x$x$x$x$x$x$x$x$y$y$y$(y$6y$Dy$Qy$\y$my$yy$y$y$y$y$y$y$y$y$y$y$z$z$%z$5z$8z$?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~cygwin1.dll_Exit__argv__argz_add__argz_add_sep__argz_append__argz_count__argz_create__argz_create_sep__argz_delete__argz_extract__argz_insert__argz_next__argz_replace__argz_stringify__assert__assert_func__assertfail__check_rhosts_file__ctype_ptr____cygwin_environ__cygwin_user_data__dn_comp__dn_expand__dn_skipname__envz_add__envz_entry__envz_get__envz_merge__envz_remove__envz_strip__eprintf__errno__f_atan2__f_atan2f__f_exp__f_expf__f_frexp__f_frexpf__f_ldexp__f_ldexpf__f_log__f_log10__f_log10f__f_logf__f_pow__f_powf__f_tan__f_tanf__fpclassifyd__fpclassifyf__fpurge__getdelim__getline__getreent__infinity__isinfd__isinff__isnand__isnanf__locale_mb_cur_max__main__mb_cur_max__mempcpy__opendir_with_d_ino__progname__rcmd_errstr__res_close__res_init__res_mkquery__res_nclose__res_ninit__res_nmkquery__res_nquery__res_nquerydomain__res_nsearch__res_nsend__res_query__res_querydomain__res_search__res_send__res_state__signbitd__signbitf__signgam__srget__srget_r__swbuf__swbuf_r__wrap__ZdaPv__wrap__ZdaPvRKSt9nothrow_t__wrap__ZdlPv__wrap__ZdlPvRKSt9nothrow_t__wrap__Znaj__wrap__ZnajRKSt9nothrow_t__wrap__Znwj__wrap__ZnwjRKSt9nothrow_t__xdrrec_getrec__xdrrec_setnonblock__xpg_strerror_r_abort_abs_access_acl_acl32_aclcheck_aclcheck32_aclfrommode_aclfrommode32_aclfrompbits_aclfrompbits32_aclfromtext_aclfromtext32_aclsort_aclsort32_acltomode_acltomode32_acltopbits_acltopbits32_acltotext_acltotext32_acos_acosf_acosh_acoshf_alarm_alloca_alphasort_asctime_asctime_r_asin_asinf_asinh_asinhf_asprintf_asprintf_r_atan_atan2_atan2f_atanf_atanh_atanhf_atexit_atof_atoff_atoi_atol_bcmp_bcopy_bsearch_bzero_cabs_cabsf_calloc_cbrt_cbrtf_ceil_ceilf_chdir_check_for_executable_chmod_chown_chown32_chroot_clearerr_clock_close_closedir_copysign_copysignf_cos_cosf_cosh_coshf_creat_ctime_ctime_r_ctype__cuserid_cwait_daylight_difftime_dirfd_div_dll_crt0@0_drand48_drem_dremf_dup_dup2_ecvt_ecvtbuf_ecvtf_endgrent_endmntent_endpwent_endutent_erand48_erf_erfc_erfcf_erff_execl_execle_execlp_execv_execve_execvp_exit_exp_expf_expm1_expm1f_f_atan2_f_atan2f_f_exp_f_expf_f_frexp_f_frexpf_f_ldexp_f_ldexpf_f_llrint_f_llrintf_f_llrintl_f_log_f_log10_f_log10f_f_logf_f_lrint_f_lrintf_f_lrintl_f_pow_f_powf_f_rint_f_rintf_f_rintl_f_tan_f_tanf_fabs_fabsf_facl_facl32_fchdir_fchmod_fchown_fchown32_fclose_fcloseall_fcloseall_r_fcntl_fcntl64_fcvt_fcvtbuf_fcvtf_fdopen_fdopen64_fe_dfl_env_fe_nomask_env_feinitialise_feof_ferror_fflush_ffs_fgetc_fgetpos_fgetpos64_fgets_fileno_finite_finitef_fiprintf_floor_floorf_fmod_fmodf_fnmatch_fopen_fopen64_fork_fprintf_fputc_fputs_fread_free_freopen_freopen64_frexp_frexpf_fscanf_fscanf_r_fseek_fseeko_fseeko64_fsetpos_fsetpos64_fstat_fstat64_fstatfs_fsync_ftell_ftello_ftello64_ftime_ftok_ftruncate_ftruncate64_fwrite_gamma_gamma_r_gammaf_gammaf_r_gcvt_gcvtf_get_osfhandle_getc_getc_unlocked_getchar_getchar_unlocked_getcwd_getdomainname_getdtablesize_getegid_getegid32_getenv_geteuid_geteuid32_getgid_getgid32_getgrent_getgrent32_getgrgid_getgrgid32_getgrnam_getgrnam32_getgroups_getgroups32_gethostname_getlogin_getmntent_getmode_getpagesize_getpass_getpgrp_getpid_getppid_getpwduid_getpwent_getpwnam_getpwuid_getpwuid32_getpwuid_r32_getrlimit_getrusage_gets_gettimeofday_getuid_getuid32_getutent_getutid_getw_getwd_gmtime_gmtime_r_htonl_htons_hypot_hypotf_ilogb_ilogbf_impure_ptr_index_infinity_infinityf_initgroups32_ioctl_iprintf_isalnum_isalpha_isascii_isatty_iscntrl_isdigit_isgraph_isinf_isinff_islower_isnan_isnanf_isprint_ispunct_isspace_isupper_isxdigit_j0_j0f_j1_j1f_jn_jnf_jrand48_kill_labs_lacl_lchown_lchown32_lcong48_ldexp_ldexpf_ldiv_lgamma_lgamma_r_lgammaf_lgammaf_r_link_localeconv_localtime_localtime_r_log_log10_log10f_log1p_log1pf_logb_logbf_logf_longjmp_lrand48_lseek_lseek64_lstat_lstat64_malloc_matherr_mblen_mbstowcs_mbtowc_memccpy_memchr_memcmp_memcpy_memmove_memset_mkdir_mknod_mknod32_mkstemp_mktemp_mktime_mmap64_modf_modff_mount_nan_nanf_nanosleep_nextafter_nextafterf_nice_nl_langinfo_nrand48_ntohl_ntohs_open_open64_openlog_pathconf_pclose_perror_pipe_poll_popen_pow_powf_printf_pthread_cleanup_pop_pthread_cleanup_push_putc_putc_unlocked_putchar_putchar_unlocked_putenv_puts_pututline_putw_qsort_raise_rand_read_readdir_readlink_readv_realloc_remainder_remainderf_remove_rename_rewind_rewinddir_rindex_rmdir_sbrk_scalb_scalbf_scalbn_scalbnf_scandir_scanf_scanf_r_seed48_seekdir_seekdir64_select_setbuf_setdtablesize_setegid_setegid32_setenv_seteuid_seteuid32_setgid_setgid32_setgrent_setgroups_setgroups32_setjmp_setlocale_setmntent_setmode_setpassent_setpgid_setpgrp_setpwent_setregid_setregid32_setreuid_setreuid32_setrlimit_setsid_settimeofday_setuid_setuid32_setutent_setvbuf_sin_sinf_sinh_sinhf_siprintf_sleep_snprintf_spawnl_spawnle_spawnlp_spawnlpe_spawnv_spawnve_spawnvp_spawnvpe_sprintf_sqrt_sqrtf_srand_srand48_sscanf_sscanf_r_stat_stat64_statfs_strcasecmp_strcat_strchr_strcmp_strcoll_strcpy_strcspn_strdup_strerror_strerror_r_strftime_strlcat_strlcpy_strlen_strlwr_strncasecmp_strncat_strncmp_strncpy_strpbrk_strptime_strrchr_strsep_strspn_strstr_strtod_strtodf_strtok_strtok_r_strtol_strtold_strtoll_strtoul_strtoull_strupr_strxfrm_swab_symlink_sys_errlist_sys_nerr_sysconf_syslog_system_tan_tanf_tanh_tanhf_telldir_telldir64_tempnam_time_times_timezone_tmpfile_tmpfile64_tmpnam_toascii_tolower_toupper_truncate_truncate64_ttyname_tzname_tzset_ualarm_umask_umount_uname_ungetc_unlink_unsetenv_usleep_utime_utimes_utmpname_vasprintf_vasprintf_r_vfiprintf_vfork_vfprintf_vfscanf_vfscanf_r_vhangup_vprintf_vscanf_vscanf_r_vsnprintf_vsprintf_vsscanf_vsscanf_r_wait_waitpid_wcscmp_wcslen_wcstombs_wctomb_write_writeva64labortabsacceptaccept4accessaclaclcheckaclfrommodeaclfrompbitsaclfromtextaclsortacltomodeacltopbitsacltotextacosacosfacoshacoshfalarmalphasortargz_addargz_add_separgz_appendargz_countargz_createargz_create_separgz_deleteargz_extractargz_insertargz_nextargz_replaceargz_stringifyasctimeasctime_rasinasinfasinhasinhfasnprintfasprintfasprintf_ratanatan2atan2fatanfatanhatanhfatexitatofatoffatoiatolatollbasenamebcmpbcopybindbindresvportbindresvport_sabsearchbtowcbzerocabscabsfcacoscacosfcacoshcacoshfcalloccanonicalize_file_namecargcargfcasincasinfcasinhcasinhfcatancatanfcatanhcatanhfcbrtcbrtfccosccosfccoshccoshfceilceilfcexpcexpfcfgetispeedcfgetospeedcfmakerawcfsetispeedcfsetospeedchdirchmodchownchrootcimagcimagfcleanup_glueclearerrclockclock_getcpuclockidclock_getresclock_gettimeclock_nanosleepclock_setresclock_settimeclogclogfcloseclosedircloselogconfstrconjconjfconnectcopysigncopysignfcoscosfcoshcoshfcpowcpowfcprojcprojfcrealcrealfcreatcsincsinfcsinhcsinhfcsqrtcsqrtfctanctanfctanhctanhfctermidctimectime_rcuseridcwaitcygwin32_attach_handle_to_fdcygwin32_conv_to_full_posix_pathcygwin32_conv_to_full_win32_pathcygwin32_conv_to_posix_pathcygwin32_conv_to_win32_pathcygwin32_detach_dllcygwin32_internalcygwin32_posix_path_list_pcygwin32_posix_to_win32_path_listcygwin32_posix_to_win32_path_list_buf_sizecygwin32_split_pathcygwin32_win32_to_posix_path_listcygwin32_win32_to_posix_path_list_buf_sizecygwin32_winpid_to_pidcygwin_attach_handle_to_fdcygwin_conv_pathcygwin_conv_path_listcygwin_conv_to_full_posix_pathcygwin_conv_to_full_win32_pathcygwin_conv_to_posix_pathcygwin_conv_to_win32_pathcygwin_create_pathcygwin_detach_dllcygwin_dll_initcygwin_internalcygwin_logon_usercygwin_posix_path_list_pcygwin_posix_to_win32_path_listcygwin_posix_to_win32_path_list_buf_sizecygwin_set_impersonation_tokencygwin_split_pathcygwin_stackdumpcygwin_umountcygwin_win32_to_posix_path_listcygwin_win32_to_posix_path_list_buf_sizecygwin_winpid_to_piddaemondifftimedirfddirnamedivdlclosedlerrordlforkdll_crt0__FP11per_processdll_dllcrt0dll_entry@12dll_noncygwin_dllcrt0dlopendlsymdn_compdn_expanddn_skipnamedprintfdrand48dremdremfdupdup2dup3eaccessecvtecvtbufecvtfendgrentendhostentendmntentendprotoentendpwentendserventendusershellendutentendutxentenvz_addenvz_entryenvz_getenvz_mergeenvz_removeenvz_striperand48erferfcerfcferfferrerrorerror_at_lineerror_message_counterror_one_per_lineerror_print_prognameerrxeuidaccessexeclexecleexeclpexecvexecveexecvpexecvpeexitexpexp10exp10fexp2exp2fexpfexpm1expm1ffabsfabsffaccessatfaclfchdirfchmodfchmodatfchownfchownatfclosefcloseallfcloseall_rfcntlfcvtfcvtbuffcvtffdatasyncfdimfdimffdopenfdopendirfeclearexceptfedisableexceptfeenableexceptfegetenvfegetexceptfegetexceptflagfegetprecfegetroundfeholdexceptfeofferaiseexceptferrorfesetenvfesetexceptflagfesetprecfesetroundfetestexceptfeupdateenvfexecvefflushffsfgetcfgetposfgetsfgetwcfgetwsfgetxattrfilenofinitefiniteffiprintfflistxattrflockflockfilefloorfloorffmafmaffmaxfmaxffmemopenfminfminffmodfmodffnmatchfopenfopencookieforkforkptyfpathconffprintffpurgefputcfputsfputwcfputwsfreadfreefreeaddrinfofreeifaddrsfremovexattrfreopenfrexpfrexpffscanffscanf_rfseekfseekofsetposfsetxattrfstatfstatatfstatfsfstatvfsfsyncftellftelloftimeftokftruncateftrylockfilefts_childrenfts_closefts_get_clientptrfts_get_streamfts_openfts_readfts_setfts_set_clientptrftwfunlockfilefunopenfutimensfutimesfutimesatfwidefwprintffwritefwscanfgai_strerrorgammagamma_rgammafgammaf_rgcvtgcvtfget_avphys_pagesget_current_dir_nameget_nprocsget_nprocs_confget_osfhandleget_phys_pagesgetaddrinfogetcgetc_unlockedgetchargetchar_unlockedgetcwdgetdelimgetdomainnamegetdtablesizegetegidgetenvgeteuidgetgidgetgrentgetgrgidgetgrgid_rgetgrnamgetgrnam_rgetgrouplistgetgroupsgethostbyaddrgethostbynamegethostbyname2gethostidgethostnamegetifaddrsgetitimergetlinegetlogingetlogin_rgetmntentgetmntent_rgetmodegetnameinfogetoptgetopt_longgetopt_long_onlygetpagesizegetpassgetpeereidgetpeernamegetpgidgetpgrpgetpidgetppidgetprioritygetprognamegetprotobynamegetprotobynumbergetprotoentgetptgetpwduidgetpwentgetpwnamgetpwnam_rgetpwuidgetpwuid_rgetrlimitgetrusagegetsgetservbynamegetservbyportgetserventgetsidgetsocknamegetsockoptgetsuboptgettimeofdaygetuidgetusershellgetutentgetutidgetutlinegetutxentgetutxidgetutxlinegetwgetwcgetwchargetwdgetxattrglobglob_pattern_pglobfreegmtimegmtime_rgrantpth_errnohcreatehcreate_rhdestroyhdestroy_rherrorhsearchhsearch_rhstrerrorhtonlhtonshypothypotfif_freenameindexif_indextonameif_nameindexif_nametoindexilogbilogbfimaxabsimaxdivin6addr_anyin6addr_loopbackindexinet_addrinet_atoninet_makeaddrinet_netofinet_networkinet_ntoainet_ntopinet_ptoninfinityinfinityfinitgroupsinitstateinsqueioctliprintfiruserokiruserok_saisalnumisalphaisasciiisattyisblankiscntrlisdigitisgraphisinfisinffislowerisnanisnanfisprintispunctisspaceisupperiswalnumiswalphaiswblankiswcntrliswctypeiswdigitiswgraphiswloweriswprintiswpunctiswspaceiswupperiswxdigitisxdigitj0j0fj1j1fjnjnfjrand48killkillpgl64alabslacllchownlcong48ldexpldexpfldivlfindlgammalgamma_rlgammaflgammaf_rlgetxattrlinklinkatlistenlistxattrllabslldivllistxattrllrintllrintfllrintlllroundllroundflocaleconvlocaltimelocaltime_rlockfloglog10log10flog1plog1pflog2log2flogblogbflogfloginlogin_ttylogoutlogwtmplongjmplrand48lremovexattrlrintlrintflrintllroundlroundflsearchlseeklsetxattrlstatlutimesmadvisemallinfomallocmalloc_statsmalloc_trimmalloc_usable_sizemalloptmatherrmblenmbrlenmbrtowcmbsinitmbsnrtowcsmbsrtowcsmbstowcsmbtowcmemalignmemccpymemchrmemcmpmemcpymemmemmemmovemempcpymemrchrmemsetmkdirmkdiratmkdtempmkfifomkfifoatmknodmknodatmkostempmkostempsmkstempmkstempsmktempmktimemlockmmapmodfmodffmountmprotectmq_closemq_getattrmq_notifymq_openmq_receivemq_sendmq_setattrmq_timedreceivemq_timedsendmq_unlinkmrand48msgctlmsggetmsgrcvmsgsndmsyncmunlockmunmapnannanfnanosleepnearbyintnearbyintfnextafternextafterfnftwnicenl_langinfonrand48ntohlntohson_exitopenopen_memstreamopen_wmemstreamopenatopendiropenlogopenptyoptargopterroptindoptoptoptresetpathconfpausepcloseperrorpipepipe2pollpopenposix_fadviseposix_fallocateposix_madviseposix_memalignposix_openptposix_regcompposix_regerrorposix_regexecposix_regfreepowpow10pow10fpowfppollpreadprintfprogram_invocation_nameprogram_invocation_short_namepselectpsiginfopsignalpthread_atforkpthread_attr_destroypthread_attr_getdetachstatepthread_attr_getguardsizepthread_attr_getinheritschedpthread_attr_getschedparampthread_attr_getschedpolicypthread_attr_getscopepthread_attr_getstackpthread_attr_getstackaddrpthread_attr_getstacksizepthread_attr_initpthread_attr_setdetachstatepthread_attr_setguardsizepthread_attr_setinheritschedpthread_attr_setschedparampthread_attr_setschedpolicypthread_attr_setscopepthread_attr_setstackpthread_attr_setstackaddrpthread_attr_setstacksizepthread_cancelpthread_cond_broadcastpthread_cond_destroypthread_cond_initpthread_cond_signalpthread_cond_timedwaitpthread_cond_waitpthread_condattr_destroypthread_condattr_getclockpthread_condattr_getpsharedpthread_condattr_initpthread_condattr_setclockpthread_condattr_setpsharedpthread_continuepthread_createpthread_detachpthread_equalpthread_exitpthread_getattr_nppthread_getconcurrencypthread_getcpuclockidpthread_getschedparampthread_getsequence_nppthread_getspecificpthread_joinpthread_key_createpthread_key_deletepthread_killpthread_mutex_destroypthread_mutex_getprioceilingpthread_mutex_initpthread_mutex_lockpthread_mutex_setprioceilingpthread_mutex_trylockpthread_mutex_unlockpthread_mutexattr_destroypthread_mutexattr_getprioceilingpthread_mutexattr_getprotocolpthread_mutexattr_getpsharedpthread_mutexattr_gettypepthread_mutexattr_initpthread_mutexattr_setprioceilingpthread_mutexattr_setprotocolpthread_mutexattr_setpsharedpthread_mutexattr_settypepthread_oncepthread_rwlock_destroypthread_rwlock_initpthread_rwlock_rdlockpthread_rwlock_tryrdlockpthread_rwlock_trywrlockpthread_rwlock_unlockpthread_rwlock_wrlockpthread_rwlockattr_destroypthread_rwlockattr_getpsharedpthread_rwlockattr_initpthread_rwlockattr_setpsharedpthread_selfpthread_setcancelstatepthread_setcanceltypepthread_setconcurrencypthread_setschedparampthread_setschedpriopthread_setspecificpthread_sigmaskpthread_sigqueuepthread_spin_destroypthread_spin_initpthread_spin_lockpthread_spin_trylockpthread_spin_unlockpthread_suspendpthread_testcancelpthread_yieldptsnameptsname_rputcputc_unlockedputcharputchar_unlockedputenvputspututlinepututxlineputwputwcputwcharpwriteqsortraiserandrand_rrandomrcmdrcmd_afreadreaddirreaddir_rreadlinkreadlinkatreadvreallocreallocfrealpathrecvrecvfromrecvmsgreent_dataregcompregerrorregexecregfreeremainderremainderfremoveremovexattrremqueremquoremquofrenamerenameatres_closeres_initres_mkqueryres_ncloseres_ninitres_nmkqueryres_nqueryres_nquerydomainres_nsearchres_nsendres_queryres_querydomainres_searchres_sendrevokerewindrewinddirrexecrindexrintrintfrintlrmdirroundroundfrresvportrresvport_afruseroksbrkscalbscalbfscalblnscalblnfscalbnscalbnfscandirscandiratscanfscanf_rsched_get_priority_maxsched_get_priority_minsched_getparamsched_getschedulersched_rr_get_intervalsched_setparamsched_setschedulersched_yieldseed48seekdirselectsem_closesem_destroysem_getvaluesem_initsem_opensem_postsem_timedwaitsem_trywaitsem_unlinksem_waitsemctlsemgetsemopsendsendmsgsendtosetbufsetbuffersetdtablesizesetegidsetenvseteuidsetgidsetgrentsetgroupssethostentsetitimersetjmpsetlinebufsetlocalesetlogmasksetmntentsetmodesetpassentsetpgidsetpgrpsetprioritysetprognamesetprotoentsetpwentsetregidsetregid32setreuidsetreuid32setrlimitsetserventsetsidsetsockoptsetstatesettimeofdaysetuidsetusershellsetutentsetutxentsetvbufsetxattrsexeclsexeclesexeclpsexeclpesexecpsexecvsexecvesexecvpeshm_openshm_unlinkshmatshmctlshmdtshmgetshutdownsigactionsigaddsetsigdelsetsigemptysetsigfillsetsigholdsigignoresiginterruptsigismembersignalsignificandsignificandfsigpausesigpendingsigprocmasksigqueuesigrelsesigsetsigsuspendsigwaitsigwaitinfosinsincossincosfsinfsinhsinhfsiprintfsleepsnprintfsocketsocketpairspawnlspawnlespawnlpspawnlpespawnvspawnvespawnvpspawnvpesprintfsqrtsqrtfsrandsrand48srandomsscanfsscanf_rstatstatfsstatvfsstpcpystpncpystrcasecmpstrcasestrstrcatstrchrstrchrnulstrcmpstrcollstrcpystrcspnstrdupstrerrorstrerror_rstrfmonstrftimestrlcatstrlcpystrlenstrlwrstrncasecmpstrncatstrncmpstrncpystrndupstrnlenstrpbrkstrptimestrrchrstrsepstrsignalstrspnstrstrstrtodstrtodfstrtofstrtoimaxstrtokstrtok_rstrtolstrtollstrtosignostrtoulstrtoullstrtoumaxstruprstrxfrmswabswprintfswscanfsymlinksymlinkatsyncsys_errlistsys_nerrsys_sigabbrevsys_siglistsysconfsysinfosyslogsystemtantanftanhtanhftcdraintcflowtcflushtcgetattrtcgetpgrptcgetsidtcsendbreaktcsetattrtcsetpgrptdeletetdestroytelldirtempnamtfindtgammatgammaftimetimegmtimelocaltimer_createtimer_deletetimer_gettimetimer_settimetimestimezonetmpfiletmpnamtoasciitolowertouppertowctranstowlowertowuppertrunctruncatetruncftsearchttynamettyname_rttyslottwalktzsetualarmumaskumountunameungetcungetwcunlinkunlinkatunlockptunsetenvupdwtmpupdwtmpxusleeputimeutimensatutimesutmpnameutmpxnamevallocvasnprintfvasprintfvasprintf_rvdprintfverrverrxvfiprintfvforkvfprintfvfscanfvfscanf_rvfwprintfvfwscanfvhangupvprintfvscanfvscanf_rvsnprintfvsprintfvsscanfvsscanf_rvswprintfvswscanfvsyslogvwarnvwarnxvwprintfvwscanfwaitwait3wait4waitpidwarnwarnxwcpcpywcpncpywcrtombwcscasecmpwcscatwcschrwcscmpwcscollwcscpywcscspnwcsdupwcsftimewcslcatwcslcpywcslenwcsncasecmpwcsncatwcsncmpwcsncpywcsnlenwcsnrtombswcspbrkwcsrchrwcsrtombswcsspnwcsstrwcstodwcstofwcstoimaxwcstokwcstolwcstollwcstombswcstoulwcstoullwcstoumaxwcswidthwcsxfrmwctobwctombwctranswctypewcwidthwmemchrwmemcmpwmemcpywmemmovewmemsetwordexpwordfreewprintfwritewritevwscanfxdr_arrayxdr_boolxdr_bytesxdr_charxdr_doublexdr_enumxdr_floatxdr_freexdr_hyperxdr_intxdr_int16_txdr_int32_txdr_int64_txdr_int8_txdr_longxdr_longlong_txdr_netobjxdr_opaquexdr_pointerxdr_referencexdr_shortxdr_sizeofxdr_stringxdr_u_charxdr_u_hyperxdr_u_intxdr_u_int16_txdr_u_int32_txdr_u_int64_txdr_u_int8_txdr_u_longxdr_u_longlong_txdr_u_shortxdr_uint16_txdr_uint32_txdr_uint64_txdr_uint8_txdr_unionxdr_vectorxdr_voidxdr_wrapstringxdrmem_createxdrrec_createxdrrec_endofrecordxdrrec_eofxdrrec_skiprecordxdrstdio_createy0y0fy1y1fynynf P P0 P HX$4VS_VERSION_INFO?StringFileInfo040904B00CompanyNameRed Hat`FileDescriptionCygwin POSIX Emulation DLL.FileVersion1.7.168 InternalNamecygwin1.dlll$LegalCopyrightCopyright Red Hat, Inc. 1996-2012@ OriginalFilenamecygwin1.dll.ProductNameCygwin2ProductVersion1.7.16(APIVersion0.2624SharedMemoryVersion5.RegistryKeyCygwin>BuildDate2012-07-20 22:55DVarFileInfo$Translation 333334&4.4=4h444444 55'5/5>5Q52666x78R8v88888888899(909?9J9T9\9d9w999999999999: ::!:,:::B:J:]:h:v:~:::::::: ;;;;=== ?$?,?4?C?S? $012423n33X4444445 5(555R5Z5w555555B6N6b6q66 77G77788!8B8H8e8k888888999:%:/:G:^:f:k:::::;;(;0;?;J;Y;a;x;;;;!a>>>>%?>?Q?a?t?y????????0060A0E0K0O0W0a0q00000@1Y1b1}111111122M22223 33$343O3W3f3333D4K4X4`4o44444555555566o6w6669:i;;;;;; s>z>>>>>>e?m?|???@<0d0l0{000031]1112F3N3a3333Q4k4s445m5z55555556 77'7.7A7P777788V888H9:;;;;<<6<<<<<<<="=O=f=z==>>????P 00N000000-1Q1Y11 2#2E2U22 3"3-33333333 4494A4P45Y6788H8869 ;;&;S;l;t;;<$<<<<<<>>)>.>3>>>? ??#?/?5?:???`L0000111N1k1{11112 22$2o2222222233i3x3333333333,4{444455.535D5555555566$6K6P6Z6j6r6{66667#8Z8n88H9P9^9d9j9{99999:(:2:6:<:@:X:o:v::::::::;+;:;L;Y;l;~;;;;;;;;;;< <<]>j>t>>>?I?V?d?|????p@0R00001a1q1v111111M22 3(303C3M3f3333333334!4)4<4N4V4e44445515H5e5v5555556f6{666666677E77777777788"8D8V8h8m8z8888888899@9M9Y9n9y99999999:::#:F:Z:f::;<)<1&>H>P>>>>>>??*?2?\?i?q???????00;0C0e0m00000001"1*1L1T1v1~11111112&2H2P2r2z2222223 3/373Y3a33333334 4+434U4]4444444455<5D5f5n555555566@6M6U6w666666667'7I7Q7s7{777777 88B8J8l8t888888899>9F9h9p9999999:':I:Q:s:{:::::;;*;2;T;\;~;;;;;;;<&<.;>]>e>>>>>>>?"?Y?a???????p00@0H000000011<1D1f1n111111282@2b2j222222233:3B3d3l3333333 4464>4k444444455M5U5w55555566=6E6v6~666667 7<7D7f7n7777777(858=8_8g8888888991999[9c99999999:#:E:M:o:w:::::::;;L;Y;a;;;;;;;< <+<3>;>C>p>>>>>>>?!?R?Z?|??????p0 0B0J0{00000011A1I1k1s111111222222233*323T3\3~33333334444444 5565>5`5h55555556626:6g6t6|66666667$7F7N7p7x777777880888Z8b88888889 9,949V9^99999999::@:H:j:r:::::::;*;2;T;\;~;;;;;;;<&<.(>0>R>Z>>>>>>>>?? >+>3>U>]>>>>>>>>?'?/?Q?Y?{???????0#0+0M0U0w000000001'1I1Q1s1{111112292A2c2k2222223)313b3j3333333(404R4Z44444445 5B5J5w55555556 6,646V6^666666667(707R7Z7|77777778$8,8N8V8x88888888 9(9J9R9t9|9999999:$:F:N:p:x:::::::; ;M;Z;b;;;;;;;< <,<4$>,>N>V>x>>>>>>>> ?(?J?R?t?|???????0$0F0N0p0x0000000#10181Z1b11111112 2,242V2^222222223(303R3Z3|33333334$4,4N4V4x44444444 5(5J5R5t5|55555556$6F6N6p6x666666770787Z7b77777778 8,848V8^8888888899@9H9j9r9999999::<:D:q:~:::::::;&;.;P;X;z;;;;;;;<-<:=`=h======== >(>J>R>t>|>>>>>>>?$?F?N?p?x??????`000080Z0b00000001 1,141a1n1v111111122@2H2j2r22222223*323T3\3~33333334&4.4P4X4z444444455:5B5d5l555555566>6`6h66666667%7\7d77777778!8C8K8888888l9t999999::V:^::::::: ;(;J;R;t;|;;;;;<<>&>H>P>r>z>>>>>>??2?:?\?d??????T0&0.0P0X00000001"1f1n11111110282Z2b2222223$3,3N3V3x3333334 4B4J4444444 55X5`5555555"6*6L6T6v6~6666677@7H7j7r77777 8848<888888889J9R9t9|99999::>:F:h:p:::::;;2;:;\;d;;;;;;<&<.>8>@>b>j>>>>>>>(?0?R?Z???????P0 0W0_0000000 1,141V1^111111122_2g2222222)313S3[3}3333334%4G4O4q4y4444455;5C55555556 6:6G6O6q6y6666666;7C7e7m777778 8/878Y8a8888889#9+9M9U9999999::c:k:::::::-;5;W;_;;;;;;;!<)>U>]>>>>>>>?'?I?Q?s?{?????X00=0E0g0o00000111191}11111112G2O2q2y2222233;3C3e3m333334 4/474Y4a4444445#5+5M5U5w55555555.666X6`66666667&7W7_777777788>8F8s8888888(909R9Z9|999999:$:F:N:::::::;;\;d;;;;;;;&<. >.>6>X>`>>>>>>?"?*?n?v??????? P80@0b0j000001 1,141V1^1111111 2(2J2R222222233`3h3333333*424T4\4~4444445&5H5P5r5z5555566<6D666666677R7Z7|7777778$8F8N8p8x8888899:9B9d9l99999: :.:6:z:::::::;D;L;n;v;;;;;<<8<@$>,>]>e>>>>>>>?"?Y?a???????0P 0.060X0`000000011a1i1111111+232U2]22222223'3I3Q3s3{3333344=4E444444455<5I5Q5s5{5555555=6E6g6o66666771797[7c7777778%8-8O8W88888889!9e9m9999999/:7:Y:a::::::;#;+;M;U;w;;;;;;<)>K>S>u>}>>>>>????G?i?q?????@l 0030;000000001I1Q1s1{1111122=2E2g2o22222331393[3c3333334%4-4O4W4y444444440585Z5b5555555 6(6_6g6666667)717S7[7}7777777C8K8m8u8888888$9,9N9V9x99999999+:8:@:b:j::::::: ;;4;<;^;f;;;;;;;< >+>3>U>]>>>>>>>>????G?i?q???????P00;0C0e0m0000000 1171?1a1i1111111 2232;2]2e222222233I3V3^333333334(404R4Z4|44444445$5,5N5V5x55555555 6(6J6R6t6|66666667$7F7N7p7x777777880888Z8b88888889 9,949V9^99999999:(:0:R:Z:|:::::::;$;,;N;V;x;;;;;;;; <(>0>8>Z>b>>>>>>>? ?,?4?V?^????????`0(000R0Z0|0000001191A1n1{111112)212S2[2}222222 3343<3^3f333333334&4H4P4r4z4444444)515S5[5}55555556%6-6^6f666666677?7G7i7q777777788;8C8p8}88888889%9-9O9W9y99999999!:):K:S:u:}:::::::;%;G;O;q;y;;;;;;;>8>@>b>j>>>>>>> ??4?>4><>^>f>>>>>>>????G?i?q??????? 0(0J0R00000001 1+131U1]11111111222?2G2i2q222222233;3C3e3m3333333 4474?4a4i4444444 5535;5]5e55555556 6>6F6h6p66666667(707R7Z7|77777778$8,8N8V8x88888888 9(9J9R9t9|9999999:$:F:N:p:x:::::::#;0;8;Z;b;;;;;;;< <,<4$>,>N>V>x>>>>>>>> ?(?J?R?t?|?????? 0040<0^0f0000000110181Z1b11111112 2,242V2^222222223(303R3Z3|3333333494A4c4k444444/575Y5a55555556 6:6B6d6l6666666 77A7N7V7x77777777 8(8J8R8t8|888889 9+939U9]9999999 ::E:M:o:w:::::::;;A;I;k;s;;;;;;< <+<3#>+>M>U>w>>>>>>>>?'?I?Q?s?{?????00*020_0l0t000000011>1F1h1p111111122:2B2d2l2222222 3363>3`3h33333334424:4\4d444444445$5F5N5p5x55555556 6B6J6l6t666666677>7F7h7p777777788:8B8d8l8888888 9969>9k9x99999999 :(:J:R:t:|:::::::;$;F;N;p;x;;;;;;;< =F=h=p======>%>->O>W>>>>>>?#?E?M?o?w??????0&0.0P0X0z000000111:1B1d1l1111111 2262>2o2w222222233A3I3k3s33333441494[4c44444445 5-555W5_5555555566A6I6k6s666666677=7E7g7o77777778898A8c8k8888888 9959=9_9g9999999!:.:6:X:`:::::::;;*;2;T;\;~;;;;;;;<&<.&>H>P>r>z>>>>>>??2?:?\?d???????0 0.060X0`000000011*121T1\1~11111112&2.2P2X2z22222223-3:3B3d3l3333333 4464>4`4h44444445525:5\5d55555556 6.666X6`666666677*727T7\7~77777788F8S8[88888991999[9c9999999::<:D:f:n:::::::;&;.;P;X;z;;;;;;;<1<9<[%>G>O>q>y>>>>>>>?!?C?K?|???????X0$0,0c0k00000S1[1}11111121292[2c2222222!3)3`3h33333334/474Y4a44444445'5X5`555555566?6G6t66666667%7V7^777777788R8Z8|8888889!9)9K9S9999999::P:X:z:::::: ;;7;?;a;i;;;;<<8<@>>>K>S>u>}>>>>>>>?%?G?O?q?y???????0!0C0K0m0u000000011?1G1i1q111111122F2S2[2}22222223%3-3O3W3y33333333!4)4K4S4u4}44444445%5G5O5q5y55555556!6C6K6m6u6666667 7-757W7_777777778)818S8[8}88888889%9-9O9W9y99999999!:):K:S:u:}:::::: ;;5;=;_;g;;;;;;;<<1<9<[)>1>S>[>}>>>>>>>?%?-???????0&0.0P0X00000001%1-1O1W1y11111122292A2c2k2222222 3353=3_3g3333333441494[4c44444445 5-555W5_5555555 666A6I6k6s666666677=7E7g7o77777778898A8c8k8888888 9959=9_9g9999999::1:9:f:s:{:::::::;#;E;M;o;w;;;;;;;<>9>A>c>k>>>>>>>?#?+?M?U?w????????0'0I0Q0s0{00000001#1E1M1o1w111111122A2I2k2s2222222_3l3t333333344>4F4}444444555=5E5g5o55555556'6/6Q6Y6{66666667#7+7M7U7w777777778'8I8Q8s8{88888889#9E9M9o9w9999999":/:7:Y:a:::::::; ;+;3;U;];;;;;;;;<''>I>Q>~>>>>>>> ??3?;?]?e???????0 0/070Y0a00000001 1+131U1]111111112'2/2Q2Y2{222222233;3C3e3m3333333 4474?4a4i4444444 5535;5]5e55555556 6/676Y6a66666667 7w77777778 8,848V8^88888889+939U9]99999999:2:?:G:i:q:::::::;;;;C;e;m;;;;;;; <<7 >:>G>O>q>y>>>>>>>?!?C?K?m?u??????? 00?0G0i0q000000011;1C1e1m1111111 2272?2a2i22222222!3)3K3S3u3}33333334%4G4O4q4y44444445!5C5K5m5u555555566?6G6i6q66666667)717S7[7}77777778%8-8O8W8y88888888!9)9K9S9u9}9999999:%:G:O:q:y:::::::;!;;;;;;;;<">J>W>_>>>>>>>>?)?1?S?[?}???????00%0-0O0W0y00000000!1)1K1S1u1}11111112%2R2_2g2222222331393[3c33333334 4-454W4_444444445)515S5[5}55555556%6-6O6W6y66666667797A7c7k7777777 8858=8_8g8888888991999[9c9999999: :-:5:W:_::::::: ;;;A;I;k;s;;;;;;;<<=>5>=>_>g>>>>>>>??1?9??????@0020:0\0d00000001!1N1[1c11111112 2-252b2o2w222222233A3I3k3s333333344=4E4g4o44444445595A5c5k5555555 6656=6j6w666666667'7I7Q7s7{77777778#8E8M8o8w888888899A9I9k9s9999999::=:E:g:o:::::::;';/;Q;Y;{;;;;;;;<#<+#>E>M>o>w>>>>>>>"?/?7?Y?a???????P0 0+030U0]000000001'1/1Q1Y1{11111112#2+2M2U2w222222223'3I3Q3333333334(4/4P4k4555 6Y77888888899.9999999:r::::::%;<;D;L;[;k;>>>>?-?5?=?L?\?n????`00081S1[1c1r11111182@2O2`2{222222 3d3l3t334445*525A5N5i5q5y5555555666&666J6e6m6u66666666688|999:$:M:\:d:s:_;;;Bj>r>z>>>>???p:0I0Q0`0"101W1a111111111122'2r2222222 333334 5*5?5Z5n555)6G68777777:;#;g;o;;"Z>`>r>{>>>>>> ??'?h?q???? 00T000001 11)1H1Q1_1r1z1111/272J22222222223%383I3h3333333a4~44444444445 55556-6n6666666677%7477777777779999q:::::::: ;,;J;c;;;)<<<<,=4=<=K=_=u=}=======>!>)>1>@>T>b????t`2222233&3c3y33334M4U4h45555556:6B6J6Y6i6F7N7a7999:::o::,>4>C>00P1^11111 2C2x224/5L5T5k55555555X6l7777777777777L8t889999 ::z::;;>/>c>k>~>>>>>>>>?)?J?c????G0X000000 11$1/1N1V1^1m1}111111112$242C2K2Z2e2222222U3]3p3333344474?4G4V4x44445515A5L5g5o5w555556'6/6B6W6b6}6666667(7G7O7b7w77777778889999Y:::: ;X;;;;;;<8v>>>? 00Y111111122E2e2>3333334 44b444455e5v5~555556$646<6O66666$8?8G8O8^8n88889?9f9t9}999999999%:: ;;;;;?o>>>>>??,?9?A?P?]?e?t???0N0]0e0t0'111Z1,22222!393>344%4-4<4L4444<5R5q5555555W6f6v666p777777+8:8D8P8e8t8888899999 ::#:;:::);H;AK>z>>>>>o? 0-050L00'1+111g1o111111123"363C3O3W3j3y33333344&444444X5a555%6<6D6L6[6k66663787D7L77"808P8X8`8o888899999:A:Z::::::;7;E;M;`;w;;;;;;<<=9=====#>2>:>I>V>x>>>>>?2?C?????090v000000011"111=1J1U1i1|11111/272F2}222333.4<4T4h4x444445 5H55555556 66"6*616?6G6N6\6d6k6y66666666z77777 8*828X8}888888899999:::::::2;C;};;< <<$o???????;0Z0i0q00000 11&1E1M1\1~11112282y222222"3D3a33334x444444455*5F5N5]5x5556w666666667 77E77777777788+888888,9d9s9|999#:A:W:_:n::::::;;%;4;;;;;;>5>D>L>[>>>>>b?m????0600 11 1/1?1$2;2C2R2\222223_4k4w44 55%565F5O5Z5z555555 666066666677+797h7777\8d8l8{8A::::: ;;";w;#=C=>>>? 000000011)181X1s1{111112 223222222222223 3383e3|333333333334444!4/4E4N4S4d4y444556!6H6V6q6y66666777-7=77778889:y>?????000'0/0>0N00001 11!1.1I1Q1Y1h1x1g2 33#373I3333/4X4v44444555&5L5T5c5566"616N6m666666678(9Z999 ::h:::I;f;;<<K>Q>[>m>s>}>>!?f?{????@ 00V0^0q0111 2Q2d2l2{2223 3/3333334K4S4f4444446 7(777i88888G9U99~:::::::%;@;H;P;_;o;;;;;;;< <(<05>P>X>`>o>>>>>>>>?0?8?@?O?_????????P800 0/0?0e000000000111E1`1h1p111111111%2@2H2P2_2o22222223 3(303?3O3u33333334444/4U4p4x444444 555)565Q5Y5a5p555555$6,646C6S6666666666 77g7u77777B8P8o8888899999::':6:C:K:Z:;;;;;;;;<f>?`$0,040C0S0003?465555556R7m7y77777 88$8A888889::;;<<2<<<<<<<==e>>>>>>??$?3?Y?|??????p<0F0000000v1~111 2"2*2H22223333333#4>57788-858L88888889$9w99 ;.;R;d;v;<<<6<>>#>2>B>b>}>>>>>>>>>??+????4?O?W?_?n?~?????? 0}000001.1 22%2-252=2E2M2U2e2x22223334 4/4J444 5D5555667787888899,989@9O9f999:m:&=H=m======>>(>:>V>q>y>>>>>>>> ?$?X?j??t0!0R0Z0i0011&212b2j2}22225555%6v66727:7M7u77777788H8888#9D999t::;;<?"?q????)0;0000001"1611112;2A2m2{2222223,3B33"4544475X5556!6627777"8Q8888&9u999;;== >>?6????`00d1o1122O2 3[333344f445555567d7888889:H:Y:::;o;<5?F?`???B1111222223#333*494A4P4`44355556k66666677U88889Y999999::(:R:y:::;;<<<<>]>e>x>>>>>>?"?i???e000001 11+131B1h1p111122A3I3X3`3h3p3x33333333:4B455556#676F6P6o6v6666667787N7t7777788899+9e9u9}9999;;;< <<+>#>W>m>>>>>>>?d???????@0D0K2[22235&5*7Y779"9*999W9u9}99:E;;<<<=>>> 11112 22#2a2|222222222 334I4[4567)71797H7X7z7777777>8F8U8d8888888 999o999999:-:5:=:L:\:;%;;?&>A>I>Q>`>p>>>*???0`%030{000001+131;1J1Z1q11111111 2227777789/:c::s<<<<=======@0-050H00000c222222223+3R3333D4'5/5B5d5l5t5555555556!6)686H67777(8O9:;<<<)=7======8>M>X>g>P`j001191L11[3333 4$4,444C4S4u45$6,6;6g778888888;%<<`>>>>>`,}111 22w66668<>>%>>???0"01011 222)292T2\2k222222231393L3}3333334;44455R555555566737a7i7|77777778 8/8@8O8W8f8_:n:v:::\;;;;<<<. >3>>? ??G?q???0 0020:0M0c0k0z000000001`1h1w11111}222233,4Q4|444J55555556 66E6`6h6p6666666-777788_8n8v888888 99"9E99Z:u:}:::::::::;k;;;;;;<=t>>>>>$?G?O?b?????00B0r001121112p222222222222333&353G3O3W3f333334444D5L5T5c555556 66$666>6F6U6g6o6w66666666.7F7e7m777?8]8V9t99/::;;;;;; <:>B>Q>^>i>q>>>>>/?s?? 000%1B1Q1Y1h1r1122&22222!363W33333333 4"494A4P4b4q4y44444)6;68$9,949C999: ;&;;;v<~<<<<<<0=J=R=i==>M>{>>>%?-?K?z???d0o0w00000014111111 2:2:3T3\3k3354=4P455555V666667>8F8U8888889,979?9N9Y99M:::::::::;P=o===<>T?????????? 0Y0|0000000^11111213?3[3v3~3334444 55;6C6R666?8W8i88889%9-9<9L999999J:u::Z;X>? ??#?3?X?x???*00000$1,141C1S1g1|11111111172P2X2g2}2223 3!343<3K333333333b444d5l5t55597^74><>K>??00000011'1111111112222h222222223 33#3D3v33e4m4u445555555 7X89699L:x:::;#;+;:;b;;%e>??l00122*252D2T2r222223333345\55+6678=99999:):<:R:6;V;^;m;;;;;;;??D 0000712 3!3j3|3w444.555V7r7758]8e8q8<<<===? 0000001j1r111112223 33?3G399::L:b:y::: ;;X;;;;;<< ;>>>>r?????0t 0,0h000001142t22243s333J4`44444666667"7777778"8*8988z999s:<>2???@;0M000001!111 2>2P22e3w34 44444(55576666668888889g99:<:D:S:r:::::::; ;8;;;;;;;;; <PL2T3C4I4a4i44'555f7k78x889"9>9Z9999;?;G;V;<<>[?p00*0H0P0_0000=1a11111*28222222333334424M4U4]4l4|4445 55*5E5M5U5d5t555555546O7\8z88881:;;;==>>???,000000 1`1111d2s2{22-3D3L3[333334444h5555555566G6O6W6f6v666666677$737T777778s8'9/979F999W::;P>>>> ?3?]?o???080@0O00001 11Z1r12#2/2>2`22222222333333333333(4?4G4O4^4n4445k5z55G6U6666667w77778878Z8i8q88=9T9o9w9999 :d:r:::::=>>y?????ld0l0{00-1122+2C3N333333#4i4466677o77q999999F::::Z;u;};;;;&<8<<= >>>*>`001 1/1:123f3v304_444%5:5J5Y56779:D::V;t=====p>>>>>>9?T?\?d?s???h00001"1B1T1M2U2]2l2222222=3b3t34"4=4E4M4\4l44444444455D555666777788F9L:T:c:";0;x;;;;;;;;;<>??0080@0O001'1T1\1k133334'4/4>4I4h4p4x44444455555555777"7-8?888:S:r:z:: ;;";-;L;T;\;k;t=|=======>>>M?R00 11"11111"2*2C2Y2x2222333333334144a5g55r666666 77$7U7777`8m88.9O9W9j99999999f;|;;;b<}<<< =%=-=5=D=T=>$?A?z???????000011&252=2L222 3P3F455555556[6}666667@77778"8*8I8Q8`8889959P9X9`9o999:1:9:A:P:`:: ;%;-;5;D;T;;;;;; <<<<<<<<<^=h====2>H>>>>>>T?d??????00&050k000000e1m1u11C222224393C3K3c3333333344444444455|5555555556\66666778C8 99b9t99;:j:|:#;p;<1<9>r?`0 1~1112)282h22I33444 55555566+6L6T6c6n6666666667 77$7:f<= LJ1}111111445 5(575G556"6*696Q6h6v666666782:;G?g??0"090A0P0h0p00191H1P1_1v1111112e2u22'3445555666:::::: ;;;;;;<<<<<<<<<<====== >E>P>X>g>>'?/?>?@(015*525:5I5Y5#678889:;1;9;H;;;;;;;;"<<<<<<<*>2>:>I>Y>w>>>>>>>>>> ?/?F?N?V?e?u?P0-0700112 2242O2W2_2n2~22222 3344!4O4 6y6678$9,9;99:7:::;;;;;;<-<5<=}>\?m???` 000(0800000000011D1L1_111"2?2O2a2333334$4,444C4S44444455%5-5<5L5#6+636B6R67 888)899"9*999Y;z;;;;d>s>{>>>,?plB4v444444555Y556b66607V7777777^8m8u8}88888889.;B;b;j;r;;>>>'>6>????p00011$131B3333334555&5n556 66 6066,7b7p777777'8w88888b: ;;#;+;:;D==>A???"0=0E0M0\0l00011112-252=2L2\222222222e333333334444F55555555566+6U777J8d8888949O9W9_9n9~9999999;; ;(;7;<1<9>>D>c>q>>>>>>??K?S?[?j?G1r2223l3333333494A4T444444445555s66666 7Q7j7r777788%848X888888 9,9v999999: :(:0:?::s;<;=C=R===J>> ??$??40~00000C111112F2T2c222222222;3C3\3333333 444,4w444444v5566G7f7777777 888!848\8d8l8t8888999b9999999: :3:K:S:f:~::::; ; ;X;o;w;;;;;<<<)=F=N=V=i===B>Z>z>>>!?i????E0W0{0000u11!2E2M2U2]2p2222333 333o333344B4M4U4d44444445G5v5555666'666N7777788u888888899h:q::::::; ;O;q;;;;;;<>!>0>=>Q>`>k>>>>>>>?R?`?????00:01'1O1]111111,242C2W2r2z22223333#445\555#646666666666 7727A77)888889 99 9E9M9`9p99999999999-:9:M:y::::;; ;/;E;M;\;~;;;;;;;<<<<>> ??????0020H0f0t0|00001}111!282@2H2W2g2222222U3a366%666667737H7T7c777778B8J8Y88888888:999999::9:A:P:_:8;D;S;i;q;;;;;<<9<<<< ==>F>T>>>>> ?0!0)010@0P0000000A1P1X1g111112)2@2H2W222H3334344:;;!<_<<<<=="=?=h=p=========">4><>K>>>>>>000'0R0}00000000081C1K1Z1111122323n33344<5r55566{6667B7N7]7828:8M8d88884999;;< <*<<=0=8=@=O=_========>> >/>?>>>>>>> r00000012 2G2y222222222 3353P3X3`3o33333334 44$424M4U4]4l4|444V566L7R8m8u8}888889 9(979G9~9999999e:::;";*;9;I;;<< %>-><>0L0 22"22?3333334[44m7/999:$:,:;::;';/;B;e;;;;;|<=>@Pu0}00 11 1111+535B5L7W77r8x88888h999U:::::3;R>&>C>Q>g>w>>>>?(??????p$ 00C0P0[0m0r00000000111191L1V1111111112*2A2K2f2222k333334,4E4c4o4w4444444455-5556*666Z6667O7y777#8I88888888G99998:::::;$;9;B;H;L;b;i;;;;;;#<,<2<6>!>0>A>T>\>k>>>>>? ?/?x????h000L0X000 1/1B1J1Y1{11111112222233/3R3Z3b3q333333334!4.4=4X4c4k4z4z9(K123399:< =M>V>v>M?f?y?00700000001141P1Z1k1x1111112 22)222J2]2a2w22222222223%31383<3Q3_33333 4444:4I4Q4W4d4j4p444455'5-515@5W5d5n5555555<6V6\6s6~6666666677 7$737>7F7M7Q7j7z77797::;;#=-=2#68a: 51E111,222223 33&3L3d3s333333333(4.4W4d4s4~44444445 55555\666666677&737X777 8848J8j8}88888889$939>9U9\9|999999999;;;;;;;;<<=====>,>L>[>{>>>>>>>>>>>#?+?4?>Z>>>7?J?k???|0.040W0000 111112H22222?3b3}3333344a555*666U7q777788890:::;-<<<$=L=S=>Z>p????X02J444505>5N5T5b5n5z555555 6)6^666677*7e7s777777778'8F88@88899$949D9Z9`9d9j9n9t99999999999:=}>400w1222444e6667C:H:#;.;===*>f> 01>2N22 383J3[3|334%5.57777777778878R8X8p888U9:M::;3;E;;;;;9>(>=>O>b>v>>>>?]?q??0$,0B0q0}00000001131S1f2r22222222333;3N3Y3p3|3333344&4E4M4\444455&5E5M5\55555656C6\6r66666666 7"7=7E7M7\7l77777777 88F8T8i888888889929M9U9]9l9|99999999 ::6:H:Z:r::::::2;:;E;S;`;k;u;;;;;;;;;;<<<=]===u>>:?q?x???PXV000 1:11Q22222q333E44444 5I5'6668)848:8k8x888.;V;;>h>>??]?`L1,1G1e1111 22233I4m4444*88:;;;;<<==,=W=]=|===p@555566#6>6F6N6]6m6z77;;; >????????H000000?1y233333355555 6H666-7t777777819C9I9S9999*:g:l:::<;~;;;;;;;;;; ,>|>'?B?J?R?a?q?????0000000t122 333*3^3445e6666666N7_7q77777888889&9.9A9N9999999999 :8:::::::;";2;A;\;;;;;<$<,<;<^>>?$?3?U?]?e?t??]0000111122:2U2]2e2t223!313H3P3_33334h44444444455"5H5c5k5s55555555667 77$747F7Q7Y7h7G8U8g88888 99!969J9^9i9x999:::5;D;S;<(<:<<<<<<<<<<=!=7=?=N=f==h>w>>>>>> ??/??)0;0M0000000$1,141C1Y1i1{11111222224444;5555555566'6@6|6666;7778k88 9P999:N:c:::::;;=;E;T;_;z;;;;;;;;;;<>>>?L???????0 070?0G0V00)111@112A2_2g2z222222223'3<3D3S3n3v333455w677(8y88888k::::`;<==>s>>x?????00Q001312444_:::;.;D;;>y???1090H0z00011"1_1d1111111D2i2q2223/3B3J3g3v34445 555!5)5:5{55555555566T66n7777777777T8c8z888880999E:r::::C;K;^;|;;;;B<<>>E?M?`????? b0}000000000111122"2k22223t3444445G5b5j5r55577|77777777778?8N8#949:99::;)<<<-=5===L=Y==@>>? 00+1K2s3{334455"5l55556\667 797J7|77777778888881999H9b9t99999*::::::;#;;;;;;;<<<<<<_====='>T>>>G?? l000000B55555555(627=7v7~77+888R8g8l88888889949<9B9q99999:<>>x?0 h000005677d88:;;D;L;T;c;r;;;;;;<<<<<<<< ==.=6=E=^=>4>???????@ 0"0*0=0|000000061O1W1f111-3D3N3b3j3r33333334 44E4M4`4444 5i55555<6M6}666 77l777E8M8\8j88888,9?99999l:{:::::::;;;;C;K;Z;;;;; <<"=>f>q>>>>??,?6??????P 000.0?0J000001&1A1I1Q1`1p1b22223Z4m4|4]5g5555Q7Y7h777777788-9799 ::!::::::;.;;;C;V;a<<<<==???????` 000000000000@1L1^1f1u1<2U24434;4C4R4h4444455"555e5m5|555556667 7/7#8g8|8:::::::/;7;?;R;;;;;<<<==I=Q=d=s={==g>>p 0000001:1B1J1]11111 22%22222w3333333B79#9-9R9Z9b9q99999:::-:S:8;;;;<<< =/=J=R=Z=i=y=Q>>>>???? pL0b000001"1*191a1u11"2,2T2222222%3?3H3344+4d4l4{4l55556:7B7Q788":D:::::<<= hy012 2<2W2_2g2v22B355B6]6e6m6|66K78889999b:n::;;<<&<>D>L>[>k>> ? 000;1V1^1f1u1111112,242<2K2[2222223%3:3U3]3e3t334475D5f5n5}55555555566c6*7|77?8J8R8a8p8T9\9k9{99999999*:5:=:L:c:k:z:::::; << < =\=d=s=X>r>G? 401N6X6x667 99::;;[=g=u===/>T?g?? H001s111112g222?3M3r3z333464G4O4^444444(505?5z55 66!6666667(767A7I7Y7g7r7z7777777788(8F8M8_8g8v8888889K9Q9e9v9|9999999:W:]:n:v::::::::::;&;.;=;Q;a;;;;;;;<<,<47>=>K>S>b>z>>>>>>>>?4?K?w????????? hm1<2V2[2b2i2p2w2666666667'7O77x88888899o999J:::%;B;e;;v<<<<==>k??? 44[;K=? -334.4v44777778#8+838B8R88888899<9Q9999.:^:y:::::);;;;;;;!<.<5>>>>??#?.?\????? 0050@0K0X0h00000x111112"2-2A2F2U2d2n22222K3333 4;4@44K5h5v5555555 6"6K6S6b6k6~66667 77*7@777777*89&9K9f9n9v9999999: ::#:::::::;;>;F;U;c;;;;;z<<<<8=P=>>>??G?U???????? 0"070000000222223C3Z3b3j3y33333344 4Q4r4z4444J555566d66666,88889!9)919@9P999999::2:I:a:x:::::::::;i;#<>g>>>>>>>>>> ?? 01b1p111111222223I34#4+434B4R444545<5D5S5b5}55555u6U77 88G8O8W8f8x99999r:z::::::::;;;*;b;j;t;z;;;;;;;;;<<<'>6>D>r>>>>>0 822223#3+353;3A3M3m3333?4F4_4:566:_;;@ L222263q3B5a5i5x555567777778{8888888O::<<<>P l"0)112,3\3d3l3{33)45#5{56667j7!9;999::::::;;';;;;<<'<<<<<}==>>>>>` X222D334"55C666678889 99$979I9X9`9o999999:::;;<=>>>p 0*1A1s1222"3)333333X4s4{444444495D5u5}555 6"6=6E6M6\6l6666H77777778S9-:B:N:]:;;;;==>>> 0/0J0R0a0z00000115:0;f;;;V<> l22%2k2s222222:5889)9@9H9P9_9o999999 :: ;%;-;5;D;;2<<<==)>D>L>T>c>s>>>???? 1222222>3U3]3e3t333333445555(646>6k66777w8888888899-959=9L9\9k9~999999999:-:5:=:L:\::::::;;!;8;Z;b;j;y;;;;==6>s>>>>? <0122 36999:;;;;;< <<2???? 0-050=0L0d000011$1=1T1\1d1s1111111#2<2i223455`7h7p777777778 9&9.969E9h9r9999999:(:4:C:; !>(>6>R>_>j>>>>>>>>>#?)?J?\?t?????????? 0%0H0Q000000000011 22t2|2223 33)373E3y33333333F4(515L5W5c5566677%7)7/797=7C7M7W777778889*:::Y:a:t::::::;@;; <<$>>>s? +0|000D1L1[1f11111111W2_2g2v222/3C3l3333333444'414;4B4L4S4c4s4}444444445H5O5e5|5555556 676A6O6W6j6u6|66657E7T7\7k7777>8D88888p99999::D:b::::::T;\;;;;;;<<<(<<<<===&=-=b=j=}======== >>#>.>>F?L?\????? 30000001V1e1m1|1111 22#232@2222223S3h3333 4444<4D4S4c445545R5Z5m5|555556l666677)717D7V7^7m7777777788%878?8N8888889 99,949C9U9]9l99999999%:-:<:::;$;,;4;C;S;;;<>>>>>??m???? 00000,11172u222373?3R3333334%45 55#5.585B5L5S5W5]5d5x55556666677,747G777777778#8>8M8U8d8D9_9g9o9~99N:m;;<<<'<=>8>??F?N?]? 01q1a23(3C3K3S3b3r333 44!485S5[5c5r555555666-6X6s6{66666677"7-7H7P7X7g7w7778899)9;9~9V:s:::::;!;L;T;\;k;;;;;;&5>o>>=?R?Z?i?????? [00001 111,1:1b1m1u1}1111111 22!2@2t222222233"3;3z3333334;4{444#555555f6p66667u7777778,888888899$939y99999:%:I:Q:`::::::<'<\>Q?0 n11.262E223D3L3[33Z777777718889%9i99999: ::,:8:@:S:^::::::: ;;(;3;R;Z;b;q;`(>0>8>G>W>>>>>>>>@ 0111-1O1111112d222222223 33*3F3a3i3q33334,4444444447*779999:;G=r=w==>>>>>>P L#0>0F0N0]0m02g222222#4>4F4N4]4m4`7r779999;@<==>%>,>?` `0G1'4E4[4b4h4s4y444444444444455!5/5J5P5V5k5u5|555556%6666666 777*747T7~77777778 8"8+888Z8i8s8888888 99999999 :f:m:====A>K>????p `01111122P3W3$58555555S6X6_6666667 7/7u7|7777779D9K9!;(;=> >u> |11d1111111I2X2_2222222Q333444/555>5H5N5W57779999:::;h;o;v;;;;;v<<======>> (~0021:1`366L9S9999:\:q: 7]> 9 4=I==>>?Y?a?p?? 03354T4h4p444444.5`5566E6p6666667"717]7e7t7777888w:::::;";@;H;P;_;u;;.@>H>P>_>o>>>?*?/?4?U?^?i???? 0101S1e2w2222/3333334@4j4444C5g5555566&6V6q666666667R7889 99U9e9q9x9~99999$:5:X:;$=-=6=?==@?`?h???? D600 111/23"606_6}6667O777 808Z<Z>o>v>>>l?0 d0c1~11111J2e2m2u2222222334445 55#525R5m5u5}555666'6Z6637O77>899D9L9T9c9p999999::;+;;;;;<4>??` (00#1S1m111+2?222233n4N55555556;6d687S7[7c7r77k99::':6:K:S:f::;I<\>>>>?)?=???p 0!0A0a0z000001J112b3q3y333333334$434@4~445"595677=7b7}7777778:8w88888'9/9>9Z99999:#:+::::;;< <e>m>|>>?^?q?y?? tJ00(1>1M1U1d1111222 444444526E6M6\666667777 88"848G8O8^83;>;h;;)<7<<,?? 00#060000 11$161>1M11 2:2B2Q2222223 3/3J3]3e3t3~33333#44444)5\55555596H6P6_666666677%7B7Q7Y7h777`8r8888888889 9%919":*:9:::F;r;;;<<<<= =='=4=T=|> x=0O0W0j0{00031~132d2l2{2 3c333333+4444Q5Y5h555606n66779===m>}>>??&?.?=?Q?k?s?{????? 02,2233'3H3P3_33334 44!4+454?4I4T4Y4k4444444435N5566667!7N7a7i7x77777777788%848D8W8_8n88888%9D99999P:::h;;<5=D=L=[=u=y===========================>> >>>>>#>)>->3>7>=>A>G>K>?? 1 121:1I1b1u1}111222422223484@4O4 55R6[6i667-757=7L7\7"8>8899$939C9T99:G:<<<<<8=K=S=b========9>L>g>o>w>>>>>c?? x;0012Z3334445,5>5F5N5]5h5555566787F7f7n7v77:;<<<= ==&=~====>!>)>8>E>X>`>o>????? z00000"1X111B2P2r22222334:4Z4445\56"6A6l667878?8G8V8f88V:(;H;_;r;<<%=-=<=W=k==Q>z>>>>>>>> ????? 0J0Q02222m3t334+434B4445|666677h888[9c9r99:: ;;;.;{;;;;;;;C>#>9>u>>>>>> ??7???X????? 00C0011+1A112#2R2233)383R33334-4i4t4|4444444"5x5556 66E6M6`6666@7777778"8*8=8888888839D9L9_99999*:U::::: ;(;];~;<1!>0>8>G>>>>>>>>>"?J?i?x???????? 00.0Y0000w112I22:3V3n333334r44444444555566!676Q6Y6h6666666666 767>7M7_7g7v7899: ;.;q;;<<<<<<<==3=;=J=\=d=s===== >>$>3>e>m>|>>>-?Q?Y?o???? 0G0p0x000111W3^3e3l3333344%4,4w4~444444475>5E5L55555 66F6Z6a66666667 7W7^7e7l777778 88<8c8j888888:9A9t9{999999T:[:b:::::: ;;C;l;;;;;;<#<*<1`>>??0 00.0U0s0{00000000L1g111111 22'252P2X2`2o2223:3I334A4_4g4z44444444D55X6h7v77777778;9N9k9z999999:+:?:[::::::E;`;x;;;;d>{??@ 0000{11122233 343I3U3n3w33333344(434;4E4M4`4x4444444445595U5636666777B8Q8Y8a88M9_999999@:::;`;;;_<<< =[==U>>>>>>>>>??'?Q????P 00151=1P1a1|1111111112k22222%3G3\3t3334 4/4D444444455#525Q5556L6T6c6666667#7c7k7s77777777 8'8/878F8V88888899999:.:@:V:; ;4;:;A;S;|;;;;;>6>>>F>U>e>>?` C2M2W2a2k2u222222222222223 333)333=3G3Q3[3e3o3y33333333333333444#4-474A4K4U4_4i4s4}44444444444444 555'515;5E5O5Y5c5m5w555555555555556 66!6+656?6I6S6]6g6q6{66666666666666777%7/797C7M7W7a7k7u777777777777778 888)838=8G8Q8[8e8o8y88888888888888999#9-979A9K9U9_9i9s9}99999999999999 :::':1:;:E:O:Y:c:m:w::::::::::::::; ;;!;+;5;?;I;S;];g;q;{;;;;;;;;;;;;;;<<<%>>#>->7>A>K>U>_>i>s>}>>>>>>>>>>>>>> ???'?1?;?E?O?Y?c?m?w??????????????p <0 00!0+050?0I0S0]0g0q0{00000000000000111%1/191C1M1W1a1k1u111111111111112 222)232=2G2Q2[2e2o2y22222222222222333#3-373A3K3U3_3i3s3}33333333333333 444'414;4E4O4Y4c4m4w444444444444445 55!5+555?5I5S5]5g5q5{55555555555555666%6/696C6M6W6a6k6u666666666666667 777)737=7G7Q7[7e7o7y77777777777777888#8-878A8K8U8_8i8s8}88888888888888 999'919;9E9O9Y9c9m9w99999999999999: ::!:+:5:?:I:S:]:g:q:{::::::::::::::;;;%;/;9;C;M;W;a;k;u;;;;;;;;;;;;;;< <<<)<3<=>>'>1>;>E>O>Y>c>m>w>>>>>>>>>>>>>>? ??!?+?5???I?S?]?g?q?{?????????????? d000%0/090C0M0W0a0k0u000000000000001 111)131=1G1Q1[1e1o1y11111111111111222#2-272A2K2U2_2i2s2}22222222222222 333'313;3E3O3Y3c3m3w3333333333333344455696667 77^7l7777778C8i8{888888889&9.9=9M9_9?:Q::;; ;;;;;;<<<<<<======>H>P>_>z???????? 0000000171j111112 22#292A2P2\22'33333334L4b4444455545R5m5u5}5555]6i6x666666667#7677L8j8r88888899$9:9B9Q999999999::::;;;&;6;H;^;f;u;R>)>B>]>e>m>|>>>????? H08000011111<222222233.383P3i3u333333333333 44&404G4j4r4444444445515B566%676J6Y6d6s6{666666667$7@7H7W7j7777#808J8[8x88888889y999 :):6:G:Y::::::;O;~;;<<"H>Q>Y>h>~>>>>>>>>!?)?8?I?W?_?g?z???????? T0$0,040C0U0]0l0x0000000000111-1?1c1111111 282>2M222222333)333=3i333333#4+4:4E4U4b4444444445 5*575A5L5T5c5y5555555556,6E6R6Z6b6u66666666667,797M77777777778&8@8$9/9R9d9v999999:!:3:~:::::::;$;3;;;;;D<<==== >K>T>d>>>>>>>=?E?[??????? x0-0b0o00001 11I1Q1Y1h1x111111 2'2/2B2R2a2i2x22222222+333B3T3\3k3333333344464F4U4]4l4444444555556646666666667"7*797F7S7i7q7777777778V8_8q8w88888889999A99999:":Q::::::::::;(;/;A;I;X;z;;;;;;<<<<8<@>1>:>U>f>>?+?3?F?c?j?x? 00+090H0S0b0m0u000000001#1=1y1113334455,5q555555555%6z6666666[7{77777G8888b9y999::3?? h0 1!181?12233334555$6f7788?8g88989=9]9t9:="==>>>?$?,?;?_?g?v?????? 0 0000$0.080B0L0m00011$1311112233444575?5G5V5l5555555)818D8\8d8{8e9999V:o::#;<3=>M>n>?o??????t0B1Q1Y1h11111 2@22233+363Q3Y3a3p33I46666677777 8d9y999::;;<>??0T02 2O2222233334J444 585@5H5W5i555555*6w66661797H7c77777788818S8 9999:v:~:::::;;;;;(<3G>[>t>|>>>>>>>??'?=?O?W?f?q?????????? 0F0c0k0z0000000000`1k1s11111X2222222333v333333N5678^9j9999::!:):J:_:;;9<\?P i145x5$8i8o99K>S>b>v>>>>????p0%0o00000000A1L1_1g1v111111112/3D3_3g3o3~3333374I44444455,5G5O5W5f5v55555668z999999: ::::;@;b;;;;;;;<=>??0080C0`0h0w000001111 2223O3g33D4m44444 5%5-5<5L5e5m555566'666X6{66666667l7778+8C8_8n8y8888889%9L9T9c9r999999999P:y:::::: ;;-;e;p;;;;;;>%>-><>L>X>>>>>>>?*?2?:?I?Y?????+0m001t1Z234Z4u4}444&5l55566P6666666 7N777880888G8"9*999Y9t9|999999::;;2;:;I;;;<> ??3?F?N?]????????000$0;0C0K0Z0j0000000001/171F1Q1l1t1|11222223363>3M354\4q4y4444444445 5555=5G5O5b5l55555555 6+636B6R6n6666666666 7%7-757D7t7z78-858D8b8}8888889:I::::::;;4;G;V;q;;;;;;; <<<(<8<.=v=====D>L>T>c>>>>>>>>>?B?]?e?m?|???-0B0P0g0000000 1!2j2222243<3D3S3y3333333344D4L4[4e444556"6*696J6X6y66666677)7X7s7{777778 8/8:8p8x8888-9B9P9g9999999 :\:::>;U;;;;;6>%>/>b>}>>>>>>>>> ??$?T?o?w??????+00000 1141k1s1{111111 222,2<2334:4J44444444'5I5Q5Y5h5~5555566"6E6M6U6d66666)7;7R777777778,848C8o8w888888888 999,9<9x::::;;;C;K;Z;j;|;;;;;;<<<=I=[=r=====>>>0>G>O>W>f>v>>$?2?D?t?|???????50C0U0{00000000122222223353=3L3h3333P44C5K5t5{55o66667"7=7E7M7\7l77777 8"8*898J8e8m8u88899X9j999999: ::):?:=F=N=]=>#?5?L?`?h?w??????|00*0c0u0000001)11191H1X1j13444%454m445.5=5555~66G7O7W7f77758K8m8}89R:w:m;<6>">?>`>{>>>>>>>&0A0L000000000'1w11113333333$434;4J4d4s4{4455666677%747?7N7V7e7r7777W8e8x8888 9(9=99999::::;@;O;b;~;;;;;;<: >>A>P>_>w>>>>>>>>>?"?E?T?g????????)0-040>0S0k00000001'141H1\1p11111111222<2K2W2a2k2u22222222233#3-373Z3i3u333333333333444%414444 5555676g6o6~66666666`77777777788;;<>p>{>>>??X??D2>45_88929M9Y9h999: ::X<~<<<<<<=*===)>z??89 9/9A9<8k2v2333!414Y5s5555(777?7N7Z777777>6678!8Q8a8 03788889;&;;;;;<<==>+>0(00011s55555D8O9999@b0{6666667 77U7777778888 99999999;;e;;;;;;;;;; <<8=R=m=u=}===h?z?????P 000*0:0U0]0e0t00`1n11111122223 33t33333 4)5o555555555663666X7`7h7w78*88888\9j99999::;;$;3;;;<<<<]=o=>>>>>>>$??`080o0~0000000191c1112>2{222222222233+3g3o3~333344;4C4K4Z4j4444555526S6699:;;[;;;;;;;;<<<<<<==== >>5>P>X>`>o>>E?`?h?p???p+0@0N0000000111-1Y1_1i111111 22"2d222233 333A4P4X4g444444485O5e5m5|56K6h6p6677777O8W8f8W9r99999999 ::3:N:V:^:m:}:::*?=?E?T?~????0M0000001131H1W1n1v1~11111112 22!233>44444$5,545C5d5l5{5566>6Q66777778899::9:C;d;j;;;><<<< ==#=@===>>L?g?o?w???02 22#2J22E3`3h3p333333333r4444444$56V6h666D7L7T7c78J8R8~8888888 99>9r;;<*#>+>3>B>R>q>>>> ?'?9???&0`0t0|000001 1/1:1U1]1e1t1111~2 3B3d3l3{33333p4444444555)5D5L5T5c55555555n6666666T778=88 99#949<9K9o999999999 ::!:8:@:O:i:O;[;j;;;;;;;;;;<>|???????0d0i0y00001111112p222233+3>3F3U3g3334%4D4 55 5X5`5o55#6r6z66666J7X77777888-8W8e89 9V:\:;<<'<6< >>????????001090H0T000000001181@1O1l1t111111111222223 33G3P3W3^3u3333333a4444444444)5>5Y5i5|555567g7777 8+838B8b8}888888889$969R9m9u9}9999:%:-:<:N:Y:h:x:;;;'">)>B>>>>>(?5?C?z????L0X0M1i22222 3,3m3{3333344#4245/55566!64688i99::::::Q;;;;d<<==*=1=M==>c>l>t>>>>>>>0?b?n?,/0B0000111$1.181Z1_1k1v1111152e2k2p2w2|2222222%333333333 444#4h4o4444444445 5525X555556.676H6`6f6666S7k778 8%8<8F8S8888888 9+9k999:::7;g;t;|;;;<<<<<<=1=Q=V=\=b=h=m=t========= > >/>F>x>>>>>>>??=?B?K?i?r?????/0N0Y0`011122-22223>334Y445&5u5|55555566*6q6667789 :_::: ;h;o;;; <<<======> >>m>w>>>? ??)?;????h00K3Y4e4444W5`5f5p5z55555555556 6:6D6q66666l7777777]8}889$9*949>9\9a99999999Y:::::-;5;H;;;;;9>>+>>>??_?g?v?????90G0n0v0000111%1911111122(252=2L2Y2a2p222222333#323P3X3g3x333,4Y44444455%5=5c5k5z5555555555566z666666666 77#727?7G7V7c7k7z77777788888899*929:9I9[9c9r9999999990:>3?A?L????  0f0001A1S112!2,22222[34H4&5v555555555556 66(6R666666K7T7777777777778 898s8{88889a9p9999:G:Y::::;;<<<<<= ==C==#>W>>E?0111112S2222223333333334 444!4+4^4f4n4v4~44444444444:5E5b5j5r5z5555555555555556 666 6(60686@6H6P6X6667 7(70787>7F7N7V7^7777778 888"8*828:8B8J8R8\8w88889999'9-959=9E9M9U9k9999999999999999::&:5::::::::;;;;$;,;4;>;s;{;;;;;;;;;;;;;;F'>/>7>?>E>M>U>]>e>>>>>????&?,?4?4H4444455A5K5s5}55555546V6f6r66666 77+7=7E7M7U7]7m7x77-8:8S8{88889 9;;<<====j>>>|?P,0e000001F11111 2=2i2233,3g3}33334M4\4r4445P55555:6666678899099999E:Y:j:::: ;;;;;;<2I>Z>>>>> ?s????` 0"040g0001"11111U2q22223A3R33344d44446H6U6m6666=7p7}77778b888889I99999:@:r::::;T;;;;<>>>>??*?2?:?B?J?R?Z?n?|?????pM0W00011R1\111 22G2W2g2o2w2222222 333333d4r4}4444465f57#7`999,:H::::;;4)>^>r>>???[0q00001%1A1o1112>2M2223374F4u4444555526p666717777 858:8:Q:k:::::';=;Z;;;;;<&<<<<>>> ???????0s0007B7J77777889:~;_< ==@>>H0)23o4556d7~777J88T9^9*:D:N::;t;<<=$=.==/>P>\>>?(O000d115688:2;<>>>r?41f1111M2y223U4[66666666666677&7.767>7F7N7V7^7h7r7z777777777777788M8d888888888888'9/979?9G9O9W9_9g9o9y99999999999999 ::c::8;;<8<>>#>+>3>;>C>K>S>[>c>>>?"?-?6?W?_?g?o?w???????&2222223 333!3)393Z3r3z33333334k55555556 66#6G6k6u66666666 77;8A8x8888879=99999`:::";o;u; <<<<< ="=Z=z====>g>s>>j?????0%000000011I1O11111111112 222$2I2Q2r2x2222223343334|4444 5,565I55556,646i6o6666666677$7,747<7D7d7777778 88%8L889C9h997:X:n::::;$;2;B;`;j;;;;;;;;;<<-<7?>J>^>l>40)36777788 8888#8t8y8~888888888888888888899 9999$9)9.959;9999999999999:(:-:2:9:>:C:J:O:T:[:a:h:s:x:}:::::::::::::::::::::2;f;;;;;;;;;;;>_>>4?9?>?E?J?O?V?[?`?g?m????????????P0 0000!0(0-02090F0K0P0W0\0a0h0m0r0y00000000000001S1d1i1n1u1z1111111111111111111112 2222 2%2,22292o22222222333&3R33m4u4}444444444445515755:6?6D6K6P6U6\6a6f6m6s666666666666 7777 7%7,71767=7R7W7\7c7h7m7t7y7~777777777788 888h8x8}8888888888888888888888 9999 9%9,91969=9C9J999999999::::":,::;u;;;;;;;;;;;;;3<<=t=y=~=========>> >>>>$>)>.>5>;>F>K>P>W>\>a>h>m>r>y>>>>>>>>>>>>>>>>? ????!?'?.?}????????????080K0^0f0n0v0000000021111 222#2+21292A2I2Q222w3455555?6777y88;;;;;> ???#?+?3?;?C?K?S?[?c?o?? |r0000'1-151=1E1M1U1]1e1m1u1}111111111272E2M2U2]2e2m2w2223$3,343<3D3L3T3\3d3l3t3|333333334A4G4O4X444444 5555'5/575?5G5O5W5_5i55666666666666666X7`7h7p7x77777777777782888l8y8888889 999%9/999U9e9m9u9}99999999999999:N:::::::::::::;;;+;1;<;J;];k;;;;>??@0011Z2t2223%3j33&4`45555555566666'616G6o666k777777777778 88858e8882999999::R;;;<<<&<<==:>H>M>U>m>>>>>>??H?M?V???????P080=0F0000000,141L1{11111111(2-252M2x2}22222233%3h3m3u33333 444V4[4c444444445=5B5J555555555$6)656|66666677%7=7h7m7u777778 88)8h8m8u888889 9999h9m9u999999: ::-:X:]:f::::::;;H;M;U;m;;;;:j>>>>?`800333334j45526M68W99I;a;<=*>l>>p11 233666 77L7Q777w8888888<9e9}999999999 :O:a::;T;[;e;~;;;;;;; <<&F>L>Q>>>???040L0d0q0~00001 11c1h11111 22$2+2>2I2222333#4Q4|444535V5r5555555555666)656A6M6Y6e6q6}666666666666:;C;c;;;;;<#>s;;;;; <<`< ?13%4445l77a99:b;3<=>'>6>E>T>c>r>>>>>>>>>>??&?5?D?S?b?q??????????00%040C0R0a0p00H13@444.5y556;6J6Y6|6666666'767Y7h7w77777778+8Q8`8o88888888 99G9V9e9}999999999 :.:[:j:y::::::;;,;;;J;Y;h;w;;;;;;<%<7u>?T?m?? 0+09;85>P>t>>>>?(?G?k??L00z334444444566667(7@7X7z7778j9s9{99u:|:;*>@300m:;;<#<^>>>PA071=1R1v11`l4:;p<>|?pX*0J0}273Y3y3333{44444"5)50575>555555C6777778<<==?{???_0f0m0t0624??? 122222333)38877c8r89:;|>>>> =====?????0344484????@V3a3h3o3v3R7P(44444>5<9>????`D011111111122$202@2Q2^2o22222277$7+7::p,39899=:;;;w<==l>?????,n0!1 224L444_555_6F999,4:7N77789<*<====>>?%??00X02 3333144C77899u99D:S:5;%<$3:4C4K44E5L5667:*<<<0157789:Z: 4<-<3<<>=E=>>> 12222s667788s92a446*77L8L;;$#44557!8H9<=j=o=??  12067888,99>@3'4}40;P 39`,377,878~9O::';;Z=b=>>? ?,??p,{01233)4G4c556:79%:/:=>K?m6==><0#5#7*717?7F7M7T7[7b7i7>>??0236=G>?i?2?47l889:O; $0)1B2668<999=;C;X;|;;0r>A??@,000-1;1}11X2233j5a:: ;>P z34`2779%9: ;;;b;p(w178]x????4 0%000144$5-5i555I7j7777====,>L90Y011122#282A2R222233345626668:s:L=]=c==n>u>??$031363B33C77[88P99C:;156l7=889>h?D22&5o5]6{99:u;z;]3b336r6677 88 9H=00090V5888"9K9r9999":<=>>?@???$112B2p23s56a6678~;  2026"9*929:9B9J9R9Z9b9j9r9z99999999999999999: :::":*:2:::B:J:R:Z:b:j:r:z:::::::::::::::::; ;;;";*;2;:;B;J;R;Z;b;j;r;z;;;;;;;;;;;;;;;;;< <<<"<*<2<: >>>">*>2>:>B>J>R>Z>b>j>r>z>>>>>>>>>>>>>>>>>? ???"?*?2?:?B?J?R?Z?b?j?r?z?????????????????@0 000"0*020:0B0J0R0Z0b0j0r0z000000000000000001 111"1*121:1B1J1R1Z1b1j1r1z111111111111111112 222"2*222:2B2J2R2Z2b2j2r2z2222222222222222244445R6666 79u==== >+>n>>>>>>?+?M?j??????PD20=0~000001 11,1G1e1x11111122!2368-5G5m5555555>6:J:y::???p _333N477 8N8;;@?~?(2 393}347L7{77h;;;><{???(033;7Z77778;;;$111>2555"6999":>=>,1 2;2\22236J6y67T;j;;;;;4D4f4l444444445&5,5N5T5v5|555555566F6L6~66666666&7,7V7\7~777777778$8F8L8v8|8888888&9,9V9\9~9999999:6:<:f:l:::::::; ;.;4;V;\;;;;;;;;<<$=D=n=t=======>>6><>^>d>>>>>>>? ?.?4?V?\?v?|???????00>0D0^0d0000000001$1F1L1n1t111111122>2D2f2l2222222223363<3V3\3v3|33333334464<4V4\4v4|4444444445$5F5L5v5|55555556 6&6,6F6L6f6l66666H000 00000 0$0(0,0004080<0@0D0H0L0P0T0`0p0t0|000000000000001$1@1D11282<2@2d2222223 33$303<3H3T3`3l3x333333333334444 4(40484@4H4P4444444444555 55555 5$5(5,5054585<5@5D5H5L5P5T5X5\5`5d5h5l5p5t5x5|555555555555555555555555555555555666 66666 6$6(6,6064686<6@6D6H6L6P6T6X6\6`6d6h6l6p6t6x6|666666666666666666666666666666666777 77777 7$7(7,7074787<7@7D7H7L7P7T7X7\7`7d7h7l7p7t7x7|777777777777777777777777777777777888 88888 8$8(8,8084888<8@8D8H8L8P8T8X8\8`8d8h8l8p8t8x8|888888888888888888888888888888888999 99999 9$9(9,9094989<9@9D9H9L9P9T9X9\9`9d9h9l9p9t9x9|999999999999999999999999999999999::: ::::: :$:(:,:0:4:8:<:@:D:H:L:P:T:X:\:`:d:h:l:p:t:x:|:::::::::::::::::::::::::::::::::;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;t;x;|;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<<< <<<<< <$<(<,<0<4<8<<<@>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??? ????? ?$?(?,?0?4?8?>>> >(>0>8>@>H>P>X>`>h>p>x>>>>>>>>>>>>>>>>>???? ?(?0?8?@?H?P?X?`?h?p?x????????????????0d00000 0(0,04080@0D0L0P0X0\0d0h0p0t0|00000000000000000000111D1@2l2p(1@2D2H2L2P2T2X2\2`2d233333<<|??????800(0H0T0t000000001101<1X1d111`3338@0L0T0`0h0t0|000000000001 1$181<1P1T1h1l11111111111111@2D2H2L2P2T2X2\2`2d2h2l2p2t2x2|222222222222222222222222222222223 33333 3$3034383<3@3D3H3L3P3T3X3\3h3l3p3t3|333333333333333333333333444 44444 4$4(4,4044484<4@4D4H4L4P4T4X4\4`4d4h4l4p4t4x4|444444444555(545@5L5X5d5p5|555555555556 66$606<6H6T6`6l6x66666666666677 7,787D7P7\7h7t777777777777888(848@8L8X8d8p8|888888888889 99$909<9H9T9`9l9x999999999999D:L:T:\:d:l:t:|:::::::::::::::::; ;;;;<< <<<< <$<,<0<4<8<@L>T>\>d>l>t>|>>>>>>>>>>>>>>>>>? ???$?,?4?>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??? ????? ?$?(?,?0?4?8?>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??? ????? ?$?(?,?0?4?8?>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??? ????? ?$?(?,?0?4?8?>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??? ????? ?$?(?,?0?4?8?>> >(>,>8>@>D>P>X>\>h>p>t>>>>>>>>>>>>>>>>>?????(?0?4?@?H?L?X?`?d?p?x?|???????????????? 00 00 0$00080<0H0P0T0`0h0l0x000000000000000000111 1(1,181@1D1P1X1\1h1p1t1111111111111111122222(20242@2H2L2X2`2d2p2x2|222222222222222233 33 3$30383<3H3P3T3`3h3l3x333333333333333333444 4(4,484@4D4P4X4\4h4p4t4444444444444444455555(50545@5H5L5X5`5d5p5x5|555555555555555566 66 6$60686<6H6P6T6`6h6l6x666666666666666666777 7(7,787@7D7P7X7\7h7p7t7777777777777777788888(80848@8H8L8X8`8d8p8x8|888888888888888899 99 9$90989<9H9P9T9`9h9l9x999999999999999999::: :(:,:8:@:D:P:X:\:h:p:t:::::::::::::::::;;;;;(;0;4;@;H;L;X;`;d;p;x;|;;;;;;;;;;;;;;;;<< << <$<0<8<<>>>>(>0>4>@>H>L>X>`>d>p>x>|>>>>>>>>>>>>>>>>?? ?? ?$?0?8?> >> >$>0>8><>H>P>T>`>h>l>x>>>>>>>>>>>>>>>>>>??? ?(?,?8?@?D?P?X?\?h?p?t?????????????????00000(00040@0H0L0X0`0d0p0x0|000000000000000011 11 1$10181<1H1P1T1`1h1l1x111111111111111111222 2(2,282@2D2P2X2\2h2p2t2222222222222222233333(30343@3H3L3X3`3d3p3x3|333333333333333344 44 4$40484<4H4P4T4`4h4l4x444444444444444444555 5(5,585@5D5P5X5\5h5p5t5555555555555555566666(60646@6H6L6X6`6d6p6x6|666666666666666677 77 7$70787<7H7P7T7`7h7l7x777777777777777777888 8(8,888@8D8P8X8\8h8p8t8888888888888888899999(90949@9H9L9X9`9d9p9x9|9999999999999999:: :: :$:0:8:<:H:P:T:`:h:l:x::::::::::::::::::;;; ;(;,;8;@;D;P;X;\;h;p;t;;;;;;;;;;;;;;;;;<<<<<(<0<4<@>> >(>,>8>@>D>P>X>\>h>p>t>>>>>>>>>>>>>>>>>?????(?0?4?@?H?L?X?`?d?p?x?|???????????????? 00 00 0$00080<0H0P0T0`0h0l0x000000000000000000111 1(1,181@1D1P1X1\1h1p1t1111111111111111122222(20242@2H2L2X2`2d2p2x2|222222222222222233 33 3$30383<3H3P3T3`3h3l3x333333333333333333444 4(4,484@4D4P4X4\4h4p4t4444444444444444455555(50545@5H5L5X5`5d5p5x5|555555555555555566 66 6$60686<6H6P6T6`6h6l6x666666666666666666777 7(7,787@7D7P7X7\7h7p7t7777777777777777788888(80848@8H8L8X8`8d8p8x8|888888888888888899 99 9$90989<9H9P9T9`9h9l9x999999999999999999::: :(:,:8:@:D:P:X:\:h:p:t:::::::::::::::::;;;;;(;0;4;@;H;L;X;`;d;p;x;|;;;;;;;;;;;;;;;;<< << <$<0<8<<>>>>(>0>4>@>H>L>X>`>d>p>x>|>>>>>>>>>>>>>>>>?? ?? ?$?0?8?> >> >$>0>8><>H>P>T>`>h>l>x>>>>>>>>>>>>>>>>>>??? ?(?,?8?@?D?P?X?\?h?p?t?????????????????000000(00040@0H0L0X0`0d0p0x0|000000000000000011 11 1$10181<1H1P1T1`1h1l1x111111111111111111222 2(2,282@2D2P2X2\2h2p2t2222222222222222233333(30343@3H3L3X3`3d3p3x3|333333333333333344 44 4$40484<4H4P4T4`4h4l4x444444444444444444555 5(5,585@5D5P5X5\5h5p5t5555555555555555566666(60646@6H6L6X6`6d6p6x6|666666666666666677 77 7$70787<7H7P7T7`7h7l7x777777777777777777888 8(8,888@8D8P8X8\8h8p8t8888888888888888899999(90949@9H9L9X9`9d9p9x9|9999999999999999:: :: :$:0:8:<:H:P:T:`:h:l:x::::::::::::::::::;;; ;(;,;8;@;D;P;X;\;h;p;t;;;;;;;;;;;;;;;;;<<<<<(<0<4<@>> >(>,>8>@>D>P>X>\>h>p>t>>>>>>>>>>>>>>>>>?????(?0?4?@?H?L?X?`?d?p?x?|????????????????@ 00 00 0$00080<0H0P0T0`0h0l0x000000000000000000111 1(1,181@1D1P1X1\1h1p1t1111111111111111122222(20242@2H2L2X2`2d2p2x2|222222222222222233 33 3$30383<3H3P3T3`3h3l3x333333333333333333444 4(4,484@4D4P4X4\4h4p4t4444444444444444455555(50545@5H5L5X5`5d5p5x5|555555555555555566 66 6$60686<6H6P6T6`6h6l6x666666666666666666777 7(7,787@7D7P7X7\7h7p7t7777777777777777788888(80848@8H8L8X8`8d8p8x8|888888888888888899 99 9$90989<9H9P9T9`9h9l9x999999999999999999::: :(:,:8:@:D:P:X:\:h:p:t:::::::::::::::::;;;;;(;0;4;@;H;L;X;`;d;p;x;|;;;;;;;;;;;;;;;;<< << <$<0<8<<>>>>(>0>4>@>H>L>X>`>d>p>x>|>>>>>>>>>>>>>>>>?? ?? ?$?0?8?> >> >$>0>8><>H>P>T>`>h>l>x>>>>>>>>>>>>>>>>>>??? ?(?,?8?@?D?P?X?\?h?p?t?????????????????`00000(00040@0H0L0X0`0d0p0x0|000000000000000011 11 1$10181<1H1P1T1`1h1l1x111111111111111111222 2(2,282@2D2P2X2\2h2p2t2222222222222222233333(30343@3H3L3X3`3d3p3x3|333333333333333344 44 4$40484<4H4P4T4`4h4l4x444444444444444444555 5(5,585@5D5P5X5\5h5p5t5555555555555555566666(60646@6H6L6X6`6d6p6x6|666666666666666677 77 7$70787<7H7P7T7`7h7l7x777777777777777777888 8(8,888@8D8P8X8\8h8p8t8888888888888888899999(90949@9H9L9X9`9d9p9x9|9999999999999999:: :: :$:0:8:<:H:P:T:`:h:l:x::::::::::::::::::;;; ;(;,;8;@;D;P;X;\;h;p;t;;;;;;;;;;;;;;;;;<<<<<(<0<4<@>> >(>,>8>@>D>P>X>\>h>p>t>>>>>>>>>>>>>>>>>?????(?0?4?@?H?L?X?`?d?p?x?|????????????????p 00 00 0$00080<0H0P0T0`0h0l0x000000000000000000111 1(1,181@1D1P1X1\1h1p1t1111111111111111122222(20242@2H2L2X2`2d2p2x2|222222222222222233 33 3$30383<3H3P3T3`3h3l3x333333333333333333444 4(4,484@4D4P4X4\4h4p4t4444444444444444455555(50545@5H5L5X5`5d5p5x5|555555555555555566 66 6$60686<6H6P6T6`6h6l6x666666666666666666777 7(7,787@7D7P7X7\7h7p7t7777777777777777788888(80848@8H8L8X8`8d8p8x8|888888888888888899 99 9$90989<9H9P9T9`9h9l9x999999999999999999::: :(:,:8:@:D:P:X:\:h:p:t:::::::::::::::::;;;;;(;0;4;@;H;L;X;`;d;p;x;|;;;;;;;;;;;;;;;;<< << <$<0<8<<>>>>(>0>4>@>H>L>X>`>d>p>x>|>>>>>>>>>>>>>>>>?? ?? ?$?0?8?> >> >$>0>8><>H>P>T>`>h>l>x>>>>>>>>>>>>>>>>>>??? ?(?,?8?@?D?P?X?\?h?p?t?????????????????00000(00040@0H0L0X0`0d0p0x0|000000000000000011 11 1$10181<1H1P1T1`1h1l1x111111111111111111222 2(2,282@2D2P2X2\2h2p2t2222222222222222233333(30343@3H3L3X3`3d3p3x3|333333333333333344 44 4$40484<4H4P4T4`4h4l4x444444444444444444555 5(5,585@5D5P5X5\5h5p5t5555555555555555566666(60646@6H6L6X6`6d6p6x6|666666666666666677 77 7$70787<7H7P7T7`7h7l7x777777777777777777888 8(8,888@8D8P8X8\8h8p8t8888888888888888899999(90949@9H9L9X9`9d9p9x9|9999999999999999:: :: :$:0:8:<:H:P:T:`:h:l:x::::::::::::::::::;;; ;(;,;8;@;D;P;X;\;h;p;t;;;;;;;;;;;;;;;;;<<<<<(<0<4<@>> >(>,>8>@>D>P>X>\>h>p>t>>>>>>>>>>>>>>>>>?????(?0?4?@?H?L?X?`?d?p?x?|???????????????? 00 00 0$00080<0H0P0T0`0h0l0x000000000000000000111 1(1,181@1D1P1X1\1h1p1t1111111111111111122222(20242@2H2L2X2`2d2p2x2|222222222222222233 33 3$30383<3H3P3T3`3h3l3x333333333333333333444 4(4,484@4D4P4X4\4h4p4t4444444444444444455555(50545@5H5L5X5`5d5p5x5|555555555555555566 66 6$60686<6H6P6T6`6h6l6x666666666666666666777 7(7,787@7D7P7X7\7h7p7t7777777777777777788888(80848@8H8L8X8`8d8p8x8|888888888888888899 99 9$90989<9H9P9T9`9h9l9x999999999999999999::: :(:,:8:@:D:P:X:\:h:p:t:::::::::::::::::;;;;;(;0;4;@;H;L;X;`;d;p;x;|;;;;;;;;;;;;;;;;<< << <$<0<8<<>>>>(>0>4>@>H>L>X>`>d>p>x>|>>>>>>>>>>>>>>>>?? ?? ?$?0?8?> >> >$>0>8><>H>P>T>`>h>l>x>>>>>>>>>>>>>>>>>>??? ?(?,?8?@?D?P?X?\?h?p?t?????????????????$00000(00040@0H0L0X0`0d0p0x0|000000000000000011 11 1$10181<1H1P1T1`1h1l1x111111111111111111222 2(2,282@2D2P2X2\2h2p2t2222222222222222233333(30343@3H3L3X3`3d3p3x3|333333333333333344 44 4$40484<4H4P4T4`4h4l4x444444444444444444555 5(5,585@5D5P5X5\5h5p5t5555555555555555566666(60646@6H6L6X6`6d6p6x6|666666666666666677 77 7$70787<7H7P7T7`7h7l7x777777777777777777888 8(8,888@8D8P8X8\8h8p8t8888888888888888899999(90949@9H9L9X9`9d9p9x9|9999999999999999:: :: :$:0:8:<:H:P:T:`:h:l:x::::::::::::::::::;;; ;(;,;8;@;D;P;X;\;h;p;t;;;;;;;;;;;;;;;;;<<<<<(<0<4<@>>>>>>>>>>>>>>>>>>>>>>>??? ????? ?$?(?,?0?4?8?>0>D>X>l>>>>>> ??8?H?\?l????????X080`0666p;t;x;|;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 55555555555(444444445 555$5,545P11555 55555 5$5(5,5054555555555555555555555666 66666 6$6(6,6064686<6@6D6H6L6P6T6X6\6`6d6h6l6p6t6x6|666666666666666666666666666666666777 77777 7$7(7,7074787<7@7D7H7L7P7T7X7\7`7d7h7l7p7`9h9p9x99999;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;@4<8<<<@>>>>>p33333333333333333333333333333333444 44444 4$4(4,4044484<4@4D4H4L4P4T4X4\4`4d4h4l4p4t4x4|444444444444444444444444444444444555 55555 5$5(5,5054585<5@5D5H5L5P5T5X5\5`5d5h5l5p5t5x5|55D?H?L?P?T?X?\?8888 8$8(8,8084888<8@8D8H8L8P8T8X8\8`8d8h8l8p8t8x8|888888888888888888888888888888888999 999????????@0000 0(00080@0H0P0X0`0h0p0x0000000000000444445588888999 994>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??? ????? ?$?(?,?0?4?8?D>L>T>\>d>0 9999999999:` `>d>h>l>p>t>x>|>>>>>p000000000000x6|666666666666666666666666666666666777 77777 7$7(7,7074787<7@7D7H7L7P7T7X7\7`7d7h7l7p7t7x7|777777777777777777777777777777777888 88888 8$8(8,8084888<8@8D8H8L8P8T8X8\8`8d8h8l8p8t8x8|88888888888888:::::::::::::::::::::::::::::::;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;;;;;;;;;;;;;;;;;<<< <<<<< <$<(<,<0<4<8<<<@>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??? ????? ?$?(?,?0?4?8?>??????????8(0,0004080<0@0D0H0L0P0T0X0\0`0d0h0l0p0t0x0|000000000000000000000000000000000111 11111 1$1(1,1014181<1@1D1H1L1P1T1X1\1`1d1h1l1p1t1x1|111111111111111111111111111111111222 22h2l2p2t2x2|222222222222222222222222222222222333 33333 3$3(3,3034383<3@3D3H3L3P3T3X3\3`3d3h3l3p3t3x3|333333333333333333333333333333333444 44444 4$4(4,4044484<4@4D4H4L4P4T4X4\4`4d4h4l4p4t4x4|444444444444444444444444444444444555 55555 5$5(5,5054585<5@5D5H5L5P5T5X5\5`5d5h5l5p5t5x5|555555555555555555555555555555555666 66666 6$6(6,6064686<6@6D6H6L6P6T6X6\6`6d6h6l6p6t6x6|6666666666666666666 7$7(7,7074787<7@7D7H7L7P7T7X7\7`7d7h7l7p7t7x7|777777777777@8D8H8L8P8T8X8\8`8d8h8l8p8t8x8|888888888888888888888888888888888999 99999 9$9(9,9094989<9@9D9H9L9P9T9X9\9`9d9h9l9p9t9x9|999999999999999999999999999999999::: ::::: :$:(:,:0:4:8:<:@:D:H:L:P:T:X:\:`:d:h:l:p:t:x:|:::::::::::::::::::::::::::::::::;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;`;h;p;x;;;;;;;;;;;;;;;;;<<<< <(<0<8<@>>> >(>0>8>@>H>P>X>`>h>p>x>>>>>>>>>8?>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>??????????????????????????000 00000 0$0(0,0004080<0@0D0H0L0P0T0X0\0`0d0h0l0p0t0x0|0000000000000000000000000000011111111111111111111222 22222 2$255555555666 66666 6$6(6,6064686<6@6D6H6L6P6T6X6\6`6d6h6l6p6t6x6|666666666666666666666666666666666777 77777 7$7(7,7074787<7@7D7H7L7P7T7X7\7`7d7h7l7p7t7x7|77777777777888 88888 8P8T8X8\8`8d8888888888888888888888888999 9999999999999999999999999999999::: ::::: :$:(:,:0:4:8:<:@:D:H:L:P:T:X:\:`:d:h:l:p:t:x:|:::::::::::::::::::::::::::::::::;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;t;x;|;;;;;;;;;;;;;;;;;;;;;;;<< <<<<< <$<(<,<0<4<8<<<@>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??? ????? ?$?(?,?0?4?8?>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>? ??? ?0?4?8?H?L?X?\?`??????????????????????????????? 000 00000 0$0(0,0004080<0@0D0H0L0P0T0X0\0`0d0h0l0p0t0x0|000000000000000000000000000001 11111 1$1(1,1014181<1@1D1H1L1P1T1X1\1`1d1h1l1p1t1x1|111111111111111111111111111111111222 22222 2$2(2,2024282<2@2D2H2L2P2T2X2\2`2d2h2l2222222222222222222222222222222333 33333 3$3(3,3034383<3@3D3H3L3P3T3X3\3`3d3h3l3p3t3x3|3333333333333333333333333333333334 44444 4$4(4,4044484<4@4D4H4L4P4T4X4\4`4d4h4l4p4t4x4|444444444444444444444444444444444555 55555 5$5(5,5054585<5@5D5H5L5P5T5X5\5`5d5h5l5555555555555555555555555555555666 66666 6$6(6,6064686<6@6D6H6L6P6T6X6\6`6d6h6l6p6t6x6|666666666666666666666666666667 77777 7$7(7,7074787<7@7D7H7L7P7T7X7\7`7d7h7l7p7t7x7|777777777777777777777777777777777888 88888 8$8(8,8084888<8@8D8H8L8P8T8X8\8`8d8h8l8888888888888888888888888888888999 99999 9$9(9,9094989<9@9D9H9L9P9T9X9\9`9d9h9l9p9t9x9|9999999999999999999999999999999: ::::: :$:(:,:0:4:8:<:@:D:H:L:P:T:X:\:`:d:h:l:p:t:x:|:::::::::::::::::::::::::::::::::;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;t;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<<< <<<<< <$<(<,<0<4<8<<<@>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??? ????? ?$?(?,?0?4?8?(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??? ????? ?$?(?,?0?4?8?&Z&n&&&&&&&&"&>&Z&t&&&&&&&&$&<&\&j&x&&&&&&& &&4&L&Z&x&&&&&&&&8&N&h&&&&&&' 'D'^'|''''''' '$'0'R'r'''''''2'B'Z't''''''"'B'b'|''',&<&N&Z&l&~&&&&&&&&&&*&@&P&^&v&&&&&&&&&"&@&^&|&&&&&&&&,&:&T&b&t&&&&&&&&& &4&H&^&r&&&&&&&&$&4&B&Z&j&|&&&&&&&&(&<&\&r&&&&&&&&& &:&X&l&~&&&&&&&&"&0&H&V&f&&&&&&&&& &,&<&N&d&r&&&&&&&&&&0&L&\&p&&&&&&&&&&&&6&D&T&f&~&&&&&&&&*&<&T&d&~&&&&&&& & &4&<&F&V&h&|&&&&&&&&&&&*&:&L&\&v&&&&&&&& &&6&R&b&l&&&&&&&&&&$&8&N&`&l&&&&&&&&&&,&>&Z&n&&&&&&&&"&>&Z&t&&&&&&&&$&<&\&j&x&&&&&&& &&4&L&Z&x&&&&&&&&8&N&h&&&&&&' 'D'^'|''''''' '$'0'R'r'''''''2'B'Z't''''''"'B'b'|'''AllocConsole>CallNamedPipeABCancelIoOClearCommBreakPClearCommErrorRCloseHandle`CompareFileTimedCompareStringWeConnectNamedPipeCreateFileACreateFileWCreateNamedPipeACreatePipeCreateProcessWCreateRemoteThreadCreateTapePartitionCreateThreadDebugBreakDeleteCriticalSectionDeviceIoControlDisconnectNamedPipeDuplicateHandleEnterCriticalSectionEraseTapeEscapeCommFunctionExitProcessExitThreadExpandEnvironmentStringsW$FillConsoleOutputAttribute%FillConsoleOutputCharacterA<FindFirstVolumeMountPointW=FindFirstVolumeWGFindNextVolumeMountPointWHFindNextVolumeWNFindVolumeCloseOFindVolumeMountPointCloseTFlushConsoleInputBufferUFlushFileBuffersXFlushViewOfFile]FreeConsole_FreeEnvironmentStringsW`FreeLibraryoGetBinaryTypeWpGetCPInfoGetCommModemStatusGetCommStateGetCommandLineWGetComputerNameAGetComputerNameWGetConsoleCPGetConsoleModeGetConsoleScreenBufferInfoGetConsoleWindowGetCurrentProcessGetCurrentProcessIdGetCurrentThreadGetCurrentThreadIdGetEnvironmentStringsWGetEnvironmentVariableAGetEnvironmentVariableWGetExitCodeProcessGetExitCodeThreadGetFileAttributesAGetFileSizeGetFileSizeExGetFileTypeGetHandleInformationGetLastErrorGetLocaleInfoAGetLocaleInfoWGetLogicalDriveStringsAGetLogicalDriveStringsWGetLogicalDrives GetMailslotInfoGetModuleFileNameAGetModuleFileNameWGetModuleHandleAGetModuleHandleW1GetNumberOfConsoleInputEvents4GetOverlappedResult6GetPriorityClassAGetProcAddressNGetProcessTimesPGetProcessWorkingSetSize^GetStartupInfoA_GetStartupInfoW`GetStdHandlelGetSystemDirectoryWoGetSystemInfouGetSystemTimeAsFileTimexGetSystemWindowsDirectoryW{GetTapeParameters|GetTapePosition}GetTapeStatusGetThreadContextGetThreadPriorityGetTickCountGetTimeZoneInformationGetVersionExAGetVolumeNameForVolumeMountPointWGlobalAllocGlobalLockGlobalMemoryStatusExGlobalSizeGlobalUnlockInitializeCriticalSectionIsBadStringPtrAIsDebuggerPresentIsProcessorFeaturePresent)LCMapStringW.LeaveCriticalSection2LoadLibraryExA3LoadLibraryExW4LoadLibraryW=LocalFreeLMapViewOfFileMMapViewOfFileEx\MultiByteToWideCharuOpenProcessyOpenThread|OutputDebugStringA~PeekConsoleInputAPeekConsoleInputWPeekNamedPipePrepareTapePurgeCommQueryDosDeviceWQueryInformationJobObjectQueryPerformanceCounterQueryPerformanceFrequencyQueueUserAPCReadConsoleInputAReadConsoleInputWReadConsoleOutputWReadFileReadProcessMemoryReleaseMutexReleaseSemaphoreResetEventResumeThreadRtlUnwindScrollConsoleScreenBufferASetCommBreakSetCommMaskSetCommStateSetCommTimeoutsSetConsoleCtrlHandlerSetConsoleCursorPosition SetConsoleModeSetConsoleTextAttributeSetConsoleTitleW&SetEnvironmentVariableA'SetEnvironmentVariableW(SetErrorMode)SetEvent6SetFilePointer@SetHandleInformationCSetLastErrorLSetNamedPipeHandleStateMSetPriorityClassTSetProcessWorkingSetSizeWSetStdHandle[SetSystemTime]SetTapeParameters^SetTapePosition`SetThreadAffinityMaskaSetThreadContextiSetThreadPrioritySleepSleepExSuspendThreadSwitchToThreadTerminateProcessTerminateThreadTlsAllocTlsFreeTlsGetValueTlsSetValueTransmitCommCharUnmapViewOfFileVirtualAllocVirtualFreeVirtualProtectVirtualProtectExVirtualQueryVirtualQueryExWaitCommEventWaitForMultipleObjectsWaitForSingleObjectWaitNamedPipeWWideCharToMultiByteWriteConsoleOutputWWriteConsoleWWriteFileWriteProcessMemoryWriteTapemark4NtAccessCheck=NtAdjustPrivilegesToken@NtAllocateLocallyUniqueIdINtCancelTimerKNtClosePNtCreateDirectoryObjectQNtCreateEventSNtCreateFileVNtCreateKeyWNtCreateMailslotFileXNtCreateMutant^NtCreateSection_NtCreateSemaphorebNtCreateTimercNtCreateTokennNtDuplicateTokentNtFlushBuffersFile{NtFsControlFileNtLoadKeyNtLockVirtualMemoryNtMapViewOfSectionNtNotifyChangeDirectoryFileNtOpenDirectoryObjectNtOpenEventNtOpenFileNtOpenKeyNtOpenMutantNtOpenProcessTokenNtOpenSectionNtOpenSemaphoreNtOpenSymbolicLinkObjectNtOpenThreadTokenNtPrivilegeCheckNtQueryAttributesFileNtQueryDirectoryFileNtQueryDirectoryObjectNtQueryEaFileNtQueryEventNtQueryFullAttributesFileNtQueryInformationFileNtQueryInformationProcessNtQueryInformationThreadNtQueryInformationTokenNtQueryObjectNtQuerySecurityObjectNtQuerySymbolicLinkObjectNtQuerySystemInformationNtQuerySystemTimeNtQueryTimerNtQueryTimerResolutionNtQueryValueKeyNtQueryVirtualMemoryNtQueryVolumeInformationFileNtReadFileNtSetEaFileNtSetEventNtSetInformationFileNtSetInformationThreadNtSetInformationTokenNtSetSecurityObjectNtSetTimerNtSetTimerResolution NtSetValueKeyNtUnlockVirtualMemoryNtUnmapViewOfSection NtWriteFile&RtlAbsoluteToSelfRelativeSD'RtlAcquirePebLock*RtlAddAccessAllowedAce+RtlAddAccessAllowedAceEx.RtlAddAccessDeniedAceEx0RtlAddAce<RtlAllocateHeapBRtlAppendUnicodeStringToStringCRtlAppendUnicodeToStringPRtlCheckRegistryKeyWRtlCompareUnicodeString\RtlConvertSidToUnicodeString]RtlConvertToAutoInheritSecurityObjecteRtlCopySidhRtlCopyUnicodeStringiRtlCreateAclpRtlCreateQueryDebugBufferrRtlCreateSecurityDescriptorwRtlCreateUnicodeStringFromAsciizRtlDeleteSecurityObjectRtlDestroyQueryDebugBufferRtlDowncaseUnicodeStringRtlEnterCriticalSectionRtlEqualPrefixSidRtlEqualSidRtlEqualUnicodeStringRtlFirstFreeAceRtlFreeHeapRtlFreeUnicodeStringRtlGetAceRtlGetControlSecurityDescriptorRtlGetDaclSecurityDescriptorRtlGetGroupSecurityDescriptorRtlGetOwnerSecurityDescriptorRtlIdentifierAuthoritySidRtlInitUnicodeStringRtlInitializeSidRtlLeaveCriticalSectionRtlLengthSecurityDescriptor RtlLengthSidRtlNtStatusToDosError$RtlPrefixUnicodeString*RtlQueryProcessDebugInformation-RtlQueryRegistryValues7RtlReleasePebLockDRtlSetControlSecurityDescriptorFRtlSetCurrentDirectory_UHRtlSetDaclSecurityDescriptorJRtlSetGroupSecurityDescriptorMRtlSetOwnerSecurityDescriptor]RtlSubAuthorityCountSid^RtlSubAuthoritySid}RtlUpcaseUnicodeChar~RtlUpcaseUnicodeString&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&KERNEL32.dll&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ntdll.dll5 Ep Z0 u .textT.data.bss` ` .text`'!.data.bss.rdata?msg1noloadgotitTȏHt'6BN\0jXwp ` P.textAR.data.bssY6`F 5  M `x xp P "x  ` ' =B"`u@.rdata@  _daemon`  #P  _openpty  .Q_forkptyp _vwarn _vwarnx` _warn _warnx _verr _verrx _err0 _errx` ~  _logwtmp@ _login _logout g.text  h.data.bss.rdata .text&.data.bss  __ZdlPv __ZdaPv   @ __Znwj` __Znaj  1 F .text .data .bss.rdata[ e{  } P  >p Sg0   ! ! 0" "@M# _cfree@4$ _'% @%  & & ' P' ' ' ) ) *@) .text'.data .bss.rdata J``^* x+ `+ + + ,  0. Q`. g/ |0/ c /   1 / @ i 4    8  8 .text*".data .bss.rdata$.ctorsT  08  P8 3 8 Z h =  =  g  @  pB  B " C : c @  pD .text08d m.data  .bss.rdata   D .textD .data@.bss G .textG~.data@.bss.rdata  0H  pH ? n L ~ L   & M  `M " , ___mainP 6 P E i T x pT __exitT  T  PU  pU  V  X @Y #C Z TpPZ Z  [ < m`@e 0f Ig Z.text0H?".data@.bss .rdata x.textpj.data@.bss pj sj yj j wk #cHc hk k FD HD D D .textpj.data@.bss .rdata@0-PE P=s= UU U+U P,U$KU e?O? @?m@? _dirfdH ( @_opendir@I 8[J qJ |_readdirJ ½K _telldirK L _seekdirL PM `M N _mkdirO *h_rmdirS K.textPE.dataX.bss .rdatal W _dlopen`W H _dlsym` _dlclose@b _dlerrorb .text W .dataX.bss .rdata@s4b Kk0c pc c d Pd d $uh @h pi j j j vLl al m @r ,s As N0t e@t _dlforkt xt u .textbU.dataX.bss }.rdata.ctorsX u .` @Tew{ P|  P~ ~ D~ a @ P  *=p@`   Jp n0  @ >  p `+ V Ц     H  s ` 0  0  .!P O!! !.text u76.dataX.bss.rdata! ! "` " /"` D" \" y" "  "P " " " # @#`S#  q#_getenv0 #$#P #p # $0 #$S$ b$ z$` $$$ $ %@@% \%@h%@% %% %_setenvP &0&p I& T&&(&` & & & & &'_putenv 7' `' .text.&.data`.bss.rdata .ctors\.dtors'@'' ''@( %( ^(P (p (( (@ ( )+)X) p) |)`) _error ) )).text[Y.data@.bss.rdata *@*P W*p l*T*p **p *!+@N+ i+ +` +0 + +   ,K,@],@k, ,,0 , ,- I-`- - - /.P @.p X.$g.. ._sigset ..(/ 3/  =/)_sighold0 a/;/@ /p //  /,0` >0 U0 h0 00p 0 61,1(1`?2g20  .textPD1X.data@.bss.rdata 2 _execl  _execle  _execlp`  _execv  _execve  _execvp  _execvpe _fexecve 2@223P ,3.text 1.data@.bss.rdata`W3 m3w3 33 3 3 -4 >4`j44" 4 " .textn.data@.bss.rdataG0.ctors`.dtors4A]4A 55`Aj<5`A _fcntl640" T5!w5@55__fcntl0' .text0"9.data@.bss.rdata6( 6@"6@) 36) @6) J6* X6`* b6* o60+ ~6+ 6+ 6, 6`, 6- 60- 6- 6- 6. 6 7.text(.data@.bssA7J7 p7PG 7PG 7B7B 8C8 m8`B8`B 8G8G 80G 90G 89[9 y99 99  : 0:  P:s: :G:G :@B:@B ;PBF;PB h;0B;0B ;pB;pB <B.<B W<B<B <G<G <B =B >=@Gb=@G = G= G =B=B >. A>Fd>F >`Gi>`G >. >. ? [?/ s??0 ?@1 ?p1 @1 ;@ z@ 2 @ @2 ApZA2 6A^A ApZA`!A` A2  B2 'B [B4 wB@B4 B5 B@)C8 OChCpCBCB  D9 4DZnD D: D`D,E ; KE E; EE< FAFp< iF@F< FGP= ,G iG= G`G0> G)H> GH|H? H H? H ,I? LI` I`@ I I@ J AJ@A kJ JA J` J B K PKB sK KC K LpC &L cLC LLPD LMD 1M` dME M M@G MNG :NmNH NN4_N4 OpJ +OhO L OOM O`#PpM>Pp TPP }PP PC PC PmQ RQ0Q wQQ Q`R QR QR R@S 4R@hR@V RV RW RSY (S0Z MSS\ S] ST` &T` [Ta yT Tb TTpj U@TUo U0p UU s  VJV0u VVu V>Wv VWv nWw Ww W y W` X z :X zXz X{ X{ X`YP} OY} Y} Y0~ Y~ "Z IZ ZZ [@G[ .text.YE.dataH.bss`.rdatabw[[[ [ \OO\ \ pZ\p\p \@!]@ 4] Z]P ]0 ]d] ] "^l^ ^ȫ^^_F_0 k_<_ _А _А .text b.dataH.bssd.rdata=`ȫ0`{\`{ `{ `{ `a 'a{aa{ a|a| b@_-b@_ Rbb bpc)bpc b@  c_SRc_ c^cccc c` c d0 /d"qd` d d@ dc!ec e `HSe ` e#ep e  f $f Bf dfP_ fP_ f`_ f`_ g 6g lg#gp g h Ah bh"h  h h"Fi zi@"i iP j ;j aj@ j@#j0 j j !kp Kk` xkЮ k k k` l!Slp_Clp_ lm 1m!Dm Um !m  mm m#*np Rn mnn0 nn  +o0 ho`o o !p _p ~p` p.text@gV..dataH.bssh.rdata@p(ap%q Jq9Lxq9 qpZq=q= q r >r`$r r r r  s=$s= 3s:ncs: s@ s`%s$t %t$Yt %t0 t0 .textY.dataH.bssh.rdata$t` tp u *u SuХOuХ u pZuY v 7vpZVvpxvp v@!v@ vЋvЋ w >w iw  w` w w@ x` Hx  ix` x/x!x y  By` ly*yPHyP z 6z lz  z  z-{*0{ P{@*{  {`.{  &|.g|  |.|P  |+$}  Q} /}` }-} ~@+L~+|~3~3 ~p7M ~p7 ~`" -# ^/@.  01 J`0@3 @3 ˀp3 p3 3 8-np6 6 `/8 @-^> > @ @ ,BA j,D ̓`,I #L S*N `U +`Pb |Pb b b .text`r.dataH.bssh.rdata%  7dkd c ʆ c `c 6c lc  dO d pZ h)h Dg!dg c 5pdT pd Opd n`7`6щ`f `f f Ff mf =ڊ@g <_h Ph h 0i Pi 8Pi [i |<i Ռ`j @<Bk @l pl ڍ<!l L;m ;@n ;^Pp 0q Ώ:`s I:0t Ð@: u 6v ^@;8x 9`z  7`} 93} _5p~ ̓`9 @ 48r `8 & 8d  9ϕ 7D n7@ Ӗ6 Ћ Ip dp  0 җ  6+@ J6.textc4.dataH.bssh.rdata0 0 0 pLޘpL   H r  @L$ԙ@L GG EpZ`pHpH P ՚P К P -@?``? ?> 9?.textl .dataH.bssh.rdata@=lЭVЭ ќ@pZ 3!V t  ` Ɲ00 /Х RC D מ  .F~ Cݟ` D8 dE ҠD  =E  E !`D.text .dataH.bssh.rdata?Va  G  # NG$ ˣ ,pZK00 ` ̤`  : Z@GG.text?.dataH.bssh.rdata@F hO h pZ;` e JæI   &  Aph0uph P ȧI @JU u@I Ǩ .text`[ n.dataH.bssh.rdataHp  0O>0 l x\ ȩ!   .` X ~ ` ȪK 0 [KTЫ   KW`K    .text{ b.dataH.bssh.rdataJ`ݬ`  pZ0$90 U@ u`LL٭0 0 .text@.dataH.bssh.rdata LP 5XC0QOr0Q x\UԮU T! T ! ? ^ zp @  گZ ; \~  Z 0 ( [a P p ı ݱ `[2QTcQ   ɲ[[)p Q x`\ ѳ\`  0\r! ! .textP{>.dataH.bssh.rdataL@"PoOԴPo x\0s?0s Z! {" P" " ֵ" # P# B dT h$ `% @fP( :@) Y) @. `. ķ. . P/ #/ K/ l00 høs!s o`2o a1 2 fg5 ?`h~7 `gϺ09 g$< ?< Z 5Gw 5  g< ݻ J c$K EiQO pf.text!g;~.dataH.bssh.rdata ]< H@] ͼ j߼PsLPs >x\\pw|pw ] pj̽_  kA` ak@w$@w Ӿss 6b ``kj̿b j! f < f .text@]V.dataH.bssh.rdata`isW@f ~Pf `f wLw *x\H{h{ {${ f f `g )g X n i @j ww I 4c 4 {l nu m9mf@w `n`y y  y .text@f^.dataH.bssh.rdatak %y PqfL @x\00 2y Tp{ v| ~ rP 9 st$ `` "` Pr`r0  r < .texty r.dataH.bssh.rdatanw[ O pZе4е R!u   `<` @ ctt  0 6u} @u uCЊ p .text=.dataH.bssh.rdata`sZP kVk &pZDp o 0  `vv? iv   lI-l \ w .textP$.dataH.bssh.rdatauO@ P O D x\c  xP / O a`zu P  z#@ EP rP!P Р|Р  (zS@yy `{ #{[ {q  {z (yg  z  .text@o$.dataH.bssh.rdata w `V`V 9`^` ~Z Z  Z Z  0VOaV pZpZpZ @Z!@Z  ;@q@  0 T tpVpV к ,@Y P 3 Z@P P   ` I P J w .textG*9.dataH.bssh.rdata{pp +0_R0_ tZZ __  &ZVWZ pZ0   -d @ @   ` ' R6  `F l [ .[ \0 z@ @3 ]p @  `  !r  `   P = h0  P  4p@ `    ĉ/  R } (p P n@e  hJ zމ ҉* Z   <P" d x& @+ @, D@, @ . ]P/ 5 kp6 6 (gw? ? 34w@`D o>G jPJ .textily.data`n.bssh.rdata   +O^ pZГГ !  %pL RL 0a0 `M @O|N &pQ GpV V 0W  @X /PY SY v[ \ c Ŗe '`^h `j `l n 1p Qr u@u x | ) f@ P  ` %` Np r `  p !Tp .textpLSQ.data.bssp.rdata`Up |O| ^8X s! `|$`| Н 1`h@   M m     3@t P D@ f .textН .data.bssp.rdata p Dp g  P @- [` ж    SJ z@^x ^xS ^йй ` @Xз |  5oл P  C  r      C  a         0  _    @ P A  b       1 @ [ ` !     !> [0 }`  5PHlP  @( P @T' Xpp   3c   M s`  Z ~@p    G   p  +q   @  @  .text}UZ.data.bssp.rdata$`  Op  v          6Oh x\       )  H@  u      @T@ )  M     0@i` p  =u@  .text`  x.data.bssp.rdata H *O o O pZ/O jP!P     " A $u    -  N @    .text4.data.bssp.rdatat   O! >! pZ]!~! !P!!P ! ! ""@\""` "@ "@ # *# .text  .data.bssp.rdataF# c#`#@ #$# $P 3$  Q$$`U-$`U $0U-$0U $!%0" 3%0" E%# [%(m%$ %' %' %`(  &B&+ a&- ~&- &`/ &`/ &/ &'(1'03 T'@'5 'p6 ' 8 ' 8 'p8 (: <(@; u(P< (`= ( _flockN )2)_lockf0R S).texty:^.data.bssp.rdata t)$)@V _fnmatch\ )p.text@V.data.bssp)] )!)`] )`0*^ E*`*`_ {*_ *@*b **+B+Pe Y+_fork0p +_vforkPt +.text]yY.data.bss.rdata +t +t +t + u +Pv  ,0x %,@y 7,z B,Ё L, W, _fts_setЊ a, o,P ,` ,p .textto.data.bss.rdata_ftw .text.data.bss.rdata8, ,@ _place_ambigB_noarg`,½,, , --_EMSG$- 0-_getoptЗ <- I-0 .text |.data .bss.rdata[-` m-И ~-` - - -@ . %.P D.0 \. w.  _glob .а .text`;.data.bss.rdata.0 .text0K.data.bss.rdata. . .text.data.bss.ctorsd.@,.rdata. // -/ E/ `/ {/@ __ZL2gr@ /| /@ /  / 0K0ж e00 00 0 1` 1 1 01  <1 H1 R1 e1 o1 {1 1 1P 1p 1  12 &20 12V2  d2`20 2p 22@ 2`3 3 .text,.data.bss@ H.rdata,.ctorsh63l*J3  Y3 j3_sbrk 3D3`.text D.data.bss .rdata x3 4@ '4 P4 4 44 4 .text- S.data.bss .rdata4 5P .textw.data.bss 5 .text.data.bss ,5@ D5 V5p d5 5.text@.data.bss %_ioctl@ 555@.text@.data.bss .rdata_ftok .text.data.bss 6  6@ 16 @6 O60 `6 q6P 6@ 6 6` 6 6 6P 6  7` "7P .text4T.data.bss 77 E7 S7 b7 q7 7  70 7@ .text.data.bss 7P 7@ 7 80 8p 18 C8` W8 m8 88 8 8@ 89 +9 /9 J9 `9w9  9p __ZL3gmt9 9 90 9I: :$J#:@J_tzset0 4:TF: __ZL2tmJQ: _gmtime ^:  _offtimeP _ctime _ctime_r _mktime h:  _timegm  _timeoff@  s:`  :  .textPG(.data.bss  ?.rdata:_lsearch! _lfind" .text!.data.bss@K_free`" ::f_malloc" :@K:Q_realloc# ;49;p$ _calloc$ C;e;p% u;0& ;; _valloc& ;;' <5<@( B<_mallopt( j<<) <n<0* <Z_strdup* <0+ =G-=+ ;=.text`" .data.bss@K.rdata@7d=x=P, =- =08 .textP,H^.data.bssDK.rdata"== =P> => =P? =E =F _res`K>F > H >@H (>H 5>H B>J O>\>T h>T s>V >@X >pY >[ >[ >\ > ] >p] >] ? ^ .text= .data.bss`K.rdataH ?^ ?^ 6? ` K?` b?0a w?a ?Pc ?c ?pd ?d ?#@_yieldf P@g f@`g }@@g @h @ i !A@j 9Aj LA@k .text^%a.data.bss`M.rdata`cAwAm A@AA_mkstempPq _mkdtempq Aq Ar B@r _mktempr .textm .data.bss`M.rdataBr 'BTB@u oBw B`MBBw Cw 8Cx ZCy C Cz CD`| 0DgD~ D`D Dp D (E0 RE qE EP E E F@ ?F }FNF F F@F _mmap64   G+G_mmap _munmap@ \G_msync ~GaGP G@_mlockP G_munlock GH  HJH` kH@HФ HH@ IUI I`I  I7J \J J J Kp 0K@mK K K KDL hL@L L L  #MrMв M`M M .textrNDD.data.bss`Ml.rdataN .ctorsl.dtors+N@?NaN ~N N%N N O -O KO iO@ O@ O O _msgctl OP_msgget @PR_msgrcv bP _msgsnd P.text .data.bssN.rdata`@P PP Qd\Q 6Q PQ}Q Q Qp R @RNOR R R R R (S@ US0 SSp S@IT uTT T U %URU dU UU0 V@ V 8V`nV V V  V V!W GW  kW@W  W_mount0  W Xp  ,X_umount  VXxX  Xp  X   X`  X  X  X@ Y  *Y  VY  sY  Y0  .textTo.dataX .bssN .rdata .ctorspYX Y  Y    ZZ  @Z\VZ\kZ\Z  ZZZ  Z  Z   [p  ![8@[@  W[Ct[  [`  [@#  [$  [(  [)  \*  #\T\ \\@U\@ \ ]+  ],  $]p,  A]M]`]p-  ]`]U^p1  0^ 5  W^^ ^P<  ^_(_A  7_@a_ C  r__D  _@_`3``H  F`t``pK  `K  ``L  ``)aQ  ?a paV  aaa@W  a"b]  8b ibb  ybbbpj  b`_accept4k  c 5cm  Bcjcn  ~cc p  cncp  cP#d`q  5dq  DdPdPs  dddt  ddv  d@dw   ex  ey  Ree{  eЁ  ee  e   f:f  Jf@  Zff  fKf  f0  f g  .g  :gaggК  g  g  g`g@  gh  !h`ChOeh@  whp  hp  h  h  hi  i  .iP  Bi_htonlp  _ntohl  _htons  _ntohs  ji  .text G.data`.bss\.rdata`hiX-i  ii  jjHj`  ij'j  j\j  k\k  +k\9k\Lkzk  kkzlл  laAlP  Ul\fl\{lDlм  lmL3mp  Gm1.text > .data`.bss\,.rdatavmm  .text .data`@.bss\_nftw  .text w.data.bss\.rdata8m0  m  m  n  Rn@  n  n  n  np  n\o]o To` {o o  o`  oo0  p  *p  Fp  bpnp`  pp  _wcscoll  p p _strcollp   q@ ,q  _wcsxfrm  Aq _strxfrm  dq q  q  q0  qr  r  .text0 6|.data.bss\D.rdata@0(r  Tr7r7r  r@9)s  Ks:s  s@:s@  s: t  t9=t  Ht`7yt9t0  t  t  t  t8t   t8up  *u@8Ou  \u  ju  .text q/.data@.bss ].rdata@6xu  u  u`  __ZL2pr@]u  u  v  vDv]ivF;v  v   vP  v  v!  v0!  v"  v#  v#  w#   w$  _getpass$  w&  .text |.data@.bss ]`.rdata:.ctorst-wAwEnw'  w'  w0(  wp(  w0)  w)  ,x@,  Qx,  xx -  x -  x-  x`.  x00   y0  2y1  Qy3  }yIy6  y@I!z@9  GzhI[z<  z=  z>  z?  z@  ({H{N  {O  { P  {`P  |P  |Q  -|R  Y|R  |R  |0S  |S  |@V  6}pV  e}V  }E}F}\  ~ c  (~c  I~c  g~0d  ~@E_getcwdf  ~%H~h  _getwdh  ~h   ICm  f`J0r  J   GH  d  F  F  1G_0  `      Ձ    _chdir  H_fchdir  GNGp  I_symlink`      @  D`  n   F  `H`  @G  +н  HD|  E݄0  DH`  a@D  b_dirnamep  b  .text' a.data@.bssa.rdata;.ctorsxڅp  /V+  A  Wp  s  V  U#0  8UdSP  (bԇeV,0  BHVm  U  ψ`U  (@  =  g U`    Ӊ  TTKP  kT`  Š  Պ@  p      &  8@Tap  } T@  ŋ  ___tcf_0p    ST@  VS  $bό bS,  ?0  XP  o      0  .textp :.data@.bss b.rdataJ .ctors|.dtorsӍ P  P (@S@ yLL ҎpZQ Q "@  K  iZ@Yˏ   [60  TP$qP  M M 0  YM  q`[P  ̑[   [T  p \p  p  Ӓ  Zf0b  ؓ@Z0  'Y__pipeP  WY_pipe  xgY_pipe2  X.text@ +.data@.bss0b.rdataV_poll  _ppoll  .text :.data@.bss4bP!  Ԕa`"  !aSp#  {P'   `@_(  ^_Y+  |_/  Ֆ@` 3  b95  _mq_open`5  E@ah=  t a?  `Η@  ٗ`_mq_sendB   C   PC  C  )C  3_W0E  bE  l_J  L  L  .textP! +.data@.bss4b.rdata`\ĘM  ݘb b7pN  RO  .textM @.dataP.bss4b.rdata@bmPQ  }`Q  pQ  Q  Q  Q  ǙQ  ؙR   R  `R  pR  $R  7R  JR  _R  oR  S  @S  `S  ɚS  ߚS  S  S  S   S  S  &T  .textPQ .dataP.bss4b4T  >`MdXHce\cot}xlhp_random U  _srandomU  V  X  Û.textT V.data`.bss4b.rdata cd_p_countY  _nuls4bЛZ  _doemit`\  ۛ0]  _dupl]  _CHIN1`^   _  _cnames``  `a  _CHadd0b   `c  c  e  )m  _repeatm  _p_ere@p  _p_brex  _regcomp  .textY 6/.data_.bss4b .rdatapc30  _rerrs = .text0 J.data $.bss@b.rdatah_CHIN1  H@  _sslowЏ  W@  a  k  u@    _lslow0  `  @  _mslow  @  _regexecp  .text Sa|.data .bss@b.rdata8k _regfree  .text  .data .bss@b  Ü  n   :  T  g  zp    p  ՝      `  :`nr   n.text L p.data .bss@b.rdata`kp0  ޞ  P  o+oX  cop  `o.text0 2.data .bss@b.rdatan  ğsϟs۟ P  .text  .data @.bss@b.rdatapp  `  ,p  <`x`p  m      _ruserok0  .textp }.data !.bss@t!.rdataq  _scandir  sĠ`t.text 7.data$!.bssy.rdatas0"   v<ui"  v0#  ̡P#  ܡ`v%  %  2LvY v)  uƢ-  p-  `u$-  .text0"  z.data$!.bssy.rdatat@1-  L@.  e.  w/  yyˣ/  @|_acl328  *{_lacl329  K{_facl32`:  m@{{0<  ̤>  פz?  |W@H  dz0J  @zťL  ӥL   L  zP  'y_aclV  _faclV  _lacl0W  Q@yqW  _aclsortW  {@X  X  X  X  Y  PY  .text- l+.data$!.bssy.rdatavBŦ`Y  8Z  TZ  }0]  ^  *^  m`  @<:T gc  }Pd  ʩpd  /@f  B@pj  k  Ъ0l  0vq  ϫr  s  J@z  Ѓ  . o`ޭ  .text`Y E<6.data$!.bssy.rdata| -  E  ]p  u0      0      "  ?p  X  z  ѯ@      7D`  [     ߰  B  ]    @p  ȸԸ;]۲"(D4l@LXdp,|OqȹԹ.text .data$!.bssy.rdata  $.ctors@@T`  յе  s@`  ɶ p  A T`  ط0    0  \    ¸ @  `  ¹   *  m  p    (0  O  ڻ`.text` 0w.data$!.bssy.rdata  $@  \P  `  p    ,  cL Ľ pZ  $A ]`    Ǿ@    0P  i    ؿ`#  X  {P  >P  V7  `  =P  k@    J@I@     L  f   p  /  O  z  $  <Ɲi  @  D@    U0    (  L@  _pselect  @    #  V`            U0      @  3  i     p    6  hP      p  7  kP      .text@ <U.data$!.bssy.rdata `-` J j0%0 @  @      3  Y  _semctl   _semget  _semop"  .text@ b.data$!.bssy.rdata6 VyP%P  %  %  M%  a.text% _+.data$!.bssy.rdata@`)  0P*  ,+  +  *0,  q$!~/  @0  <2  T@4  05  P6  @9  .text`) o.data$!.bssy.rdata`/Ce  % 9  9  #`:  K`:  s:  :  ;  ;  0<  0<  3<  Qy__shmctl@?  @4y_shmdtB  '_shmget@E  Ъ_shmatpH  A`.text9 .data8!.bssy.rdatab4vN __sigfeN leave&P wP .textN |%l.data8!.bssyt  @_signalw  ,Npy  _`|  `_sleep|  _usleep@}  @~  7@  Dl0  ~  @   !a_killP  _raise  O  _killpg  ]  h  į`  _abort    "  /  ;  G  _pause  Q  _   _sigwaitЎ    `.textt .data8!.bssy.rdatai0  4E  Zfr̽  0       .LYXjkE  ^  z,    @  40  `@    &a  ~  @  и    E  m    п  п  0  `  E  `  u      0    LJ  f 0    Ip  o    .text0 v;/.data8!.bssy.rdata  `3      0  ,`  :  X  .text cM.data8!.bssy.rdata-,t    @  7`  Ev p    _cwait@  `  6n  _spawnveP ` _spawnvp _spawnv $ _spawnlp _spawnle _spawnl` . ` .text :3.data8!.bssy.rdata@.ctors.dtors y  0 Hp f     " " __ZL2ta@# .text n.data8!.bssy.rdata@ .ctors # #8!3$ _strfmon`% .text#A#.data8!.bssy.rdata D2 zP4 4 ` 5 @5 6 06 P6 p6  6 08 >8 K 9 ZP9 `< P< < 4? P@@ s@  A  .text2.data I Sw _ttyname@ b_ctermid @ @_getmode _setmode ,*O _P np  h   !@H R a# _statvfsp _fstatfs _statfs _setpgid _getpgid _setpgrp _getpgrp   _ptsnamep .`_mknod32 @`_mknod  _mkfifo  c  n=_seteuid@ p %_setuid  P  P  _setegid  . ! _setgidP! 8! DkP# _chroot# u_creat ' P' _vhangup`' ' `+  @_nice. _ffs0. 2@_updwtmp. B. L@!Ym / D!/ /  0  _getutid1 2  4  0@6 ;P6 F`6 Qe6 o@7 @8 8 8 9 yz4yFXf: t0; p; ; ; _popen; @_pclose@ *_openatB C E %IPG S _fstatatH w0K M _linkatN `_mkdiratP R _mknodat0S `T  U V "X -0Y 7`__read __writeP __openP __open64P [ __lseek __close __isatty eп p/ .textY .data@!.bssy@).rdataO{XZ Z [ &p\ _sysconf\ __ZL3sca:]`_confstr0] __ZL3csa^  ^ @^ `^ _sysinfo^ ?.textZv [.data ".bss .rdata@d &$; "N_openlogf |`$"0h Ph Ph ph  h #h :h [ Pi j _vsyslog0j  l/_syslogp _vklogq R_klogs cs .text@d.data ".bss .rdataml0@t  _tcdrainPv _tcflushx 7z_tcflowz Ze|} @   C@ Mqp |G`   P   .text@t.data4".bss(.rdata )  E  d P { P  p  p         : Ѝ Y            0 ] @  P  `  @  0 Q  m @  `        7 P _ p  А         8 PЇpЇ %  0 p-0 DP [p t@p   `4  P 4 )P @p W h {      @ g {  @ ` 'bК   @ p , J n 0 `0     A p0  0 P О # \   p   & QС zС  T      #@ >p` hH Z@    p  0P _ p @  0 )п E h P 0  p ` 0 N l P  P    5j @  P , I eP    ` @   # @ ^ z   p ` @    -  H  c  ~       0     !=!@ U!P l!  ! ! ! ! ! !P "  " 0" b"P " " "  # %# 8# O# l#` #@ #  # # # '$ >$  X$  o$ $  $ $ $` $@ %  !% 2%^% p%@ %` %& "& 6&  J&@y&0! &p# &# &`% &'% +'& B'' V'( t'( '@') '* '+  (`, #(@- B(. `(. {(/ (P1 (02 (3 (3 )4 /)5 J)`6 ^)`6 r) 7 ) 7 )08 )p8 )*G*P9 a**9 **< +<+= Y+= t+@+@ ++A ,@,@C b,@,PF ,,G -3-H \--J -@-PK .:.M h.@.N .O .O /@O ./`O .textPD.data4".bss@.rdata.ctors.dtorsZ/n/pO //S //@#0T @0T ]0T z0T 0T 00U 00U 0U 1U *1 V c1`V 1pW 12\ 2`=2] K2 t2^ 22_ 22Pa 3a  323@c =3_alarmd b3_ualarme 33f 3f .textpO^.data4".bss@.rdata`.ctors.dtors3`3f 4`g 04` f44h 4 4j 4@k 4k 5l Q5l 5m 5`m 5n _timen 50  6o 66 _utimes`r _lutimes@s w6 t 66_futimesu _utimeu 6@6v  7@w #7P7@x p7`x 70y 7py 7D_ftime`z _timesz 7 7~ 78 .8X8 t88 8@8  8@ 9 9H79`9` __timesz u9py .textfT#&.data4".bss@.rdata 9 )90 9 9 9Њ 9Њ  : &: .text0 .data4".bssH.rdata!_getpt@ @:` _grantpt N:$:#:@ _revoke :b$_ttyslotp : :  ;P (; G; Y;#; ;G$; ; ;` < +< Z<#<Г < <@#%= 8=!#b= u= = = $= .text@ .data4".bssH.rdata!=P >0 &>)W>` c>@ m>`>(> )> _getuidЛ > _getgid > _geteuid >  _getegid0 _cuserid@ ?p $? H? q? ? ? ?(5@ \@Х @ @`)@P @ A(]AP tA A A Ab(A@(Bl(.text0!.data4".bss`.rdata$_uname0 .text03.data4".bss`.rdata)d _wait4 $B*EB+_wait3 _waitpidк _wait .textk5.data4".bss`.rdata *rB0 .text0.data4".bss`.rdata@+UB PB0 B B  B@ C` +C  FCpkCp .text0R%.data4".bss`.rdata+P~CT:C C C` C C`,-D,ZD@ .text+.data4".bss`.rdata,oDp D`-Dp D@ %E .textp&.data4".bss`.rdata,AE_insque _remque@ .textl.data4".bss`UEp {EE`Ep E _dlfree E F  F  F !F 7F0 OFP YF dF` sFp F F F F F .textp`/S.data4".bss`.rdata-N.text.data@"x.bss`.rdata-YF FG *GTG yGG GG H=H bH {H H@6H@ 3I fI@7I@ I63J@ iJ J5J  K 6K ]K6K K K8L 8L MLH5yL0 L5L L`5.text .data".bss`.rdata`01Mp PM rMp M M .textpU.data".bssdM Md.N@9kN  N:N9N O@:XO xO O O@ O` P9>P  ^P  .textvr.data".bssd.rdata7.textP  .data".bssh.text`  .data".bssh__f_expp  .textp a.data".bssh__f_expf  .text m.data".bssh.textP .data".bssh.textp .data".bssh.text .data".bssh.text .data".bssh.text .data".bssh.text .data".bssh.text .data".bssh.text .data".bssh__f_pow  .text T.data".bssh__f_powfP  .textP X.data".bssh.text .data".bssh.text .data".bssh~P  .text .data".bsshPp  .textp w.data".bssh.text .data".bssh.rdata: P  .text 8.data".bsshP0 .text0.data".bsshPP .textP..data".bsshP .text.data".bsshP P .text&.data".bssh_acos .text .data".bssh.rdata:_acosf .text .data".bssh.rdata:_acoshP .textP.data".bssh.rdata:_acoshf .text.data".bssh.rdata:_asin .text .data".bssh.rdata:_asinfp .textp .data".bssh.rdata:_asinh0 .text0 .data".bssh.rdata:_asinhf  .text  .data".bssh.rdata:_atan0 _atanlo ;_atanhi;.text0.data".bssh.rdata;_atan2 .text .data".bssh_atan2f .text .data".bssh_atanf  _atanlo;_atanhi;.text .data".bssh.rdata;h_atanh .text .data".bssh.rdata(< _atanhf .text .data".bssh.rdata4< _cabs .textF.data".bssh_cabsf0 .text0D.data".bssh_cbrt .text.data".bssh.rdata@<(_cbrtf .text.data".bssh.rdatah<_ceilp .textp8.data".bssh.rdata<_ceilf .text.data".bssh.rdata<P .text'.data".bsshP .text!.data".bssh_cos .text.data".bssh_cosf  .text .data".bssh_coshp! .textp! .data".bssh.rdata<_coshf@" .text@" .data".bssh.rdata<_drem# .text# .data".bssh_dremf # .text # .data".bssh_erf0# _erfc& .text0#.data".bssh.rdata<_erff@* _erfcf- .text@*.data".bssh.rdata>_exp@1 .text@1.data".bssh.rdata? _expf@2 .text@2@.data".bssh.rdata?_expm13 .text3.data".bssh.rdata?|_expm1fp6 .textp6.data".bssh.rdataX@HP9 .text9.data".bsshP9 .text9.data".bsshQ9 _llrintl9 .text94.data".bsshQ: .text:.data".bsshQ : .text :.data".bssh)Q@: _lrintl`: .text@:1.data".bssh__f_rint: .text: .data".bssh4Q: .text: .data".bssh>Q: _rintl: .text:.data".bssh_fabs: .text:.data".bssh_fabsf: .text:.data".bssh_finite; .text;.data".bssh_finitef ; .text ;.data".bssh_floor@; .text@;B.data".bssh.rdata@_floorf< .text<.data".bssh.rdata@_fmod`= .text`= .data".bssh.rdata@_fmodfP> .textP> .data".bssh.rdata@_frexp@? .text@?t.data".bssh.rdata@_frexpf? .text?.data".bssh.rdata@_gamma@@ .text@@,.data".bssh.rdata@_gamma_rpA .textpA.data".bssh.rdata@_gammafB .textBc.data".bssh.rdata@HQD .textD,.data".bssh.rdata@_hypot0E .text0E .data".bssh.rdataA_hypotf F .text F .data".bssh.rdataA_ilogbG .textG.data".bssh_ilogbfG .textGT.data".bsshRQG .textG .data".bssh.rdata(A\QH .textH .data".bssh.rdata0A_isinfH .textH8.data".bssh_isinffPH .textPH.data".bssh_isnanpH .textpH..data".bssh_isnanfH .textH.data".bssh_j0H _y0I .textH.data".bssh.rdata8A_j0fJ _y0fpK .textJ.data".bssh.rdataPA_j1L _y1pM .textL.data".bssh.rdatahA_j1fN _y1f`O .textN.data".bssh.rdataA_jnP _ynpQ .textP&.data".bssh.rdataA_jnfR _ynfS .textR<.data".bssh.rdataA_ldexpU .textUp.data".bssh_ldexpfU .textUp.data".bssh_lgammaU .textU,.data".bssh.rdataAgQ W .text W.data".bssh.rdataA_lgammaf@X .text@X..data".bssh.rdataAqQpY .textpY,.data".bssh.rdataA_logZ .textZ.data".bssh.rdataB_log10[ .text[ .data".bssh.rdataB_log10f\ .text\ .data".bssh.rdata$B_log1p] .text].data".bssh.rdata8Bl_log1pf` .text`.data".bssh.rdataB<_logb@c .text@c.data".bssh.rdataB_logbfd .textd.data".bssh.rdataB _logfd .textd .data".bssh.rdataC_matherre .texte.data".bssh_modfe .texte.data".bssh_modfff .textf.data".bssh_nang .textg .data".bssh.rdataC_nanf g .text g .data".bssh.rdataC|Q0g .text0g+.data".bsshQ`h .text`h.data".bssh_pow@i .text@i"'.data".bssh.rdataC_powfpm .textpmb*.data".bssh.rdata4CQq .textq.data".bssh.rdataPC Qr .textr.data".bssh.rdata\C _scalbps .textps[.data".bssh.rdatahC_scalbft .textth.data".bssh.rdataxC_scalbn@v .text@v.data".bssh.rdataC_scalbnf@w .text@w.data".bssh.rdataC_sinPx .textPx.data".bssh_sinf y .text y.data".bssh_sinhy .texty .data".bssh.rdataC_sinhfz .textz .data".bssh.rdataC_sqrt{ .text{.data".bssh.rdataC_sqrtf| .text|.data".bssh.rdataC_tan`} .text`}x.data".bssh_tanf} .text}}.data".bssh_tanh`~ .text`~ .data".bssh.rdataC _tanhf0 .text0 .data".bssh.rdataD _cacos .text.data".bssh.rdataD_cacosf .textu.data".bssh.rdataD_cacosh .text.data".bssh_cacoshf .text.data".bssh_cargp .textpF.data".bssh_cargf .textD.data".bssh_casin .text .data".bssh_casinf .text- .data".bssh_casinhЅ .textЅ.data".bssh_casinhf` .text`_.data".bssh_catan .textJ .data".bssh.rdata D_catanf .textI .data".bssh.rdata4D _catanh` .text`.data".bssh_catanhf .text_.data".bssh_ccosP .textP .data".bssh.rdata@D_ccosf .text .data".bssh.rdataDD_ccosh .text .data".bssh.rdataHD_ccoshf .text .data".bssh.rdataLD_cexp0 .text0.data".bssh.rdataPD_cexpfЍ .textЍ.data".bssh.rdataTD_cimag` .text` .data".bssh_cimagfp .textp.data".bssh_clog .text.data".bssh.rdataXD_clogf .texti.data".bssh_conj .text.data".bssh_conjf .text.data".bssh_cpow .texte .data".bssh.rdata\D_cpowf0 .text0S .data".bssh.rdata`D_cproj .text.data".bssh.rdatadD_cprojf@ .text@.data".bssh_crealГ .textГ .data".bssh_crealf .text.data".bssh_csin .text .data".bssh.rdatahD_csinf .text .data".bssh.rdatalD_csinhP .textP .data".bssh.rdatapD_csinhf .text .data".bssh.rdatatD_csqrt .text.data".bssh.rdataxD_csqrtf .text.data".bssh.rdataD_ctan .text@.data".bssh.rdataD_ctanf .text.data".bssh.rdataD_ctanh .text.data".bssh.rdataD_ctanhf .text.data".bssh.rdataD_exp10p .textp.data".bssh.rdataD_exp10f .text.data".bssh_exp2 .text.data".bssh.rdataD_exp2fР .textР.data".bssh_fdim .textz.data".bssh.rdataD_fdimfp .textpr.data".bssh.rdataD_fma .text.data".bssh_fmaf .text.data".bssh_fmax  .text E.data".bssh_fmaxfp .textpP.data".bssh_fmin .textG.data".bssh_fminf .textP.data".bssh_llround` .text`.data".bsshQ .text.data".bssh_log2 .text.data".bssh.rdataD_log2f .text.data".bssh.rdataD_lround  .text .data".bssh_lroundf0 .text0.data".bsshQ .text .data".bsshQ .text .data".bssh_pow10 .text.data".bssh.rdataD_pow10f  .text .data".bssh_remquo@ _ZeroD.text@.data".bssh.rdataD_remquof _ZeroE.text.data".bssh.rdataE_round .text.data".bssh_roundf@ .text@.data".bssh_scalblnа .textа.data".bssh.rdata EQ .text.data".bssh.rdata@EQ .text-.data".bsshQ .text,.data".bssh_sincos .text+.data".bssh_sincosf@ .text@*.data".bssh_tgammap .textp.data".bssh_tgammaf0 .text0.data".bssh_trunc .text.data".bssh_truncf .textF.data".bssh.text.data".bsshQ .text).data".bssh.rdataPEtR  .text ).data".bssh.rdataEDR  .text .data".bssh.rdataF "R .text.data".bssh.rdata F4R .text.data".bssh.rdata(FDR .text.data".bssh.rdataFDURп .textп.data".bssheR .text2.data".bssh.rdataFhtR0 .text0.data".bsshR0 .text0.data".bssh.rdataXG@R@ .text@.data".bssh.rdataGHR .textR .data".bssh.rdataGRP .textP.data".bssh.rdataGR0 .text0.data".bssh.rdataHR  RHR H.text 5.data".bssh.rdata HS` .text`(.data".bssh.rdataJDS .text.data".bssh.rdataHJ4"S@ 7SKDSJ.text@5.data".bssh.rdataJNS .text.data".bssh.rdata@N(]S .text.data".bssh.rdatahNlS` .text` .data".bssh.rdataN|S .text .data".bssh.rdataNS _halFN_ln2HIN_ln2LON.text.data".bssh.rdataNSp _halFXO_ln2HIHO_ln2LOPO.textp.data".bssh.rdataHOLS _ZeroO.text.data".bssh.rdataOS0 _ZeroO.text0.data".bssh.rdataOS .text!.data".bsshS .text!.data".bsshS0 .text0.data".bsshT  .text .data".bssh.rdataO_pzero _pS2Q_pR2@Q_pS5P_pR5@P_pS8P_pR8O_pS3Q_pR3P_qzeroP _qS2S_qR2@S_qS5R_qR5@R_qS8R_qR8Q_qS3S_qR3RT %T .textF.data".bssh.rdataO0_pzerof _pS2U_pR2U_pS5DU_pR5,U_pS8U_pR8U_pS3pU_pR3XU_qzerof _qS2XV_qR2@V_qS5U_qR5U_qS8U_qR8U_qS3(V_qR3V3TP BT  .text.data".bssh.rdataU_pone _ps2X_pr2X_ps5W_pr5W_ps8`W_pr8 W_ps3`X_pr3 X_qone _qs2Z_qr2Z_qs5Y_qr5Y_qs8`Y_qr8 Y_qs3`Z_qr3 ZQT` _T0 .text4.data".bssh.rdata W8_ponef@ _ps2\_pr2\_ps5\_pr5\_ps8x\_pr8`\_ps3\_pr3\_qonef _qs2X]_qr2@]_qs8(]_qr8]mT |T .text@Nm.data".bssh.rdata`\T T .textk).data".bssh.rdata^4T  T  .text X.data".bssh.rdata@^T` .text`9n.data".bssh.rdata`^T T .text:j.data".bssh.rdata`L T .text.data".bssh.rdatab(T .text.data".bssh.rdata0bUp _bpPb_dp_l`b_dp_hpb.textp-.data".bssh.rdataHb_rint % _TWO52hc.text %@.data".bssh.rdatahc U`& _bp|c_dp_lc_dp_hc.text`&I..data".bssh.rdataxc0U- .text-=.data".bssh.rdatadEU. .text.<.data".bssh.rdatad[U00 .text00 .data".bssh.rdata dlU01 .text01 .data".bssh.rdata(d~U02 .text02o.data".bssh.rdata0dU3 .text3 .data".bssh.rdataHdU05 .text05.data".bssh.rdataPdU7 .text7.data".bssh.rdatadD__cchsh9 __redupi9 __ctans: .text9.data".bssh.rdatae0__cchshf0; U; __ctansf0< .text0;.data".bssh.rdataHe _rintf@= _TWO23he.text@=.data".bssh.rdataheU> .text>"1.data".bssh.rdatape\U@T _init_jkh_PIo2i.text@T%.data".bssh.rdatahtUp\ _init_jk`i_PIo2i.textp\..data".bssh.rdata`i`Vd .textd).data".bssh Vd .textdg.data".bsshV@e .text@e2.data".bssh%Ve .texte*.data".bssh.texte.data"?.bssh5Ve .texte.datab.bsshAV0f .text0fj.datab.bssh___errnof .textf.datab.bsshKVf ]VkiV0g uVbVVcVbVVq V`V`r WWpu *Wu ?Wu TWu gWu _lconv@bvWw .textfk.datab .bss.rdataiC_mempcpy w .text w.datac.bss`Ww .textw.datac.bss`_absw .textw.datac.bss`_atoix __atoi_r0x .textxZ.datac.bss`_atol`x __atol_rx .text`xZ.datac.bss`_bcmpx .textx .datac.bss`_bcopyx .textx.datac.bss`_bsearchx .textxw.datac.bss`_bzeropy .textpy.datac.bss`Wy .texty.datac.bss`_divy .texty8.datac.bss`Wy _drand48z .texty;.datac.bss`W0z _erand48z .text0z.datac.bss`Wc.textz.datac`.bss`.rdatak_indexz .textz .datah.bss`_isalnumz .textz.datah.bss`_isalpha{ .text{.datah.bss`_isascii0{ .text0{.datah.bss`_iscntrl@{ .text@{.datah.bss`_isdigit`{ .text`{.datah.bss`_isgraph{ _isprint{ .text{8.datah.bss`_islower{ .text{.datah.bss`_ispunct{ .text{.datah.bss`_isspace| .text|.datah.bss`_isupper | .text |.datah.bss`W@| .text@|.datah.bss`W`| _jrand48| .text`|R.datah.bss`_labs| .text|.datah.bss`W| _lcong48@} .text|.datah.bss`_ldivp} .textp}8.datah.bss`W} _lrand48} .text}[.datah.bss`_mblen~ .text~.datah.bss`W~ .text~>.datah.bss`_mbtowc~ .text~.datah.bss`_memccpyp .textp.datah.bss`.text.datah.bss`BYTECMP.textR.datah.bss`.textH.datah.bss`.textP.datah.bss`.text.datah.bss`Wp _nrand48 .textpb.datah.bss`_qsort .text.datah.bss`_srandЊ _rand .textЊq.datah.bss`_rindexP .textP .datah.bss`X`  X`_seed48 .text`.datah.bss`Xp _srand48 .textp.datah.bssh#X  .text B.datah.bssh_strcatp .textpP.datah.bssh.text.datah.bssh_strcmp .text.datah.bssh_strcpyP .textPS.datah.bssh_strcspn .textR.datah.bssh_strlcat .text.datah.bssh_strlcpy .textV.datah.bssh.texty.datah.bssh_strlwr .text4.datah.bssh/X .textW.datah.bssh_strncat  .text w.datah.bssh_strncmp .text.datah.bssh_strncpyp .textp}.datah.bssh_strpbrk .texth.datah.bssh_strrchr` .text`I.datah.bssh_strspn .text\.datah.bssh.datah.bssh_wctomb .text[.datah.bssh_a64l@ .text@.datah.bssh_atollЦ X .textЦZ.datah.bssh_btowc0 .text0.datah.bsshX X XШ .textq.datah.bsshX@ .text@E.datah.bssh_llabs .text7.datah.bssh_lldivЪ .textЪ.datah.bssh_isblank` .text` .datah.bsshX .text3.datah.bsshX _u2fa}_u2b7}_u2a6}_u1f1}_u1d7|_u1d6|_u1d5|_u1d4|_u134|_u124|_u123|_u110|_u10c|_u10b|_u10a||_u109v|_u108i|_u104c|_u103Q|_u102K|_u101H|_u1004|_uff|_ufe|_ufd |_ufb{_ufa{_ud7{_uab{_uaa{_ua9{_ua8{_ua7{_ua6s{_ua4m{_u9fj{_u4dg{_u31[{_u30C{_u2eB{_u2d {_u2c{_u24{_u21z_u20z_u1fz_u1dz_u1cz_u1bz_u1az_u19nz_u18az_u17Gz_u168z_u145z_u13&z_u12z_u10y_ufy_uey_ud@y_ucy_ubx_uax_u9@x_u88x_u7*x_u6x_u5x_u4x_u3w_u2w_u0w.textJ.datah.bssh.rdatak9Y .textW.datah.bssh Y .text7.datah.bsshY0 .text0 .datah.bssh.rdata }4 Y .text.datah.bssh(Y0 .text06.datah.bssh2Yp .textp .datah.bssh.datah.bssh.rdata@#xZ0 Z.text0 .datah.bssh.rdataZP _twalk .textP.datah.bssh_wcpcpy .text&.datah.bssh_wcpncpy@ .text@v.datah.bsshZ _wcrtomb` .textf.datah.bsshZ0 .text0q.datah.bssh_wcscat .text<.datah.bssh_wcschr .text$.datah.bssh_wcscpy  .text 9.datah.bssh_wcscspn` .text`Y.datah.bsshZ _wcsdup .textr.datah.bssh_wcslcat@ .text@.datah.bssh_wcslcpy .text].datah.bsshZ@ .text@.datah.bssh_wcsncat .textG.datah.bssh_wcsncmp .textG.datah.bssh_wcsncpy` .text`Q.datah.bssh_wcsnlen .text6.datah.bsshZ Zp .text.datah.bssh_wcspbrk .textU.datah.bssh_wcsrchr .text:.datah.bsshZP Z .textP.datah.bssh_wcsspn .textg.datah.bssh_wcsstr@ .text@.datah.bsshZ [h[P _wcstod _wcstof .text@.datah.bssh_wcstoll  .text 0.datah.bssp_wcstokP .textP.datah.bssp[ _wcstol .text.datah.bssp)[ _wcstoul .text.datah.bssp5[ .text0.datah.bssp?[  .text .datah.bssp_wctob .text.datah.bsspI[P _wctrans .textP.datah.bssp.rdataU[ _wctype .text.datah.bssp.rdata`[ j[P u[ [_wcwidth .text.datah.bssp.rdata` _wmemchr .text4.datah.bssp_wmemcmp .textP.datah.bssp_wmemcpy@ .text@.datah.bssp[P .textP.datah.bssp_wmemset` .text`".datah.bssp_wordexp .text;B.datah.bssp.rdatah[ .textR.datah.bssp[0 _fprintf` .text0`.datah.bssp_get_arg [  [[[R .textpJ.datah.bssp.rdatah[S _fputcS .textSM .datah.bssp_exitPT .textPT4.datah.bssp[T [T \U .textT.datah$.bssp\V +\Z 6\Z F\P[ T\[ .textV.data.bsspa\\ p\^ {\^ \ _ \_ .text\.data.bssp\` _fwritea .text`g.data.bssp_atexitb .textb+.data.bssp\@b .text@b).data.bssp\pb \b \b \b \0c \Pc ]]pc /]c E]S]c ___sinitc ___sfp f i]pg x]g .textpbW2.data.bssp]g ]p]g ]h .textg`.data.bssp]0h .text0h.data.bsst]Ph _sprintfh .textPh.data.bsst]i ]l _fflushl .texti .data.bsst_sscanfl ]`m .textl.data.bsst]m  ^`n .textm".data.bsst^o _tzinfo.texto .data@.bsst_asctimeo .texto".data.bsst ^@o +^`:^.text@oi.data.bsst.rdata@YI^o _fopen@q .texto.data.bsstS^pq _fgets t .textpq.data.bsst]^Pt _fcloseu .textPt.data.bssth^u _fseek| .textuP.data.bsstr^0| _ftell} .text0|r.data.bsst_fileno} .text}.data.bsst_fcntl`~ .text`~0.data.bsst|^~ _fputsp .text~ .data.bsst^ ^0 .text.data.bsst__getc_rp _getc .textpY.data.bsst__puts_rЂ _puts` .textЂ.data.bsst.rdata^ _perror  .text.data.bsst.rdata__ExitP .textP.data.bsst^p .textp;.data.bsst^ _fpurge ^ .textb.data.bsst^  .text  .data.bsst^ .text).data.bsst^ ___srget@ .text.data.bsst^p ___swbuf .textpI.data.bsst^ _P _Њ #_P 4_  H_ Y_ j_ z_ _@ _֟_ _  _ _ __ȟ `@ ` )` :` M` .text$.data.bsst.rdata$ c` p`P .text.data.bsstz` ` .text5.data.bsst_fscanf `0 .textX.data.bsst_scanf` ` .text`X.data.bsst_eisnan _eisinf _eisnegP _enegp _emovi _eiisnanP _ecmpm _eshdn1 _eshup1  _eshdn8` _eshup8 _eaddm _esubm _m16m@ _edivm _emulmP _ecmp0 _eshift _enormlzP _emdnorm` ` _enan _nan113_nan53_nan24_nan64` _emul _ezerot_ediv  `` `p _eone_etens_emtens _bmask ` ` .textF.4.dataD.bsst.rdataB{` ` .text.data@.bssa a$a 0a@ _vfscanfp .text +L.data@.bss.rdata`_vscanf b _fgetc  .textY.data@.bssHbP _fgetpos .textPY.data@.bssTb bb .texti.data@.bssmb  _fgetwc .text  .data@.bssxb _fgetws .text\.data@.bssb0 b` .text0`.data@.bssb b b b b bp b .text.data@.bssb0 _fopen64  .text0.data@.bssb! c`! c! cp" %c" /c0# ?c% .text!E!.data@.bssLcP% _fputwc' .textP% .data@.bssWc' _fputws`) .text' .data@.bssbc) rc* _fread. .text).data@.bss|cP. _freopen1 .textP..data@.bssc 2 c5 .text 2.data@.bssc5 _fseeko5 .text5@.data@.bssc 6 c> .text 6.data@.bssc> _fsetpos? .text>i.data@.bssc0? cp? .text0?i.data@.bssc? _ftello? .text?2.data@.bssc? dA .text? .data@.bss dA d`B "dB -d@C 8dC CdD _funopenE .textA!.data@.bssOdF _fwideF .textF.data@.bssYd G fdPG .text G`.data@.bss_fwscanfG pdG .textGX.data@.bss|dG d`H .textG.data@.bssdH _getcharI .textHB.data@.bssd@I d`I .text@IB.data@.bss__gets_rI _gets0K .textI .data@.bss_getw`K .text`K8.data@.bssdK _getwcK .textK.data@.bssdK dK .textKL.data@.bss_hcreateL _htabd0L _hsearchPL .textLs.data@.bssdL e@M epM .textL.data@.bss_iprintf@N epN .text@NX.data@.bss)eN 6e_nl_ext`.textNBL.data@.bss.rdata0_on_exitR .textR*.data@.bssAe S LeT YeV te@X eX eY eY eY eZ .text S.data@.bsse@Z _printfpZ .text@Z`.data@.bss_psignalZ .textZv.data@.bss.rdata __putc_r [ _putc\ .text [8.data@.bsse`^ e`_ .text`^".data@.bsse` _putchar` .text`Y.data@.bss f` fa .text`C.data@.bss_putw@a .text@a6.data@.bss1fa _putwca .texta3.data@.bss;fa Hfa .textaU.data@.bssRf b _rewind`b .text bb.data@.bss_setbufb .textb..data@.bss]fb .textb-.data@.bsshfb .textb+.data@.bss_setvbuf c .text c5.data@.bsstf`e fe .text`e.data@.bssf f f0g fg f .text fmn.data@.bss.rdata̮V_strndup .text).data@.bss_match f fTff@_strtod0 _strtof` .textE.data@(.bss.rdata85f g` .textf.datah.bss_swscanf  g .text .datah.bss_tdelete .text.datah.bssg (gp _tempnamp _tmpnam .text.datah.bss.rdata4gК _tmpfile .textК.datah.bss.rdata@g Ng .text.datah.bss.rdata_tsearch .text.datah.bssYg@ dg _ungetc0 .text@ .datah.bssog` _ungetwcp .text`U.datah.bss{g g` .text.datah.bssg g0 .text.datah.bss_get_arg` g g gggP .text` 8C.datah.bss.rdata_get_arg _wcvt g ghhP$ .textI}.datah.bss.rdata,h$ .hm Qm  cm vm m0 m m m m m.textp .datah.bss.rdata( m@  nn+n;n` On.text@ .datah.bss.rdata@hr__fwalkЏ `n@ .textЏ.datah.bssnn .text.datah.bss|np nnnnn .textp .datah.bssH.rdatad o o5oJo[oPnop oh.text .datah.bss .rdata@(o o oo@op _emptyl!pm_wemptyp.text .datal.bss .rdata+p  @pUp8hpwpp _numonet.text  .datat.bss|.rdata p .text.datax.bss@pP .textP.datax.bss@p .text.datax.bss@p .text.datax.bss@p .text'.datax.bss@p  .text .datax.bss@p .text.datax.bss@_get_arg p@  q0 q|%ql.text6:.datax.bss@.rdata2q .text..datax.bss@?q .textH.datax.bss@Qq@ .text@.datax.bss@_q .text .datax.bss@___sread tq q ___sseek q q0 .text\ .data|.bss@q@ q .text@N.data|.bss@_get_arg q qPq@.text4Hx.data|.bss@.rdataq- q.text-(C.data|.bss@.rdataqV .textV.data|.bss@__open_rW .textWA.data|.bss@_lflushW rX .textW .data|.bss@rY .textYQ.data|.bss@"r0[ .text0[A.data|.bss@__Balloc[ __Bfree\ ,r0\ ___s2b] 7r^ Br`^ ___i2b^ Mr_ Yr` erora ___mcmpb ___mdiff0c ___ulpd ___b2d0e ___d2b@f ___ratio`g yrg rh rh .text[w .data|.bss@.rdata@X___sccli .texti.data|.bss@ri .texti.data|.bss@_quoremj __dtoa_rk .textjtG.data|.bss@.rdataDr} .text}A.data|.bss@r} .text}3.data|.bss@_hash4~ .text~.data|.bss@.rdata r r .text".data.bss@r0 rrP .text04.data.bss@sp .textpf.data.bss@_rshift  s sp .text/ (.data.bss@.rdata%s .text.data.bss@_get_arg _wcvt /s >s@Ks .textFq.data.bss@.rdata@,Xs ds qs s.text%%2.data.bss@.rdatas .text3.data.bss@s .textA.data.bss@__read_r@ .text@A.data.bss@s .textA.data.bss@s .textU.data.bss@s@ s  s s@ s.text@`!(.data.bss@.rdata@b.text1.data.bss@.text.data.bss@s .textN.data.bss@tDt0 .text0 .data.bss@t\%t@ .text@E.data.bss@0tTl:t .text.data.bss@DtPNt@! .text@!.data.bss@.rdataXtP% .textP%.data.bss@.rdata.text ).data.bss@.idata$78& .idata$5 .idata$4 .idata$6T .text().data.bss@.idata$7# .idata$5X .idata$4` .idata$6 .text0).data.bss@.idata$7# .idata$5H .idata$4P .idata$6~ .text8).data.bss@.idata$7% .idata$5 .idata$4 .idata$6 .text@).data.bss@.idata$7$ .idata$5@ .idata$4H .idata$6Z .textH).data.bss@.idata$7% .idata$5 .idata$4 .idata$6 .textP).data.bss@.idata$7% .idata$5x .idata$4 .idata$6 .textX).data.bss@.idata$7d& .idata$5 .idata$4 .idata$64 .text`).data.bss@.idata$7& .idata$5 .idata$4  .idata$6 .texth).data.bss@.idata$7& .idata$5 .idata$4 .idata$6* .textp).data.bss@.idata$7$ .idata$5` .idata$4h .idata$6 .textx).data.bss@.idata$7,& .idata$5 .idata$4 .idata$6 .text).data.bss@.idata$7$ .idata$5 .idata$4 .idata$6r .text).data.bss@.idata$7% .idata$5\ .idata$4d .idata$6 .text).data.bss@.idata$7& .idata$5$ .idata$4, .idata$6v .text).data.bss@.idata$7$ .idata$5t .idata$4| .idata$6@ .text).data.bss@.idata$7`& .idata$5 .idata$4 .idata$6  .text).data.bss@.idata$7x& .idata$5 .idata$4 .idata$6| .text).data.bss@.idata$7& .idata$5 .idata$4 .idata$6 .text).data.bss@.idata$7$ .idata$5 .idata$4 .idata$6^ .text).data.bss@.idata$7@% .idata$5 .idata$4 .idata$6 .text).data.bss@.idata$7& .idata$5  .idata$4( .idata$6\ .text).data.bss@.idata$7$ .idata$5d .idata$4l .idata$6 .text).data.bss@.idata$7,$ .idata$5 .idata$4 .idata$6 .text).data.bss@.idata$7$ .idata$5x .idata$4 .idata$6P .text).data.bss@.idata$7% .idata$5  .idata$4 .idata$6d .text).data.bss@.idata$7$ .idata$5 .idata$4 .idata$64 .text).data.bss@.idata$7$ .idata$5 .idata$4 .idata$6 .text*.data.bss@.idata$7|$ .idata$5 .idata$4 .idata$6 .text*.data.bss@.idata$7# .idata$5\ .idata$4d .idata$6 .text*.data.bss@.idata$7$ .idata$50 .idata$48 .idata$6 .text*.data.bss@.idata$7% .idata$5L .idata$4T .idata$6 .text *.data.bss@.idata$7$ .idata$5 .idata$4$ .idata$6 .text(*.data.bss@.idata$7% .idata$5 .idata$4 .idata$6 .text0*.data.bss@.idata$7p% .idata$5 .idata$4 .idata$6 .text8*.data.bss@.idata$7 % .idata$5 .idata$4 .idata$6 .text@*.data.bss@.idata$7(& .idata$5 .idata$4 .idata$6 .textH*.data.bss@.idata$7$ .idata$5 .idata$4 .idata$6 .textP*.data.bss@.idata$7$ .idata$5h .idata$4p .idata$6( .textX*.data.bss@.idata$7$ .idata$5  .idata$4 .idata$6H .text`*.data.bss@.idata$7h$ .idata$5 .idata$4 .idata$6T .texth*.data.bss@.idata$7% .idata$5, .idata$44 .idata$6 .textp*.data.bss@.idata$7H& .idata$5 .idata$4 .idata$6 .textx*.data.bss@.idata$7$ .idata$58 .idata$4@ .idata$64 .text*.data.bss@.idata$7$ .idata$5 .idata$4 .idata$6 .text*.data.bss@.idata$7$ .idata$5l .idata$4t .idata$6< .text*.data.bss@.idata$7x$ .idata$5 .idata$4 .idata$6 .text*.data.bss@.idata$7% .idata$5 .idata$4 .idata$6 .text*.data.bss@.idata$7% .idata$5 .idata$4 .idata$6 .text*.data.bss@.idata$70& .idata$5 .idata$4 .idata$6* .text*.data.bss@.idata$7 & .idata$5 .idata$4 .idata$6 .text*.data.bss@.idata$7$ .idata$5  .idata$4( .idata$6 .text*.data.bss@.idata$7$ .idata$5 .idata$4  .idata$6 .text*.data.bss@.idata$7d$ .idata$5 .idata$4 .idata$6: .text*.data.bss@.idata$7% .idata$5d .idata$4l .idata$6 .text*.data.bss@.idata$7D% .idata$5 .idata$4 .idata$6 .text*.data.bss@.idata$7($ .idata$5 .idata$4 .idata$6 .text*.data.bss@.idata$7 & .idata$5| .idata$4 .idata$6f .text*.data.bss@.idata$7$ .idata$5\ .idata$4d .idata$6 .text*.data.bss@.idata$7<% .idata$5 .idata$4 .idata$6 .text+.data.bss@.idata$7$& .idata$5 .idata$4 .idata$6 .text+.data.bss@.idata$7# .idata$5h .idata$4p .idata$6 .text+.data.bss@.idata$7\& .idata$5 .idata$4 .idata$6  .text+.data.bss@.idata$7l& .idata$5 .idata$4 .idata$6F .text +.data.bss@.idata$7% .idata$5` .idata$4h .idata$6 .text(+.data.bss@.idata$7t& .idata$5 .idata$4 .idata$6h .text0+.data.bss@.idata$7% .idata$5p .idata$4x .idata$6\ .text8+.data.bss@.idata$74& .idata$5 .idata$4 .idata$6< .text@+.data.bss@.idata$7X$ .idata$5 .idata$4 .idata$6 .textH+.data.bss@.idata$7# .idata$5< .idata$4D .idata$6N .textP+.data.bss@.idata$7& .idata$58 .idata$4@ .idata$6 .textX+.data.bss@.idata$7X% .idata$5 .idata$4 .idata$6" .text`+.data.bss@.idata$7`% .idata$5 .idata$4 .idata$6H .texth+.data.bss@.idata$7d% .idata$5 .idata$4 .idata$6V .textp+.data.bss@.idata$7T% .idata$5 .idata$4 .idata$6 .textx+.data.bss@.idata$7,% .idata$5 .idata$4 .idata$6: .text+.data.bss@.idata$7$ .idata$5 .idata$4 .idata$6 .text+.data.bss@.idata$7T$ .idata$5 .idata$4 .idata$6 .text+.data.bss@.idata$7& .idata$5 .idata$4 .idata$6 .text+.data.bss@.idata$7$ .idata$5 .idata$4  .idata$6  .text+.data.bss@.idata$7& .idata$5 .idata$4 .idata$6~ .text+.data.bss@.idata$7% .idata$5 .idata$4$ .idata$6 .text+.data.bss@.idata$7& .idata$5 .idata$4 .idata$6 .text+.data.bss@.idata$7& .idata$5 .idata$4 .idata$6 .text+.data.bss@.idata$78$ .idata$5 .idata$4 .idata$6@ .text+.data.bss@.idata$74$ .idata$5 .idata$4 .idata$6" .text+.data.bss@.idata$7% .idata$5h .idata$4p .idata$6 .text+.data.bss@.idata$7& .idata$50 .idata$48 .idata$6 .text+.data.bss@.idata$7% .idata$5H .idata$4P .idata$6 .text+.data.bss@.idata$7& .idata$54 .idata$4< .idata$6 .text+.data.bss@.idata$7% .idata$5D .idata$4L .idata$6p .text+.data.bss@.idata$7& .idata$5 .idata$4 .idata$6 .text,.data.bss@.idata$7# .idata$54 .idata$4< .idata$6, .text,.data.bss@.idata$7`$ .idata$5 .idata$4 .idata$6, .text,.data.bss@.idata$7$ .idata$5, .idata$44 .idata$6 .text,.data.bss@.idata$7$ .idata$5L .idata$4T .idata$6 .text ,.data.bss@.idata$7h% .idata$5 .idata$4 .idata$6f .text(,.data.bss@.idata$7$ .idata$5 .idata$4 .idata$6 .text0,.data.bss@.idata$7|% .idata$5 .idata$4 .idata$6 .text8,.data.bss@.idata$7 $ .idata$5| .idata$4 .idata$6^ .text@,.data.bss@.idata$7$ .idata$5 .idata$4 .idata$6 .textH,.data.bss@.idata$7# .idata$5T .idata$4\ .idata$6 .textP,.data.bss@.idata$7$ .idata$5 .idata$4 .idata$6v .textX,.data.bss@.idata$7% .idata$5X .idata$4` .idata$6 .text`,.data.bss@.idata$7X& .idata$5 .idata$4 .idata$6 .texth,.data.bss@.idata$7t% .idata$5 .idata$4 .idata$6 .textp,.data.bss@.idata$7% .idata$5 .idata$4 .idata$6r .textx,.data.bss@.idata$7% .idata$5P .idata$4X .idata$6 .text,.data.bss@.idata$7& .idata$5 .idata$4  .idata$6: .text,.data.bss@.idata$7& .idata$5 .idata$4 .idata$6 .text,.data.bss@.idata$7$$ .idata$5 .idata$4 .idata$6 .text,.data.bss@.idata$7% .idata$5l .idata$4t .idata$6& .text,.data.bss@.idata$7# .idata$5@ .idata$4H .idata$6Z .text,.data.bss@.idata$7# .idata$5D .idata$4L .idata$6l .text,.data.bss@.idata$7% .idata$5( .idata$40 .idata$6 .text,.data.bss@.idata$7& .idata$5t .idata$4| .idata$6D .text,.data.bss@.idata$7& .idata$5x .idata$4 .idata$6T .text,.data.bss@.idata$7& .idata$5 .idata$4$ .idata$6L .text,.data.bss@.idata$7& .idata$5p .idata$4x .idata$66 .text,.data.bss@.idata$7t$ .idata$5 .idata$4 .idata$6 .text,.data.bss@.idata$7% .idata$5T .idata$4\ .idata$6 .text,.data.bss@.idata$70% .idata$5 .idata$4 .idata$6X .text,.data.bss@.idata$74% .idata$5 .idata$4 .idata$6l .text,.data.bss@.idata$7T& .idata$5 .idata$4 .idata$6 .text-.data.bss@.idata$7$ .idata$5p .idata$4x .idata$6* .text-.data.bss@.idata$7& .idata$5@ .idata$4H .idata$6 .text-.data.bss@.idata$7 $ .idata$5 .idata$4 .idata$6 .text-.data.bss@.idata$7% .idata$5$ .idata$4, .idata$6 .text -.data.bss@.idata$78% .idata$5 .idata$4 .idata$6~ .text(-.data.bss@.idata$7P& .idata$5 .idata$4 .idata$6 .text0-.data.bss@.idata$7# .idata$58 .idata$4@ .idata$6< .text8-.data.bss@.idata$7% .idata$5  .idata$4( .idata$6 .text@-.data.bss@.idata$7<& .idata$5 .idata$4 .idata$6d .textH-.data.bss@.idata$7# .idata$5` .idata$4h .idata$6 .textP-.data.bss@.idata$7# .idata$5l .idata$4t .idata$6 .textX-.data.bss@.idata$7# .idata$5d .idata$4l .idata$6 .text`-.data.bss@.idata$7& .idata$5< .idata$4D .idata$6 .texth-.data.bss@.idata$7% .idata$5t .idata$4| .idata$6r .textp-.data.bss@.idata$7& .idata$5  .idata$4 .idata$6 .textx-.data.bss@.idata$7$ .idata$54 .idata$4< .idata$6$ .text-.data.bss@.idata$7% .idata$5 .idata$4 .idata$6, .text-.data.bss@.idata$7% .idata$5 .idata$4 .idata$6 .text-.data.bss@.idata$7& .idata$5 .idata$4 .idata$6 .text-.data.bss@.idata$7|& .idata$5 .idata$4 .idata$6 .text-.data.bss@.idata$7& .idata$5 .idata$4 .idata$6 .text-.data.bss@.idata$7H% .idata$5 .idata$4 .idata$6 .text-.data.bss@.idata$7h& .idata$5 .idata$4 .idata$6< .text-.data.bss@.idata$7% .idata$5 .idata$4 .idata$6 .text-.data.bss@.idata$7D& .idata$5 .idata$4 .idata$6 .text-.data.bss@.idata$7\$ .idata$5 .idata$4 .idata$6 .text-.data.bss@.idata$7& .idata$5 .idata$4 .idata$6 .text-.data.bss@.idata$7$ .idata$5T .idata$4\ .idata$6 .text-.data.bss@.idata$7@$ .idata$5 .idata$4 .idata$6| .text-.data.bss@.idata$7H$ .idata$5 .idata$4 .idata$6 .text-.data.bss@.idata$7L$ .idata$5 .idata$4 .idata$6 .text-.data.bss@.idata$7$ .idata$5P .idata$4X .idata$6 .text..data.bss@.idata$7P% .idata$5 .idata$4 .idata$6 .text..data.bss@.idata$7<$ .idata$5 .idata$4 .idata$6^ .text..data.bss@.idata$7D$ .idata$5 .idata$4 .idata$6 .text..data.bss@.idata$7P$ .idata$5 .idata$4 .idata$6 .text ..data.bss@.idata$7$ .idata$5< .idata$4D .idata$6B .text(..data.bss@.idata$7$ .idata$5 .idata$4 .idata$6 .text0..data.bss@.idata$7$ .idata$5( .idata$40 .idata$6 .text8..data.bss@.idata$7p$ .idata$5 .idata$4 .idata$6t .text@..data.bss@.idata$7$ .idata$5H .idata$4P .idata$6| .textH..data.bss@.idata$7$ .idata$5D .idata$4L .idata$6j .textP..data.bss@.idata$7# .idata$5P .idata$4X .idata$6 .textX..data.bss@.idata$7x% .idata$5 .idata$4 .idata$6 .text`..data.bss@.idata$7l$ .idata$5 .idata$4 .idata$6b .texth..data.bss@.idata$7# .idata$5L .idata$4T .idata$6 .textp..data.bss@.idata$7$ .idata$5$ .idata$4, .idata$6 .textx..data.bss@.idata$7l% .idata$5 .idata$4 .idata$6 .text..data.bss@.idata$70$ .idata$5 .idata$4 .idata$6 .text..data.bss@.idata$7 % .idata$5| .idata$4 .idata$6 .text..data.bss@.idata$7@& .idata$5 .idata$4 .idata$6~ .text..data.bss@.idata$7p& .idata$5 .idata$4 .idata$6V .text..data.bss@.idata$7$ .idata$5 .idata$4 .idata$6 .text..data.bss@.idata$7% .idata$5 .idata$4 .idata$6  .text..data.bss@.idata$7% .idata$5@ .idata$4H .idata$6\ .text..data.bss@.idata$7% .idata$5 .idata$4  .idata$6 .text..data.bss@.idata$7$ .idata$5X .idata$4` .idata$6 .text..data.bss@.idata$7% .idata$5 .idata$4  .idata$6< .text..data.bss@.idata$7% .idata$5< .idata$4D .idata$6L .text..data.bss@.idata$7% .idata$50 .idata$48 .idata$6 .text..data.bss@.idata$7% .idata$5 .idata$4 .idata$6N .text..data.bss@.idata$7& .idata$5, .idata$44 .idata$6 .text..data.bss@.idata$7\% .idata$5 .idata$4 .idata$60 .text..data.bss@.idata$7& .idata$5 .idata$4 .idata$6 .text/.data.bss@.idata$7L& .idata$5 .idata$4 .idata$6 .text/.data.bss@.idata$7(% .idata$5 .idata$4 .idata$6  .text/.data.bss@.idata$7% .idata$58 .idata$4@ .idata$60 .text/.data.bss@.idata$7% .idata$54 .idata$4< .idata$6 .text /.data.bss@.idata$7$% .idata$5 .idata$4 .idata$6 .text(/.data.bss@.idata$7L% .idata$5 .idata$4 .idata$6 .text0/.data.bss@.idata$7% .idata$5 .idata$4 .idata$6 .text8/.data.bss@.idata$7& .idata$5( .idata$40 .idata$6 hname< fthunk4 .text@/.data.bss@.idata$2 .idata$4< .idata$54 .text@/.data.bss@.idata$4L .idata$5D .idata$7&  .text@/.data.bss@.idata$7' .idata$5, .idata$44 .idata$6 .textH/.data.bss@.idata$7( .idata$5 .idata$4 .idata$6B" .textP/.data.bss@.idata$7 ' .idata$5 .idata$4 .idata$6$ .textX/.data.bss@.idata$7' .idata$5 .idata$4 .idata$6Z .text`/.data.bss@.idata$7& .idata$5X .idata$4` .idata$6b .texth/.data.bss@.idata$7(' .idata$5 .idata$4 .idata$6N .textp/.data.bss@.idata$7x' .idata$5 .idata$4 .idata$6 .textx/.data.bss@.idata$7' .idata$58 .idata$4@ .idata$6 .text/.data.bss@.idata$7' .idata$5 .idata$4 .idata$6 .text/.data.bss@.idata$7& .idata$5T .idata$4\ .idata$6R .text/.data.bss@.idata$7' .idata$5| .idata$4 .idata$6 .text/.data.bss@.idata$7P' .idata$5 .idata$4 .idata$6 .text/.data.bss@.idata$7x( .idata$5 .idata$4 .idata$6! .text/.data.bss@.idata$7\' .idata$5 .idata$4 .idata$6> .text/.data.bss@.idata$7,( .idata$5 .idata$4 .idata$6 .text/.data.bss@.idata$7( .idata$5 .idata$4 .idata$6t" .text/.data.bss@.idata$7<( .idata$5 .idata$4 .idata$6^ .text/.data.bss@.idata$7' .idata$5 .idata$4 .idata$6t .text/.data.bss@.idata$7' .idata$5 .idata$4 .idata$6 .text/.data.bss@.idata$7@( .idata$5 .idata$4 .idata$6| .text/.data.bss@.idata$7' .idata$5d .idata$4l .idata$6 .text/.data.bss@.idata$7' .idata$5L .idata$4T .idata$6L .text/.data.bss@.idata$7' .idata$5( .idata$40 .idata$6 .text/.data.bss@.idata$7D' .idata$5 .idata$4 .idata$6 .text0.data.bss@.idata$7P( .idata$5 .idata$4 .idata$6 .text0.data.bss@.idata$7' .idata$5 .idata$4  .idata$6< .text0.data.bss@.idata$7\( .idata$5 .idata$4 .idata$6 ! .text0.data.bss@.idata$7' .idata$5 .idata$4( .idata$6j .text 0.data.bss@.idata$7h' .idata$5 .idata$4 .idata$6 .text(0.data.bss@.idata$7' .idata$5 .idata$4$ .idata$6\ .text00.data.bss@.idata$7l' .idata$5 .idata$4 .idata$6 .text80.data.bss@.idata$7& .idata$5P .idata$4X .idata$66 .text@0.data.bss@.idata$7H( .idata$5 .idata$4 .idata$6 .textH0.data.bss@.idata$7$( .idata$5 .idata$4 .idata$6 .textP0.data.bss@.idata$7( .idata$5l .idata$4t .idata$6 .textX0.data.bss@.idata$7' .idata$5l .idata$4t .idata$6 .text`0.data.bss@.idata$74' .idata$5 .idata$4 .idata$6 .texth0.data.bss@.idata$7' .idata$5H .idata$4P .idata$64 .textp0.data.bss@.idata$7T' .idata$5 .idata$4 .idata$6 .textx0.data.bss@.idata$7' .idata$5 .idata$4 .idata$6 .text0.data.bss@.idata$7<' .idata$5 .idata$4 .idata$6 .text0.data.bss@.idata$7p' .idata$5 .idata$4 .idata$6 .text0.data.bss@.idata$7( .idata$5t .idata$4| .idata$68 .text0.data.bss@.idata$7( .idata$5 .idata$4 .idata$6" .text0.data.bss@.idata$7' .idata$5 .idata$4 .idata$6$ .text0.data.bss@.idata$7' .idata$5 .idata$4 .idata$6" .text0.data.bss@.idata$7' .idata$5 .idata$4 .idata$6> .text0.data.bss@.idata$7' .idata$5 .idata$4 .idata$6 .text0.data.bss@.idata$7L' .idata$5 .idata$4 .idata$6 .text0.data.bss@.idata$7 ' .idata$5p .idata$4x .idata$6 .text0.data.bss@.idata$70( .idata$5 .idata$4 .idata$6 .text0.data.bss@.idata$7`' .idata$5 .idata$4 .idata$6Z .text0.data.bss@.idata$7& .idata$5H .idata$4P .idata$6  .text0.data.bss@.idata$7' .idata$5 .idata$4 .idata$6 .text0.data.bss@.idata$7h( .idata$5 .idata$4 .idata$6R! .text0.data.bss@.idata$7' .idata$5X .idata$4` .idata$6 .text1.data.bss@.idata$7T( .idata$5 .idata$4 .idata$6 .text1.data.bss@.idata$7' .idata$54 .idata$4< .idata$6 .text1.data.bss@.idata$7(( .idata$5 .idata$4 .idata$6 .text1.data.bss@.idata$7& .idata$5\ .idata$4d .idata$6l .text 1.data.bss@.idata$7@' .idata$5 .idata$4 .idata$6 .text(1.data.bss@.idata$7& .idata$5` .idata$4h .idata$6 .text01.data.bss@.idata$7' .idata$5$ .idata$4, .idata$6x .text81.data.bss@.idata$7L( .idata$5 .idata$4 .idata$6 .text@1.data.bss@.idata$7 ( .idata$5 .idata$4 .idata$6 .textH1.data.bss@.idata$7' .idata$5x .idata$4 .idata$6 .textP1.data.bss@.idata$7X' .idata$5 .idata$4 .idata$6, .textX1.data.bss@.idata$7' .idata$5t .idata$4| .idata$6 .text`1.data.bss@.idata$7( .idata$5x .idata$4 .idata$6N .texth1.data.bss@.idata$7( .idata$5$ .idata$4, .idata$6# .textp1.data.bss@.idata$70' .idata$5 .idata$4 .idata$6l .textx1.data.bss@.idata$7' .idata$5D .idata$4L .idata$6 .text1.data.bss@.idata$7 ( .idata$5p .idata$4x .idata$6 .text1.data.bss@.idata$74( .idata$5 .idata$4 .idata$6 .text1.data.bss@.idata$7t' .idata$5 .idata$4 .idata$6 .text1.data.bss@.idata$7( .idata$5 .idata$4( .idata$6# .text1.data.bss@.idata$7X( .idata$5 .idata$4 .idata$6 .text1.data.bss@.idata$7( .idata$5h .idata$4p .idata$6 .text1.data.bss@.idata$7D( .idata$5 .idata$4 .idata$6 .text1.data.bss@.idata$7( .idata$5 .idata$4 .idata$6! .text1.data.bss@.idata$7' .idata$5T .idata$4\ .idata$6x .text1.data.bss@.idata$7( .idata$5 .idata$4 .idata$6" .text1.data.bss@.idata$7( .idata$5 .idata$4 .idata$6" .text1.data.bss@.idata$7|' .idata$5 .idata$4 .idata$6 .text1.data.bss@.idata$78' .idata$5 .idata$4 .idata$6 .text1.data.bss@.idata$7( .idata$5 .idata$4 .idata$6# .text1.data.bss@.idata$7H' .idata$5 .idata$4 .idata$6 .text1.data.bss@.idata$7' .idata$5h .idata$4p .idata$6 .text2.data.bss@.idata$7' .idata$5 .idata$4 .idata$6 .text2.data.bss@.idata$7' .idata$5@ .idata$4H .idata$6  .text2.data.bss@.idata$7,' .idata$5 .idata$4 .idata$6` .text2.data.bss@.idata$7p( .idata$5 .idata$4 .idata$6! .text 2.data.bss@.idata$7l( .idata$5 .idata$4 .idata$6r! .text(2.data.bss@.idata$7( .idata$5 .idata$4 .idata$6B# .text02.data.bss@.idata$7( .idata$5 .idata$4 .idata$6"# .text82.data.bss@.idata$7' .idata$5P .idata$4X .idata$6Z .text@2.data.bss@.idata$7`( .idata$5 .idata$4 .idata$6$! .textH2.data.bss@.idata$7' .idata$5 .idata$4 .idata$6 .textP2.data.bss@.idata$7( .idata$5 .idata$4 .idata$62" .textX2.data.bss@.idata$7( .idata$5| .idata$4 .idata$6h .text`2.data.bss@.idata$7t( .idata$5 .idata$4 .idata$6! .texth2.data.bss@.idata$7( .idata$5 .idata$4$ .idata$6|# .textp2.data.bss@.idata$7( .idata$5 .idata$4  .idata$6b# .textx2.data.bss@.idata$7|( .idata$5 .idata$4 .idata$6! .text2.data.bss@.idata$7& .idata$5L .idata$4T .idata$6 .text2.data.bss@.idata$7' .idata$5\ .idata$4d .idata$6 .text2.data.bss@.idata$7d' .idata$5 .idata$4 .idata$6n .text2.data.bss@.idata$7d( .idata$5 .idata$4 .idata$60! .text2.data.bss@.idata$7( .idata$5 .idata$4 .idata$6 .text2.data.bss@.idata$7( .idata$5 .idata$4 .idata$6" .text2.data.bss@.idata$78( .idata$5 .idata$4 .idata$6D .text2.data.bss@.idata$7' .idata$5` .idata$4h .idata$6 .text2.data.bss@.idata$7( .idata$5 .idata$4  .idata$6" .text2.data.bss@.idata$7( .idata$5d .idata$4l .idata$6 .text2.data.bss@.idata$7' .idata$5 .idata$4  .idata$6 .text2.data.bss@.idata$7$' .idata$5 .idata$4 .idata$68 .text2.data.bss@.idata$7( .idata$5 .idata$4 .idata$6Z" .text2.data.bss@.idata$7' .idata$50 .idata$48 .idata$6 .text2.data.bss@.idata$7' .idata$5 .idata$4 .idata$6 .text2.data.bss@.idata$7' .idata$5< .idata$4D .idata$6 hnameP fthunkH .text3.data.bss@.idata$2 .idata$4P .idata$5H .text3.data.bss@.idata$40 .idata$5( .idata$7(  .rsrcbt, tt/ tx) t) t- t. _memmoveP t- t00 t* uH) u1 1u`/ w. Rw1 `w0* uw0 w2 w(1 w/ w`1 w) w@1 x, x/ %x2 :x2 Pxp, _x2 {xP2 x, x) x(, x8* x2 x0 y* y + $y, ?y 0 Xy(* ky1 y . y) y* y2 yx* y+ yP)  z2 )z2 Kz+ _z / pz * z* z(. z. z1 z, {8/ {- ${0 >{H+ J{/ e{H/ ~{p1 {- {. {h0 {1 {* {. |) |`2 6|2 Q|0 l|:P  |P/ |H2 |x- _memcpy |- |, |- |/  }, !}+ 7}/ [}p- n}@, _memchr }@) }* }. }* }/ }1 }(0 }p+  ~h/  ~. 1~NP  E~, X~h2 n~1 ~) _strlen ~2 ~* ~h, (+ P* ,@+ _longjmpQ  @2 Yp/ j2 2 , , 2 1 @*  + / /0 P ) `) v/ - * P+ €+ ݀- h* . #(- 9X1 Mp. c@. vH0 )   + ƁX2 ) 1 . "0 Cp) Z+ qx2 @/ h- + Ђ. 8. - `. "0 42 X+ l+ - p2 . ΃P0 1 , '0 B0, ZH. m1 }h+ -  2 ʄh1 0 1 ) (H1 >/ [/ lX- {. + x, ȅ. ܅/ 1  0- `* .01 <0 Z0 r0 1 - (2 , h. ) 1 +H- @, PX/ lX, * + / ŇP- ܇/ . 8) . 38- E@2 S* b1 v1 () P. * ֈ+ p* / H, /2 A. U* l* X* - 6Q  0 ۉ@0 +  h) 8+ 5/ P* l2 ,  , 2 ֊0 X. P, . ' - 8) F0 Y0) h* 8, + 0 ɋ- ܋0 82  1  1 -1 I- _setjmpP  f0 + x/ 0+ 1 ӌ(/ / , `- (2 C, W* j, 2 + * ʍ/ `+ . `) - 70 G@- c- }P1 80 / iP  ֎x+ `,  - + .) I`0 _memset `X0 y, KO  @^ n Ϗe_h_errno\:U  0Z -` =( \um (b v_ Ґbs =(L ` a X  \e ԑ @ *x >@K dn  He ڒ< e &s '6Z Gdb VXta 8JY ` ̓0TY 8\ `(X@R T hp z @ ʔp"8a k +0<lZ Mal q@Vp @|Y ŕەzV `'aB\l "h `W ՖdX   lh 5l Gd [ g vU  _winmsgTT ӗP etext 6P Mta \Y id vr U   b ˜"^ ՘ Z ^ 0t J0_ Z.k m~ p _procsysmH ϙ n d %nS >\ N2] _ xf 0 Fl Dɚ  h   :j I0`p q(r ț@ ޛ\ 03 @hT Vp o`h j vU ǜT ] `R +=HX c|c s \ Ho НY ޝ 2q n  4p BZe |( \ ŞPڞ8  % Hh bzc b ҟh  @ +VR ? Wtk m }<] o x  ܠ`S *T 9c Hn Ypcx} ɡl ۡr l $*` 4Cnb X _macnum@bm@  ֢ZS H  Y  2 [ oT jk ǣ  (  g 2= ^ S xz` S  "\Ԥh q @W ) U] dDpV 0U m ѥR   e AīuT Xm ¦d\ | _dlls `a 0 AY_ n4` k R ^ ̧^ ݧi  __f_log _optind&40f G[ V {< P L ĨZ ը6r _paddr@trm a U 5X If` W8lm }( ] s ǩq թp [ m , K( ^  hc ^ ŪfҪ6m ` p f x-@p:h J& `>V p (] U *j e \ DJm %4j 4n D [ hd uU ac  a Ϭk h  (d 7Pvn `>o t4 Pn (l ڭx  b # =Q^ d Ph a ܮi 8 'f >| efj ul xS \ ͯd ޯ  [ n "ng Dn S,]|{r Pðn Ұ~p r Xs %80Wa$f ~g r 8 __tzname_gtod α(  @,(l =X[   ۲vs   (@m ; U aZ sh a  x³ p ,@h RO ] |a@r `ҴhܴT^ g .@ <Z Nm ^ x ,c m t ˵` յY  $ >`S jF] w X R ԶvZ \o V   '^ <^ Oh iU }*V PзpX h .=Rp t|  8¸[ Ѹjp  Z Pb $d] 9 P8k aX_ uW h *[ й@b  !08 >m Ni \z[ _mallockn(:d m q ̺a ں`L k )pAVf u@ b h ` ͻg ] < L%@? c bu`b j hPe Y S  t #Zq 2@Nj ]c r 0d ͽ\ ߽pa X &h D`k S T T r ϾXn _strace U |r x0 X*e irc __f_logf {X po i f ֿ :  7X Tjnq {d  ` X x4V  &p 8O[ an;_ttstart|`Y Zl T r P < 0 B cp rS `   k s W  4N\ `qY s `__allocad T _  b P,T @t ]va  q ` bZ S 0d FV aHky_opterr}^ HaLW Bk fo l h 6BW Qn adi $ i Fg Z *X Qb$ ~` P p `yh b $ ___sp_lnyG``Qm chyp  \  yBp * Pe@^ |k Zb P bd _ `  p P ,=pQh  i l X   .:n >K {Tm VW p tp _ ld x ` ,Vf M:Yt o ^m "T   (S o b ,Pl AS Vs mBa }LV   @,h +;`9G [xg T8 _tls_ixs lZ ^ S m )n 9r Lo _cygheap`^lXw\ c  Y  Z  5 J^^ Z] fDvxq  @___argcHpf  W (b 6 _myselfG"m [L |8 i X 4e | c -= Xco pl    L\ PS pV tf : X*o j Xn ] h S  e _macbufc^ H #Fl WsLp W U 8 b hh a )g O _V\ n$ Z 0p p[  )pBpUs$ ~R  ` ؾ vi @dl *bn :~a G [ __f_tanf o0  Y ] g g $a 3 Qg RV  ls j bp"c 3J fY[ W W \ bi W )"c 8dP^ cg H` __ctype_` T 4 `  )W B, ^` m,T { rh  He :+k =X npe Va V $p ___argvf f  ` 0_ BQ]h^ va (g ] 8 `]  $ : Td a^ us PX &_ 2l  l g 4`I\zj j_ {r ] 6Y pP \ k _sigCONTh l ,R @\QNU _t ^Y Jc Ds @"_ ` (  Ar Ul hT W Z   T  D_  3JS g  o _ ` o  h  ^h ) @ Ztp|T `  @@T  $W %[ 6M h \  j \ Y j @x 2X  g  k         k 2 n B _ ] p \[  R  j  _  Dn   _ntod0 *$P @Bf _ j pX Hj pp` g  Pg '  Ia P@  i  |^ "@0@ G e We rt LB\ &d f[ U  a  $ E  ` d n  V   0 e  p  !8! ^!x! ! !b !_ !jW ! "|"Y *"FS :"JT O"$\ _"\ |" ]" _macros`b""X "e "X"8#ln #@?#X Y#8 __sigbeO m#FX #_ #0 #c # #(#8f $] #$<$TT S$, q$ $P$ $&U $d $] $>` $% %8%>[ P% j% %.a %R %S %% %jf &'a/&c<& W&w&`& & &c & &fV  'li 'e 6'nX J' h's'BR '4[ ''4o 'P'd't 'n] '\j  ( #(2(c B(p `(L v(S __f_tan ( ( (`p ( ((h ) )x <)xW)f r))Y ) ) ) ) ) * .* L* l* * * * * * + C+ m+ + + + + , -, M, k, , , , , - D- b- - - - -  . -. L. z. . . . . $/ D/ b/ / / / / 0 00 W0 u0 0 0 0 0 1 71 e1 1 1 1 1  2 )2 O2 m2 2 2 2 2 3 A3 h3 3 3 3 3 4 04 Q4 q4 4 4 4 4 4 5 05 ^5 5 5 5 5 6 "6 H6 f6 6 6 6 6 7 :7 a7 7 7 7 7  8 08 N8 o8 8 8 8 8 8  9 (9 V9 9 9 9 9 9 : @: `: ~: : : : ; ); R; y; ; ; ; ; #< A< b< x< < < < = 7= U= s= = = = = > 7> Y> {> > > > ? 5? T? r? ? ? ? ? $@ N@ p@ @ @ @ @ A .A LA lA A A A A  B GB eB B B B B C 0C VC uC C C C  D +D ID gD D D D D  E /E QE vE E E E  F *F HF fF F F F F $G FG dG G G G G H "H BH dH H H H H I ;I bI I I I I J ,J KJ yJ J J J K K =K cK K K K K L 'L LL uL L L L M M FM dM M M M M "N DN bN N N N N O  O @O bO O O O O P 9P `P P P P P  Q .Q MQ sQ Q Q Q  R *R HR fR R R R R S *S LS nS S S S T (T GT eT T T T T U 'U UU U U U U U V ?V _V }V V V V W (W QW xW W W W W "X @X aX X X X X  Y >Y \Y zY Y Y Y Y Z >Z `Z Z Z Z Z [ <[ [[ y[ [ [ [ \ %\ S\ }\ \ \ \ \ ] =] ]] {] ] ] ] ^ &^ O^ v^ ^ ^ ^ ^  _ >_ __ _ _ _ _ ` <` Z` x` ` ` ` ` a  _ }   ъ    5 U o    ׋   ) C [ q   Ō ߌ   ) A Y w   ɍ    9 S m    ӎ    % > V o   ̏  $ F d    ސ    B d   ّ   = [ y   Ԓ    8 P f    ؓ    4 G m     $ B ` ~  ĕ   $ F h   ݖ  " A _   Ɨ ܗ   4 N f ~   Ҙ    6 N f |   Й    " < T r   ƚ ޚ   ( > \ |   ț      .autoload_text.cygwin_dll_common.gnu_debuglink_RevertToSelf@0_DuplicateTokenEx@24_ImpersonateLoggedOnUser@4_ImpersonateNamedPipeClient@4___assert_func__ZZ13__assert_funcE19__PRETTY_FUNCTION_____assert.ws2_32_info.advapi32_info.dnsapi_info.iphlpapi_info.kernel32_info.mpr_info.netapi32_info.ntdll_info.ole32_info.secur32_info.shell32_info.user32_info.winmm_info_std_dll_init_wsock_init__ZZ10wsock_initE4here__ZZ10wsock_initE19__PRETTY_FUNCTION__.data_cygwin_nocopy.advapi32_autoload_text.dnsapi_autoload_text.iphlpapi_autoload_text.kernel32_autoload_text.mpr_autoload_text.netapi32_autoload_text.ntdll_autoload_text.ole32_autoload_text.secur32_autoload_text.shell32_autoload_text.user32_autoload_text.winmm_autoload_text.ws2_32_autoload_text__ZL7_vwarnxPKcPc_login_tty__ZZ7openptyE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION___getprogname_setprogname__ZZ6logoutE19__PRETTY_FUNCTION_____set_ctype__ZdlPvRKSt9nothrow_t__ZdaPvRKSt9nothrow_t__ZnwjRKSt9nothrow_t__ZnajRKSt9nothrow_t___cxa_pure_virtual___cxa_guard_acquire___cxa_guard_release__cfree@4__ZL15cygheap_protect__csbrk@4__ZZ6_csbrkE19__PRETTY_FUNCTION____ZL8_cmallocj@4__ZN12init_cygheap10close_cttyEv__ZZN12init_cygheap10close_cttyEvE19__PRETTY_FUNCTION____ZN12init_cygheap22init_installation_rootEv__Z12cygheap_initv@0__ZL13cygheap_dummy__Z22cygheap_fixup_in_childb@4_cmalloc@8__ZZL7creturn13cygheap_typesP13cygheap_entryjPKcE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION___cmalloc_abort@8_crealloc@8__ZZL8creallocPvmPKcE19__PRETTY_FUNCTION___crealloc_abort@8__ZZ5cfreeE19__PRETTY_FUNCTION___cfree_and_set@8_ccalloc@12_ccalloc_abort@12_cwcsdup@4_cwcsdup1@4_cstrdup@4_cstrdup1@4__ZN12cygheap_root3setEPKcS1_b__ZN12cygheap_userD2Ev__ZN12cygheap_userD1Ev__ZN12cygheap_user8set_nameEPKc.data_cygwin_nocopy__ZN9cygthread8callfuncEb__ZN9cygthread10simplestubEPv@4__ZN9cygthread4initEv__ZN9cygthread9freerangeEv__ZN9cygthreadnwEj__ZL7threads__ZN9cygthread6createEv__ZZN9cygthread6createEvE19__PRETTY_FUNCTION____ZN9cygthread12async_createEm@4__ZN9cygthread4nameEm__ZN9cygthreadcvPvEv__ZN9cygthread7releaseEb__ZZN9cygthread7releaseEbE19__PRETTY_FUNCTION____ZN9cygthread4stubEPv@4__ZZN9cygthread4stubEPvE19__PRETTY_FUNCTION____ZN9cygthread16terminate_threadEv__ZZN9cygthread16terminate_threadEvE19__PRETTY_FUNCTION____ZN9cygthread6detachEPv__ZZN9cygthread6detachEPvE19__PRETTY_FUNCTION____ZN9cygthread9terminateEv__GLOBAL__I__ZN9cygthread14main_thread_idE.data_cygwin_nocopy__ZL7dll_cmpPKvS0___ZN7_cygtls4initEv__ZN7_cygtls11init_threadEPvPFmS0_S0_E__ZL8nthreads__ZN7_cygtls16fixup_after_forkEv__ZN7_cygtls6removeEm__ZZN7_cygtls6removeEmE19__PRETTY_FUNCTION____ZN7_cygtls5call2EPFmPvS0_ES0_S0___ZN7_cygtls4callEPFmPvS0_ES0___ZN7_cygtls4pushEj__ZN7_cygtls8find_tlsEi__ZZN7_cygtls8find_tlsEiE13threadlist_ix__ZZN7_cygtls8find_tlsEiE19__PRETTY_FUNCTION____ZN7_cygtls11set_siginfoEP9sigpacket.data_cygwin_nocopy__Z15cancelable_waitPvP14_LARGE_INTEGERj_cygxdr_vwarnx__ZL15do_global_dtorsv__ZL7globifyPcRPS_RiS2_@16.clone.10__ZZL7globifyPcRPS_RiS2_E19__PRETTY_FUNCTION____Z8getstackPVc_break_here__ZZ10break_hereE10sent_break__ZZ10break_hereE19__PRETTY_FUNCTION____ZN16child_info_spawn17get_parent_handleEv__ZN16child_info_spawn12handle_spawnEv__ZL4envp__ZL4envc__Z7do_exiti@4__ZZ7do_exitiE19__PRETTY_FUNCTION___cygwin_atexit_cygwin_exit_vapi_fatal_api_fatal__ZN15child_info_fork11handle_forkEv__ZN15child_info_fork20alloc_stack_hard_wayEPVc__ZN15child_info_fork11alloc_stackEv__dll_crt0@0__ZZ9_dll_crt0E14allocationbase_cygwin_dll_init__ZZ15cygwin_dll_initE4envp__ZZ15cygwin_dll_initE6_fmode_dll_crt0__FP11per_process__Z21check_sanity_and_syncP11per_process@4__Z10dll_crt0_1Pv__ZZ10dll_crt0_1PvE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZZL10build_argvPcRPS_RiiE19__PRETTY_FUNCTION____ZZL11insert_filePcRS_E19__PRETTY_FUNCTION____Z23multiple_cygwin_problemPKcjj__ZZ23multiple_cygwin_problemPKcjjE19__PRETTY_FUNCTION____Z23get_cygwin_startup_infov__ZZ23get_cygwin_startup_infovE19__PRETTY_FUNCTION____Z10dll_crt0_0v__ZZ10dll_crt0_0vE19__PRETTY_FUNCTION__.data_cygwin_nocopy__ZL15exists_internalRK6device__ZL6existsRK6device__ZL10exists_ptyRK6device__ZL12exists_ntdevRK6device__ZL19exists_ntdev_silentRK6device.text$_ZN16fhandler_console6existsEv__ZN16fhandler_console6existsEv__ZL14exists_consoleRK6device__ZN6device5parseEPKc__ZN6device4initEv__ZN6device5parseEtt__ZN6device5parseEm__ZN6device9parsediskEii__ZL14readdir_workerP5__DIRP6dirent__ZZL14readdir_workerP5__DIRP6direntE19__PRETTY_FUNCTION__.text$_ZN13cygheap_fdget7releaseEv__ZN13cygheap_fdget7releaseEv.text$_ZN15cygheap_fdmanip7releaseEv__ZN15cygheap_fdmanip7releaseEv.text$_ZN15cygheap_fdmanipD0Ev__ZN15cygheap_fdmanipD0Ev.rdata$_ZTV15cygheap_fdmanip.text$_ZN15cygheap_fdmanipD1Ev__ZN15cygheap_fdmanipD1Ev.text$_ZN13cygheap_fdgetD1Ev__ZN13cygheap_fdgetD1Ev.rdata$_ZTV13cygheap_fdget.text$_ZN13cygheap_fdgetD0Ev__ZN13cygheap_fdgetD0Ev__ZZ5dirfdE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZZ7opendirE19__PRETTY_FUNCTION_____opendir_with_d_ino_fdopendir__ZZN13cygheap_fdgetC1EibbE19__PRETTY_FUNCTION____ZZ7readdirE19__PRETTY_FUNCTION___readdir_r_telldir64_seekdir64_rewinddir_closedir__ZZ8closedirE19__PRETTY_FUNCTION____ZZ5mkdirE19__PRETTY_FUNCTION____ZZ5rmdirE19__PRETTY_FUNCTION____ZL12set_dl_errorPKc@4__ZZ6dlopenE19__PRETTY_FUNCTION____ZZL20get_full_path_of_dllPKcR9path_convE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZZ5dlsymE19__PRETTY_FUNCTION____Z16dll_global_dtorsv__ZL25dll_global_dtors_recorded__ZN10per_module9run_ctorsEv__ZN10per_module9run_dtorsEv__ZN3dll4initEv__ZN8dll_listixEPw__ZN8dll_list15find_by_modnameEPw__ZN8dll_list5allocEP11HINSTANCE__P11per_process8dll_type__ZZN8dll_list5allocEP11HINSTANCE__P11per_process8dll_typeE19__PRETTY_FUNCTION____ZN8dll_list6appendEP3dll__ZN8dll_list13populate_depsEP3dll__ZN8dll_list13topsort_visitEP3dllb__ZN8dll_list7topsortEv__ZN8dll_list4findEPv__ZN8dll_list6detachEPv__ZZN8dll_list6detachEPvE19__PRETTY_FUNCTION____ZN8dll_list4initEv__ZN8dll_list13reserve_spaceEv__ZN8dll_list20load_after_fork_implEPvP3dlli__ZZN8dll_list20load_after_fork_implEPvP3dlliE19__PRETTY_FUNCTION____ZN8dll_list15load_after_forkEPv__ZL18in_load_after_fork__Z13dll_dllcrt0_1Pv_dll_dllcrt0_dll_noncygwin_dllcrt0_cygwin_detach_dll__Z14update_envptrsv@0__GLOBAL__I_dlls.data_cygwin_nocopy__ZL12handle_to_fnPvPc__ZL8DEV_NULL__ZL10DEV_SOCKET__ZL14DEV_NAMED_PIPE__ZL12unknown_file__ZZL12handle_to_fnPvPcE19__PRETTY_FUNCTION____ZL13DEVICE_PREFIX__ZL10DEV_REMOTE__ZL11DEV_REMOTE1__Z14set_std_handlei@4__ZL10std_consts__ZN6dtable6extendEi__ZZN6dtable6extendEiE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____Z11dtable_initv__ZN6dtable14find_archetypeER6device__ZN6dtable13add_archetypeEv__ZN6dtable16delete_archetypeEP13fhandler_base__ZZN6dtable16delete_archetypeEP13fhandler_baseE19__PRETTY_FUNCTION____ZN6dtable18find_unused_handleEi__ZN6dtable7releaseEi__Z11build_fh_pcR9path_conv__ZL12last_tty_dev__ZZ11build_fh_pcR9path_convE19__PRETTY_FUNCTION____ZZL8fh_allocR9path_convE19__PRETTY_FUNCTION____Z12build_fh_devRK6devicePKc__Z13build_fh_namePKcjP11suffix_info__ZZ13build_fh_namePKcjP11suffix_infoE19__PRETTY_FUNCTION____ZN6dtable25init_std_file_from_handleEiPv__ZZN6dtable25init_std_file_from_handleEiPvE19__PRETTY_FUNCTION____ZN6dtable10stdio_initEv__ZZN6dtable10stdio_initEvE19__PRETTY_FUNCTION___cygwin_attach_handle_to_fd__ZN6dtable17get_debugger_infoEv__ZN6dtable10dup_workerEP13fhandler_basei__ZZN6dtable10dup_workerEP13fhandler_baseiE19__PRETTY_FUNCTION____ZN6dtable4dup3Eiii__ZZN6dtable4dup3EiiiE19__PRETTY_FUNCTION____ZN6dtable11select_readEiP12select_stuff__ZZN6dtable11select_readEiP12select_stuffE19__PRETTY_FUNCTION____ZN6dtable12select_writeEiP12select_stuff__ZZN6dtable12select_writeEiP12select_stuffE19__PRETTY_FUNCTION____ZN6dtable13select_exceptEiP12select_stuff__ZZN6dtable13select_exceptEiP12select_stuffE19__PRETTY_FUNCTION____ZN6dtable7move_fdEii__ZN6dtable26set_file_pointers_for_execEv__ZN6dtable11fixup_closeEjP13fhandler_base__ZZN6dtable11fixup_closeEjP13fhandler_baseE19__PRETTY_FUNCTION____ZN6dtable16fixup_after_execEv__ZN6dtable16fixup_after_forkEPv__ZZN6dtable16fixup_after_forkEPvE19__PRETTY_FUNCTION____ZN6dtable17fixup_before_forkEm__ZZN6dtable17fixup_before_forkEmE19__PRETTY_FUNCTION____ZN6dtable17fixup_before_execEm__ZZN6dtable17fixup_before_execEmE19__PRETTY_FUNCTION__.data_cygwin_nocopy__ZL9glob_initPKc__ZL8env_sortPKvS0___ZL8getearlyPKcPi@8__ZL11tty_is_gonePKc__ZL14set_proc_retryPKc__Z17env_path_to_win32PKvPvj__Z17env_path_to_posixPKvPvj__Z18env_plist_to_win32PKvPvj__Z18env_plist_to_posixPKvPvj__ZN7win_envaSERS___ZN7win_envD2Ev__ZN7win_envD1Ev__Z41__static_initialization_and_destruction_0ii.clone.8__ZL12conv_envvars__ZN7win_env9add_cacheEPKcS1___ZZN7win_env9add_cacheEPKcS1_E19__PRETTY_FUNCTION____ZL12findenv_func__getenv_r__Z11getwinenveqPKcji@12__ZZ11getwinenveqPKcjiE19__PRETTY_FUNCTION____ZN5spenv8retrieveEbPKc__ZZN5spenv8retrieveEbPKcE19__PRETTY_FUNCTION___cur_environ@0__ZL10my_findenvPKcPi@8_unsetenv__ZZ8unsetenvE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____Z9getwinenvPKcS0_P7win_env@12__ZL16conv_start_chars__ZZ9getwinenvPKcS0_P7win_envE19__PRETTY_FUNCTION____Z9build_envPKPKcRPwRib@16__ZL6spenvs__ZZ9build_envPKPKcRPwRibE19__PRETTY_FUNCTION____ZL12posify_maybePPcPKcS___ZZL12posify_maybePPcPKcS_E19__PRETTY_FUNCTION____ZL7_addenvPKcS0_i@12__ZL11lastenviron__ZZ6setenvE19__PRETTY_FUNCTION____ZL13parse_optionsPKc@4__ZL5known__ZZL13parse_optionsPKcE19__PRETTY_FUNCTION____ZL15export_settings__ZL6regoptPKwPc@8__Z12environ_initPPci__ZL7idx_arr__ZL8start_at__ZL8renv_arr__ZZ12environ_initPPciE19__PRETTY_FUNCTION____ZZ12environ_initPPciE7cygterm__GLOBAL__I__Z18env_plist_to_posixPKvPvj__GLOBAL__D__Z18env_plist_to_posixPKvPvj.data_cygwin_nocopy__Z23geterrno_from_win_errormi@8__ZL6errmap__ZZ23geterrno_from_win_errormiE19__PRETTY_FUNCTION____Z23seterrno_from_win_errorPKcim@12__ZZ23seterrno_from_win_errorPKcimE19__PRETTY_FUNCTION____Z23geterrno_from_nt_statusli@8__Z23seterrno_from_nt_statusPKcil@12__ZZ23seterrno_from_nt_statusPKcilE19__PRETTY_FUNCTION____Z8seterrnoPKci@8__strerror_r_strerror__ZZ8strerrorE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZL7_verroriiPKcjS0_Pc_strerror_r__ZZ10strerror_rE19__PRETTY_FUNCTION_____xpg_strerror_r_error_at_line__ZZ13error_at_lineE11last_lineno__ZZ13error_at_lineE13last_filename.data_cygwin_nocopy__ZL10rtl_unwindP15_exception_listP17_EXCEPTION_RECORD@8_sig_handle_tty_stop__ZZ19sig_handle_tty_stopE19__PRETTY_FUNCTION____ZL18open_stackdumpfilev__ZZL18open_stackdumpfilevE19__PRETTY_FUNCTION____ZL14ctrl_c_handlerm@4__ZZL14ctrl_c_handlermE9saw_close__ZZL14ctrl_c_handlermE19__PRETTY_FUNCTION____Z20init_console_handlerb__ZZ20init_console_handlerbE19__PRETTY_FUNCTION___error_start_init__ZN10stack_info4initEmbb__ZN10stack_info4walkEv__Z9stackdumpmP8_CONTEXTP17_EXCEPTION_RECORD__ZZ9stackdumpmP8_CONTEXTP17_EXCEPTION_RECORDE14already_dumped__ZL11status_info__ZL8thestack__ZN7_cygtls13inside_kernelEP8_CONTEXT__ZZN7_cygtls13inside_kernelEP8_CONTEXTE19__PRETTY_FUNCTION___cygwin_stackdump_try_to_debug__ZZ12try_to_debugE19__PRETTY_FUNCTION____ZN7_cygtls15interrupt_setupEiPvR9sigaction@16__ZZN7_cygtls15interrupt_setupEiPvR9sigactionE19__PRETTY_FUNCTION____ZN7_cygtls13interrupt_nowEP8_CONTEXTiPvR9sigaction__ZL13setup_handleriPvR9sigactionP7_cygtls__ZZL13setup_handleriPvR9sigactionP7_cygtlsE19__PRETTY_FUNCTION___set_sig_errno@4_set_process_mask_delta__ZL9mask_sync__ZZ22set_process_mask_deltaE19__PRETTY_FUNCTION___set_signal_mask@8__ZZ15set_signal_maskE19__PRETTY_FUNCTION____ZZ6sigsetE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION___sigignore_sigrelse__ZZ8sigrelseE19__PRETTY_FUNCTION____ZZ7sigholdE19__PRETTY_FUNCTION___set_process_mask@4__Z17handle_sigsuspendm@4__ZZ17handle_sigsuspendmE19__PRETTY_FUNCTION____ZN9sigpacket7processEv@4__ZZN9sigpacket7processEvE19__PRETTY_FUNCTION____Z11events_initv__Z16events_terminatev__ZL12exit_already__ZN7_cygtls19call_signal_handlerEv__ZZN7_cygtls19call_signal_handlerEvE19__PRETTY_FUNCTION____ZN7_cygtls12copy_contextEP8_CONTEXT__ZN9exception6handleEP17_EXCEPTION_RECORDP15_exception_listP8_CONTEXTPv__ZZN9exception6handleEP17_EXCEPTION_RECORDP15_exception_listP8_CONTEXTPvE9debugging__ZZN9exception6handleEP17_EXCEPTION_RECORDP15_exception_listP8_CONTEXTPvE8recursed__ZZN9exception6handleEP17_EXCEPTION_RECORDP15_exception_listP8_CONTEXTPvE19__PRETTY_FUNCTION____ZZN3san5leaveEvE19__PRETTY_FUNCTION____ZN7_cygtls15signal_debuggerEi.data_cygwin_nocopy__ZZN13cygheap_fdgetC1EibbE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZZ7fexecveE19__PRETTY_FUNCTION___sexecve_is_bad__ZZ14sexecve_is_badE19__PRETTY_FUNCTION____ZL13fillout_pinfoii__ZL4pids__ZZL13fillout_pinfoiiE2ep__ZZL13fillout_pinfoiiE1i__ZZL13fillout_pinfoiiE20ep_progname_long_buf__ZL13create_winenvPKPKc__Z41__static_initialization_and_destruction_0ii.clone.10_cygwin_internal__ZZ15cygwin_internalE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____GLOBAL__I_cygwin_internal__GLOBAL__D_cygwin_internal.text$_ZN13cygheap_fdnewD1Ev__ZN13cygheap_fdnewD1Ev.rdata$_ZTV13cygheap_fdnew.text$_ZN13cygheap_fdnewD0Ev__ZN13cygheap_fdnewD0Ev__ZZ7fcntl64E19__PRETTY_FUNCTION____ZZN13cygheap_fdgetC1EibbE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZZN13cygheap_fdnewC1EibE19__PRETTY_FUNCTION___feenableexcept__ZL7use_sse_fedisableexcept_fegetexcept_fegetenv_feholdexcept_fesetenv_feupdateenv_feclearexcept_feraiseexcept_fetestexcept_fegetexceptflag_fesetexceptflag_fegetround_fesetround_fegetprec_fesetprec__feinitialise__ZL13fe_nomask_env__ZL10fe_dfl_env.text$_ZNK13fhandler_base13use_archetypeEv__ZNK13fhandler_base13use_archetypeEv.text$_ZN13fhandler_base8get_unitEv__ZN13fhandler_base8get_unitEv.text$_ZN13fhandler_base22fixup_before_fork_execEm__ZN13fhandler_base22fixup_before_fork_execEm.text$_ZNK13fhandler_base17need_fixup_beforeEv__ZNK13fhandler_base17need_fixup_beforeEv.text$_ZN13fhandler_base10open_setupEi__ZN13fhandler_base10open_setupEi.text$_ZN13fhandler_base7cleanupEv__ZN13fhandler_base7cleanupEv.text$_ZN13fhandler_base7ttynameEv__ZN13fhandler_base7ttynameEv.text$_ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6is_ttyEv.text$_ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base6ispipeEv.text$_ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base13get_popen_pidEv.text$_ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base8isdeviceEv.text$_ZNK13fhandler_base6isfifoEv__ZNK13fhandler_base6isfifoEv.text$_ZN13fhandler_base9is_socketEv__ZN13fhandler_base9is_socketEv.text$_ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_consoleEv.text$_ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10is_windowsEv.text$_ZN13fhandler_base10get_handleEv__ZN13fhandler_base10get_handleEv.text$_ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base13get_io_handleEv.text$_ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base17get_output_handleEv.text$_ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base15get_stat_handleEv.text$_ZN13fhandler_base7hit_eofEv__ZN13fhandler_base7hit_eofEv.text$_ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base15get_native_nameEv.text$_ZN13fhandler_base8bg_checkEi__ZN13fhandler_base8bg_checkEi.text$_ZN13fhandler_base7set_eofEv__ZN13fhandler_base7set_eofEv.text$_ZN13fhandler_base14has_ongoing_ioEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base7readdirEP5__DIRP6dirent.text$_ZN13fhandler_base6hcloseEPv__ZN13fhandler_base6hcloseEPv.text$_ZN13fhandler_base8set_nameEPKc__ZN13fhandler_base8set_nameEPKc__ZN13fhandler_base16get_proc_fd_nameEPc__ZN13fhandler_base17set_close_on_execEb__ZZN13fhandler_base17set_close_on_execEbE19__PRETTY_FUNCTION____Z14flush_async_ioPv@4__ZZ14flush_async_ioPvE19__PRETTY_FUNCTION____ZN24fhandler_base_overlapped14has_ongoing_ioEv@4__ZN13fhandler_base6fchownEmm@12__ZN13fhandler_base6fchmodEj@8__ZN13fhandler_base16fixup_after_execEv__ZZN13fhandler_base16fixup_after_execEvE19__PRETTY_FUNCTION____ZN13fhandler_base18set_no_inheritanceERPvb__ZZN13fhandler_base18set_no_inheritanceERPvbE19__PRETTY_FUNCTION____ZN13fhandler_baseD2Ev.rdata$_ZTV13fhandler_base__ZN13fhandler_baseD1Ev.text$_ZN24fhandler_base_overlappedD1Ev__ZN24fhandler_base_overlappedD1Ev.rdata$_ZTV24fhandler_base_overlapped.text$_ZN24fhandler_base_overlappedD0Ev__ZN24fhandler_base_overlappedD0Ev__ZN13fhandler_baseD0Ev__ZN13fhandler_base3dupEPS_i__ZZN13fhandler_base3dupEPS_iE19__PRETTY_FUNCTION____ZN13fhandler_base5closeEv__ZZN13fhandler_base5closeEvE19__PRETTY_FUNCTION____ZN13fhandler_base5fstatEP8__stat64@8__ZN13fhandler_base5writeEPKvj@12__ZZN13fhandler_base5writeEPKvjE19__PRETTY_FUNCTION____ZN13fhandler_base9raw_writeEPKvj@12__ZZN13fhandler_base9raw_writeEPKvjE10off_append__ZZN13fhandler_base9raw_writeEPKvjE11off_current.text$_ZN13fhandler_base5cloneE13cygheap_types__ZN13fhandler_base5cloneE13cygheap_types__ZN13fhandler_base8fstatvfsEP7statvfs@8.text$_ZN24fhandler_base_overlapped5cloneE13cygheap_types__ZN24fhandler_base_overlapped5cloneE13cygheap_types__ZN13fhandler_base9ftruncateExb@16__ZZN13fhandler_base9ftruncateExbE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN13fhandler_base4linkEPKc@8__ZZN13fhandler_base4linkEPKcE19__PRETTY_FUNCTION____ZN13fhandler_base7fadviseExxi@24__ZZN13fhandler_base7fadviseExxiE19__PRETTY_FUNCTION____ZN13fhandler_base9fsetxattrEPKcPKvji@20__ZZN13fhandler_base9fsetxattrEPKcPKvjiE19__PRETTY_FUNCTION____ZN13fhandler_base9fgetxattrEPKcPvj@16__ZZN13fhandler_base9fgetxattrEPKcPvjE19__PRETTY_FUNCTION____ZN13fhandler_base8closedirEP5__DIR__ZZN13fhandler_base8closedirEP5__DIRE19__PRETTY_FUNCTION____ZN13fhandler_base9rewinddirEP5__DIR__ZZN13fhandler_base9rewinddirEP5__DIRE19__PRETTY_FUNCTION____ZN13fhandler_base7seekdirEP5__DIRl__ZZN13fhandler_base7seekdirEP5__DIRlE19__PRETTY_FUNCTION____ZN13fhandler_base7telldirEP5__DIR__ZZN13fhandler_base7telldirEP5__DIRE19__PRETTY_FUNCTION____ZN13fhandler_base7opendirEi__ZZN13fhandler_base7opendirEiE19__PRETTY_FUNCTION____ZN13fhandler_base9ptsname_rEPcj__ZZN13fhandler_base9ptsname_rEPcjE19__PRETTY_FUNCTION____ZN13fhandler_base8tcgetsidEv__ZZN13fhandler_base8tcgetsidEvE19__PRETTY_FUNCTION____ZN13fhandler_base9tcgetpgrpEv__ZZN13fhandler_base9tcgetpgrpEvE19__PRETTY_FUNCTION____ZN13fhandler_base9tcsetpgrpEi__ZZN13fhandler_base9tcsetpgrpEiE19__PRETTY_FUNCTION____ZN13fhandler_base9tcgetattrEP7termios__ZZN13fhandler_base9tcgetattrEP7termiosE19__PRETTY_FUNCTION____ZN13fhandler_base9tcsetattrEiPK7termios__ZZN13fhandler_base9tcsetattrEiPK7termiosE19__PRETTY_FUNCTION____ZN13fhandler_base6tcflowEi__ZZN13fhandler_base6tcflowEiE19__PRETTY_FUNCTION____ZN13fhandler_base7tcdrainEv__ZZN13fhandler_base7tcdrainEvE19__PRETTY_FUNCTION____ZN13fhandler_base11tcsendbreakEi__ZZN13fhandler_base11tcsendbreakEiE19__PRETTY_FUNCTION____ZN13fhandler_base7tcflushEi__ZZN13fhandler_base7tcflushEiE19__PRETTY_FUNCTION____ZN13fhandler_base4lockEiP9__flock64__ZZN13fhandler_base4lockEiP9__flock64E19__PRETTY_FUNCTION____ZN13fhandler_base6pwriteEPvjx@20__ZZN13fhandler_base6pwriteEPvjxE19__PRETTY_FUNCTION____ZN13fhandler_base5preadEPvjx@20__ZZN13fhandler_base5preadEPvjxE19__PRETTY_FUNCTION____ZN13fhandler_base5mkdirEj__ZZN13fhandler_base5mkdirEjE19__PRETTY_FUNCTION____ZN13fhandler_base5rmdirEv__ZZN13fhandler_base5rmdirEvE19__PRETTY_FUNCTION____ZN13fhandler_base7utimensEPK8timespec@8__ZZN13fhandler_base7utimensEPK8timespecE19__PRETTY_FUNCTION____ZN13fhandler_base5fsyncEv@4__ZZN13fhandler_base5fsyncEvE19__PRETTY_FUNCTION____ZN13fhandler_base5readvEPK5iovecii@16__ZZN13fhandler_base5readvEPK5ioveciiE19__PRETTY_FUNCTION__.text$_Z11__set_errnoPKcii__Z11__set_errnoPKcii__ZN13fhandler_base6writevEPK5iovecii@16__ZZN13fhandler_base6writevEPK5ioveciiE19__PRETTY_FUNCTION____ZN13fhandler_base4faclEiiP7__acl32@16__ZZN13fhandler_base4faclEiiP7__acl32E19__PRETTY_FUNCTION____ZN13fhandler_base9fpathconfEi__ZZN13fhandler_base9fpathconfEiE19__PRETTY_FUNCTION__.text$_ZN9path_convlsERKS___ZN9path_convlsERKS___ZN13fhandler_base8set_nameER9path_conv__ZN13fhandler_base5resetEPKS_.text$_ZN13fhandler_base6copytoEPS___ZN13fhandler_base6copytoEPS_.text$_ZN24fhandler_base_overlapped6copytoEP13fhandler_base__ZN24fhandler_base_overlapped6copytoEP13fhandler_base__ZN13fhandler_base13put_readaheadEc__ZN13fhandler_base14puts_readaheadEPKcj__ZN13fhandler_base13get_readaheadEv__ZN13fhandler_base14peek_readaheadEi__ZN13fhandler_base19set_readahead_validEii__ZN13fhandler_base5lseekExi__ZZN13fhandler_base5lseekExiE19__PRETTY_FUNCTION____ZN13fhandler_base13eat_readaheadEi__ZN13fhandler_base25get_readahead_into_bufferEPcj__ZN13fhandler_base4readEPvRj@12__ZZN13fhandler_base4readEPvRjE19__PRETTY_FUNCTION____Z9is_at_eofPv@4__ZN13fhandler_base8raw_readEPvRj@12__ZZN13fhandler_base8raw_readEPvRjE19__PRETTY_FUNCTION____ZN13fhandler_base17get_default_fmodeEi__ZN13fhandler_base9set_flagsEii__ZZN13fhandler_base9set_flagsEiiE19__PRETTY_FUNCTION____ZN13fhandler_base5fcntlEiPv__ZZN13fhandler_base5fcntlEiPvE19__PRETTY_FUNCTION____ZN13fhandler_base4initEPvmj__ZZN13fhandler_base4initEPvmjE19__PRETTY_FUNCTION____ZN13fhandler_base4openEij__ZZN13fhandler_base4openEijE19__PRETTY_FUNCTION____ZN13fhandler_base8fhaccessEib__ZZN13fhandler_base8fhaccessEibE19__PRETTY_FUNCTION____ZN13fhandler_base20device_access_deniedEi__ZN13fhandler_base14open_with_archEij__ZZN13fhandler_base14open_with_archEijE19__PRETTY_FUNCTION____ZN13fhandler_base15close_with_archEv__ZZN13fhandler_base15close_with_archEvE19__PRETTY_FUNCTION____ZN24fhandler_base_overlapped18flush_all_async_ioEv__ZZN24fhandler_base_overlapped18flush_all_async_ioEvE19__PRETTY_FUNCTION____ZN24fhandler_base_overlapped11check_laterEv__ZZN24fhandler_base_overlapped11check_laterEvE19__PRETTY_FUNCTION____ZN13fhandler_baseC2Ev__ZN13fhandler_baseC1Ev__ZN17fhandler_dev_nullC2Ev__ZN17fhandler_dev_nullC1Ev__ZN13fhandler_base10fork_fixupEPvRS0_PKc__ZZN13fhandler_base10fork_fixupEPvRS0_PKcE19__PRETTY_FUNCTION____ZN13fhandler_base16fixup_after_forkEPv__ZZN13fhandler_base16fixup_after_forkEPvE19__PRETTY_FUNCTION____ZN13fhandler_base14is_nonblockingEv__ZN13fhandler_base15set_nonblockingEi__ZN13fhandler_base5ioctlEjPv__ZZN13fhandler_base5ioctlEjPvE19__PRETTY_FUNCTION____ZN24fhandler_base_overlapped16setup_overlappedEv@4__ZN24fhandler_base_overlapped16fixup_after_execEv__ZN24fhandler_base_overlapped16fixup_after_forkEPv__ZN24fhandler_base_overlapped3dupEP13fhandler_basei__ZN24fhandler_base_overlapped18destroy_overlappedEv@4__ZN24fhandler_base_overlapped5closeEv__ZN24fhandler_base_overlapped15wait_overlappedEbbPmbm@24__ZZN24fhandler_base_overlapped15wait_overlappedEbbPmbmE19__PRETTY_FUNCTION____ZN24fhandler_base_overlapped9raw_writeEPKvj@12__ZZN24fhandler_base_overlapped9raw_writeEPKvjE19__PRETTY_FUNCTION____ZN24fhandler_base_overlapped8raw_readEPvRj@12.data_cygwin_nocopy.text$_ZN22fhandler_dev_clipboard10is_windowsEv__ZN22fhandler_dev_clipboard10is_windowsEv__ZN22fhandler_dev_clipboard16fixup_after_execEv.text$_ZN22fhandler_dev_clipboard5cloneE13cygheap_types__ZN22fhandler_dev_clipboard5cloneE13cygheap_types.rdata$_ZTV22fhandler_dev_clipboard.text$_ZN22fhandler_dev_clipboardD1Ev__ZN22fhandler_dev_clipboardD1Ev.text$_ZN22fhandler_dev_clipboardD0Ev__ZN22fhandler_dev_clipboardD0Ev__ZN22fhandler_dev_clipboard5lseekExi__ZN22fhandler_dev_clipboard5closeEv__ZN22fhandler_dev_clipboard4readEPvRj@12__ZL15cygnativeformat__ZN22fhandler_dev_clipboard5fstatEP8__stat64@8__ZN22fhandler_dev_clipboard3dupEP13fhandler_basei__ZZN22fhandler_dev_clipboard3dupEP13fhandler_baseiE19__PRETTY_FUNCTION____ZN22fhandler_dev_clipboard5writeEPKvj@12__ZL13CYGWIN_NATIVE__ZZL13set_clipboardPKvjE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZZN22fhandler_dev_clipboard5writeEPKvjE19__PRETTY_FUNCTION____ZN22fhandler_dev_clipboard4openEij.text$_ZN22fhandler_dev_clipboard6copytoEP13fhandler_base__ZN22fhandler_dev_clipboard6copytoEP13fhandler_base__ZN22fhandler_dev_clipboardC2Ev__ZN22fhandler_dev_clipboardC1Ev.data_cygwin_nocopy.text$_ZN16fhandler_termios12accept_inputEv__ZN16fhandler_termios12accept_inputEv.text$_ZN16fhandler_termios17get_output_handleEv__ZN16fhandler_termios17get_output_handleEv.text$_ZNK16fhandler_termios6is_ttyEv__ZNK16fhandler_termios6is_ttyEv.text$_ZN16fhandler_termios22__acquire_output_mutexEPKcim__ZN16fhandler_termios22__acquire_output_mutexEPKcim.text$_ZN16fhandler_termios22__release_output_mutexEPKci__ZN16fhandler_termios22__release_output_mutexEPKci.text$_ZN16fhandler_console10is_consoleEv__ZN16fhandler_console10is_consoleEv.text$_ZNK16fhandler_console13use_archetypeEv__ZNK16fhandler_console13use_archetypeEv.text$_ZN16fhandler_console6doechoEPKvm__ZN16fhandler_console6doechoEPKvm__ZN16fhandler_console17set_close_on_execEb.text$_ZN16fhandler_console5cloneE13cygheap_types__ZN16fhandler_console5cloneE13cygheap_types.rdata$_ZTV16fhandler_console.text$_ZN16fhandler_consoleD1Ev__ZN16fhandler_consoleD1Ev__ZN16fhandler_console4initEPvmj__ZL4beepv__ZN16fhandler_console9tcgetattrEP7termios__ZZN16fhandler_console9tcgetattrEP7termiosE19__PRETTY_FUNCTION____ZN16fhandler_console7tcflushEi__ZN16fhandler_console10open_setupEi__ZN16fhandler_console3dupEP13fhandler_basei.text$_ZN16fhandler_consoleD0Ev__ZN16fhandler_consoleD0Ev.text$_ZN16fhandler_console6copytoEP13fhandler_base__ZN16fhandler_console6copytoEP13fhandler_base__ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN16fhandler_console19open_shared_consoleEP6HWND__RPvRb__Z12enum_windowsP6HWND__l@8__ZN12console_unitC2EP6HWND____ZN12console_unitC1EP6HWND____ZN16fhandler_console8set_unitEv.text$_ZN16fhandler_console16fixup_after_execEv__ZN16fhandler_console16fixup_after_execEv.text$_ZN16fhandler_console16fixup_after_forkEPv__ZN16fhandler_console16fixup_after_forkEPv__ZN8tty_list9get_cttypEv__ZN16fhandler_console27set_raw_win32_keyboard_modeEb__ZZN16fhandler_console27set_raw_win32_keyboard_modeEbE19__PRETTY_FUNCTION____ZN16fhandler_console16set_cursor_maybeEv__ZN16fhandler_console11mouse_awareER19_MOUSE_EVENT_RECORD__ZN11dev_console11fillin_infoEPv__ZN16fhandler_console5ioctlEjPv__ZZN16fhandler_console5ioctlEjPvE19__PRETTY_FUNCTION____ZN16fhandler_console16send_winch_maybeEv__ZN16fhandler_console16output_tcsetattrEiPK7termios__ZZN16fhandler_console16output_tcsetattrEiPK7termiosE19__PRETTY_FUNCTION____ZN16fhandler_console15input_tcsetattrEiPK7termios__ZZN16fhandler_console15input_tcsetattrEiPK7termiosE19__PRETTY_FUNCTION____ZN16fhandler_console9tcsetattrEiPK7termios__ZN16fhandler_console15set_input_stateEv__ZN11dev_console9set_colorEPv__ZN11dev_console16set_default_attrEv__ZN16fhandler_console4openEij__ZZN16fhandler_console4openEijE19__PRETTY_FUNCTION____ZN16fhandler_console5setupEv__ZN16fhandler_consoleC2E10fh_devices__ZN16fhandler_consoleC1E10fh_devices__ZN16fhandler_console12clear_screenEiiii__ZN16fhandler_console13scroll_screenEiiiiii__ZN16fhandler_console10cursor_setEbii__ZN16fhandler_console10cursor_relEii__ZN16fhandler_console10cursor_getEPiS0___ZN16fhandler_console12char_commandEc__ZZN16fhandler_console12char_commandEcE19__PRETTY_FUNCTION__.text$_ZN16fhandler_console22write_replacement_charEv__ZN16fhandler_console22write_replacement_charEv.rdata$_ZZN16fhandler_console22write_replacement_charEvE16replacement_char__ZN16fhandler_console12write_normalEPKhS1___ZL12__vt100_conv__ZL10base_chars__ZZN16fhandler_console12write_normalEPKhS1_E19__PRETTY_FUNCTION____Z16get_nonascii_keyR13_INPUT_RECORDPc__ZL8keytable__ZN16fhandler_console4readEPvRj@12__ZZN16fhandler_console4readEPvRjE19__PRETTY_FUNCTION____ZN16fhandler_console13igncr_enabledEv__Z17set_console_titlePc@4__ZZ17set_console_titlePcE19__PRETTY_FUNCTION____ZN16fhandler_console5writeEPKvj@12__ZZN16fhandler_console5writeEPKvjE19__PRETTY_FUNCTION____ZN16fhandler_console21fixup_after_fork_execEb__ZN16fhandler_console24create_invisible_consoleEP9HWINSTA____ZZN16fhandler_console24create_invisible_consoleEP9HWINSTA__E19__PRETTY_FUNCTION____ZN16fhandler_console35create_invisible_console_workaroundEv__ZN16fhandler_console12free_consoleEv__ZZN16fhandler_console12free_consoleEvE19__PRETTY_FUNCTION____ZN16fhandler_console5closeEv__ZN16fhandler_console14need_invisibleEv__ZZN16fhandler_console14need_invisibleEvE19__PRETTY_FUNCTION__.data_cygwin_nocopy.text$_ZNK18fhandler_disk_file8isdeviceEv__ZNK18fhandler_disk_file8isdeviceEv.text$_ZN12fhandler_dev5cloneE13cygheap_types__ZN12fhandler_dev5cloneE13cygheap_types.rdata$_ZTV12fhandler_dev.text$_ZN12fhandler_devD1Ev__ZN12fhandler_devD1Ev__ZN12fhandler_dev9rewinddirEP5__DIR__ZN12fhandler_dev7readdirEP5__DIRP6dirent__ZZN12fhandler_dev7readdirEP5__DIRP6direntE19__PRETTY_FUNCTION____ZL10device_cmpPKvS0___ZN12fhandler_dev8fstatvfsEP7statvfs@8__ZN12fhandler_dev5fstatEP8__stat64@8__ZN12fhandler_dev5closeEv.text$_ZN12fhandler_devD0Ev__ZN12fhandler_devD0Ev.text$_ZN12fhandler_dev6copytoEP13fhandler_base__ZN12fhandler_dev6copytoEP13fhandler_base__ZN12fhandler_dev4openEij__ZZN12fhandler_dev4openEijE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN12fhandler_dev7opendirEi__ZZN12fhandler_dev7opendirEiE19__PRETTY_FUNCTION____ZZN13cygheap_fdnewC1EibE19__PRETTY_FUNCTION____ZN12fhandler_devC2Ev__ZN12fhandler_devC1Ev__ZN18fhandler_disk_file7telldirEP5__DIR__ZN17fhandler_cygdrive5closeEv__ZN17fhandler_cygdrive9rewinddirEP5__DIR__ZN17fhandler_cygdrive8closedirEP5__DIR.text$_ZN18fhandler_disk_file5cloneE13cygheap_types__ZN18fhandler_disk_file5cloneE13cygheap_types.rdata$_ZTV18fhandler_disk_file.text$_ZN17fhandler_cygdrive5cloneE13cygheap_types__ZN17fhandler_cygdrive5cloneE13cygheap_types.rdata$_ZTV17fhandler_cygdrive.text$_ZN18fhandler_disk_fileD1Ev__ZN18fhandler_disk_fileD1Ev.text$_ZN18fhandler_disk_fileD0Ev__ZN18fhandler_disk_fileD0Ev.text$_ZN17fhandler_cygdriveD1Ev__ZN17fhandler_cygdriveD1Ev__ZN17fhandler_cygdrive8fstatvfsEP7statvfs@8__ZN17fhandler_cygdrive5fstatEP8__stat64@8__ZN18fhandler_disk_file7seekdirEP5__DIRl__ZL27readdir_check_reparse_pointP18_OBJECT_ATTRIBUTES__ZN18fhandler_disk_file5mkdirEj__ZN18fhandler_disk_file16fixup_after_forkEPv__ZN18fhandler_disk_file3dupEP13fhandler_basei__ZN18fhandler_disk_file5closeEv__ZN18fhandler_disk_file8fstatvfsEP7statvfs@8__ZZN18fhandler_disk_file8fstatvfsEP7statvfsE19__PRETTY_FUNCTION__.text$_ZN17fhandler_cygdriveD0Ev__ZN17fhandler_cygdriveD0Ev__ZN18fhandler_disk_file9rewinddirEP5__DIR__ZN18fhandler_disk_file8closedirEP5__DIR__ZZN18fhandler_disk_file8closedirEP5__DIRE19__PRETTY_FUNCTION__.text$_ZN17fhandler_cygdrive6copytoEP13fhandler_base__ZN17fhandler_cygdrive6copytoEP13fhandler_base__ZN18fhandler_disk_file6fchmodEj@8.text$_ZN18fhandler_disk_file6copytoEP13fhandler_base__ZN18fhandler_disk_file6copytoEP13fhandler_base__ZN18fhandler_disk_file9ftruncateExb@16__ZZN18fhandler_disk_file9ftruncateExbE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN17fhandler_cygdrive4openEij__ZZN17fhandler_cygdrive4openEijE19__PRETTY_FUNCTION____ZN18fhandler_disk_file9fsetxattrEPKcPKvji@20__ZZN18fhandler_disk_file9fsetxattrEPKcPKvjiE19__PRETTY_FUNCTION____ZN18fhandler_disk_file9fgetxattrEPKcPvj@16__ZZN18fhandler_disk_file9fgetxattrEPKcPvjE19__PRETTY_FUNCTION____ZN18fhandler_disk_file7fadviseExxi@24__ZZN18fhandler_disk_file7fadviseExxiE19__PRETTY_FUNCTION____ZN18fhandler_disk_file5rmdirEv__ZZN18fhandler_disk_file5rmdirEvE19__PRETTY_FUNCTION____ZN18fhandler_disk_file4faclEiiP7__acl32@16__ZZN18fhandler_disk_file4faclEiiP7__acl32E19__PRETTY_FUNCTION____ZN18fhandler_disk_file4linkEPKc@8__ZZN18fhandler_disk_file4linkEPKcE19__PRETTY_FUNCTION____ZN18fhandler_disk_file7opendirEi__ZZN18fhandler_disk_file7opendirEiE19__PRETTY_FUNCTION____ZZN13cygheap_fdnewC1EibE19__PRETTY_FUNCTION__.text$RtlEqualUnicodePathSuffix_RtlEqualUnicodePathSuffix@12.text$_ZN12__DIR_mounts8eval_inoEi__ZN12__DIR_mounts8eval_inoEi__ZN13fhandler_base15fstat_by_nfs_eaEP8__stat64@8__ZN13fhandler_base12fstat_helperEP8__stat64m@12__ZZN13fhandler_base12fstat_helperEP8__stat64mE19__PRETTY_FUNCTION____ZN13fhandler_base13fstat_by_nameEP8__stat64@8__ZZN13fhandler_base13fstat_by_nameEP8__stat64E19__PRETTY_FUNCTION____ZN13fhandler_base15fstat_by_handleEP8__stat64@8__ZZN13fhandler_base15fstat_by_handleEP8__stat64E19__PRETTY_FUNCTION____ZN18fhandler_disk_fileC2Ev__ZN18fhandler_disk_fileC1Ev__ZN18fhandler_disk_fileC2ER9path_conv__ZN18fhandler_disk_fileC1ER9path_conv__ZN13fhandler_base7open_fsEij__ZZN13fhandler_base7open_fsEijE19__PRETTY_FUNCTION____ZN18fhandler_disk_file4openEij__ZN18fhandler_disk_file6fchownEmm@12__ZZN18fhandler_disk_file6fchownEmmE19__PRETTY_FUNCTION____ZN13fhandler_base10utimens_fsEPK8timespec__ZZN13fhandler_base10utimens_fsEPK8timespecE19__PRETTY_FUNCTION____ZN18fhandler_disk_file7utimensEPK8timespec@8__ZN13fhandler_base8fstat_fsEP8__stat64@8__ZN18fhandler_disk_file5fstatEP8__stat64@8__ZN18fhandler_disk_file8prw_openEb__ZZN18fhandler_disk_file8prw_openEbE19__PRETTY_FUNCTION____ZN18fhandler_disk_file6pwriteEPvjx@20__ZZN18fhandler_disk_file6pwriteEPvjxE19__PRETTY_FUNCTION____ZN18fhandler_disk_file5preadEPvjx@20__ZZN18fhandler_disk_file5preadEPvjxE19__PRETTY_FUNCTION____Z15readdir_get_inoPKcb@8__ZN17fhandler_cygdrive7readdirEP5__DIRP6dirent__ZZN17fhandler_cygdrive7readdirEP5__DIRP6direntE19__PRETTY_FUNCTION____ZN18fhandler_disk_file14readdir_helperEP5__DIRP6direntmmP15_UNICODE_STRING__ZN18fhandler_disk_file7readdirEP5__DIRP6dirent__ZZN18fhandler_disk_file7readdirEP5__DIRP6direntE19__PRETTY_FUNCTION____ZN17fhandler_cygdriveC2Ev__ZN17fhandler_cygdriveC1Ev__ZN17fhandler_cygdrive10set_drivesEv__ZN17fhandler_cygdrive7opendirEi.text$_ZNK16fhandler_dev_dsp13use_archetypeEv__ZNK16fhandler_dev_dsp13use_archetypeEv.text$_ZN16fhandler_dev_dsp5Audio12convert_noneEPhi__ZN16fhandler_dev_dsp5Audio12convert_noneEPhi__ZN16fhandler_dev_dsp5Audio13convert_U8_S8EPhi__ZN16fhandler_dev_dsp5Audio19convert_S16LE_U16BEEPhi__ZN16fhandler_dev_dsp5Audio19convert_S16LE_U16LEEPhi__ZN16fhandler_dev_dsp5Audio19convert_S16LE_S16BEEPhi__ZN16fhandler_dev_dsp5lseekExi.text$_ZN16fhandler_dev_dsp5cloneE13cygheap_types__ZN16fhandler_dev_dsp5cloneE13cygheap_types.rdata$_ZTV16fhandler_dev_dsp.text$_ZN16fhandler_dev_dspD1Ev__ZN16fhandler_dev_dspD1Ev.text$_ZN16fhandler_dev_dspD0Ev__ZN16fhandler_dev_dspD0Ev__ZN16fhandler_dev_dsp16fixup_after_execEv__ZZN16fhandler_dev_dsp16fixup_after_execEvE19__PRETTY_FUNCTION__.text$_ZN16fhandler_dev_dsp6copytoEP13fhandler_base__ZN16fhandler_dev_dsp6copytoEP13fhandler_base__ZN16fhandler_dev_dsp4openEij__ZZN16fhandler_dev_dsp4openEijE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp5Audio5queueC2Ei__ZN16fhandler_dev_dsp5Audio5queueC1Ei__ZN16fhandler_dev_dsp5Audio5queueD2Ev__ZN16fhandler_dev_dsp5Audio5queueD1Ev__ZN16fhandler_dev_dsp5Audio5queue5resetEv__ZZN16fhandler_dev_dsp5Audio5queue5resetEvE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp5Audio5queue4sendEP11wavehdr_tag__ZZN16fhandler_dev_dsp5Audio5queue4sendEP11wavehdr_tagE19__PRETTY_FUNCTION____ZL16waveOut_callbackP10HWAVEOUT__jmmm@20__ZL15waveIn_callbackP9HWAVEIN__jmmm@20__ZN16fhandler_dev_dsp5Audio5queue4recvEPP11wavehdr_tag__ZN16fhandler_dev_dsp5Audio5queue5queryEv__ZN16fhandler_dev_dsp5AudioC2EPS___ZN16fhandler_dev_dsp5AudioC1EPS___ZN16fhandler_dev_dsp5AudioD2Ev__ZZN16fhandler_dev_dsp5AudioD1EvE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp5AudioD1Ev__ZN16fhandler_dev_dsp5Audio10setconvertEi__ZZN16fhandler_dev_dsp5Audio10setconvertEiE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp5Audio10fillFormatEP13tWAVEFORMATEXiii__ZN16fhandler_dev_dsp5Audio9blockSizeEiii__ZN16fhandler_dev_dsp9Audio_out10fork_fixupEPv__ZZN16fhandler_dev_dsp9Audio_out10fork_fixupEPvE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp9Audio_out5queryEiii__ZZN16fhandler_dev_dsp9Audio_out5queryEiiiE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp9Audio_out4initEj__ZZN16fhandler_dev_dsp9Audio_out4initEjE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp9Audio_out5startEv__ZZN16fhandler_dev_dsp9Audio_out5startEvE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp9Audio_out8buf_infoEP14audio_buf_infoiii__ZN16fhandler_dev_dsp9Audio_out12waitforspaceEv__ZZN16fhandler_dev_dsp9Audio_out12waitforspaceEvE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp9Audio_out14waitforallsentEv__ZZN16fhandler_dev_dsp9Audio_out14waitforallsentEvE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp9Audio_out11sendcurrentEv__ZZN16fhandler_dev_dsp9Audio_out11sendcurrentEvE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp9Audio_out5writeEPKci__ZN16fhandler_dev_dsp9Audio_out4stopEb__ZZN16fhandler_dev_dsp9Audio_out4stopEbE19__PRETTY_FUNCTION____ZZN16fhandler_dev_dsp5Audio5queue7dellockEvE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp9Audio_out8parsewavERPKcRiiii__ZZN16fhandler_dev_dsp9Audio_out8parsewavERPKcRiiiiE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp5writeEPKvj@12__ZZN16fhandler_dev_dsp5writeEPKvjE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp8Audio_in10fork_fixupEPv__ZZN16fhandler_dev_dsp8Audio_in10fork_fixupEPvE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp16fixup_after_forkEPv__ZZN16fhandler_dev_dsp16fixup_after_forkEPvE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp8Audio_in5queryEiii__ZZN16fhandler_dev_dsp8Audio_in5queryEiiiE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp8Audio_in4stopEv__ZZN16fhandler_dev_dsp8Audio_in4stopEvE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp8Audio_in10queueblockEP11wavehdr_tag__ZZN16fhandler_dev_dsp8Audio_in10queueblockEP11wavehdr_tagE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp8Audio_in4initEj__ZZN16fhandler_dev_dsp8Audio_in4initEjE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp8Audio_in5startEiii__ZZN16fhandler_dev_dsp8Audio_in5startEiiiE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp8Audio_in11waitfordataEv__ZZN16fhandler_dev_dsp8Audio_in11waitfordataEvE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp8Audio_in4readEPcRi__ZZN16fhandler_dev_dsp8Audio_in4readEPcRiE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp4readEPvRj@12__ZZN16fhandler_dev_dsp4readEPvRjE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp8Audio_in8buf_infoEP14audio_buf_infoiii__ZN16fhandler_dev_dspC2Ev__ZN16fhandler_dev_dspC1Ev__ZN16fhandler_dev_dsp14close_audio_inEv__ZN16fhandler_dev_dsp15close_audio_outEb__ZN16fhandler_dev_dsp5ioctlEjPv__ZZN16fhandler_dev_dsp5ioctlEjPvE19__PRETTY_FUNCTION____ZN16fhandler_dev_dsp5closeEv__ZZN16fhandler_dev_dsp5closeEvE19__PRETTY_FUNCTION__.text$_ZNK13fhandler_fifo6isfifoEv__ZNK13fhandler_fifo6isfifoEv.text$_ZN13fhandler_fifoD1Ev__ZN13fhandler_fifoD1Ev__ZN13fhandler_fifo17set_close_on_execEb__ZN13fhandler_fifo16fixup_after_forkEPv__ZN13fhandler_fifo3dupEP13fhandler_basei__ZN13fhandler_fifo5closeEv__ZN13fhandler_fifo8fstatvfsEP7statvfs@8.text$_ZN13fhandler_fifoD0Ev__ZN13fhandler_fifoD0Ev.text$_ZN13fhandler_fifo5cloneE13cygheap_types__ZN13fhandler_fifo5cloneE13cygheap_types.rdata$_ZTV13fhandler_fifo.text$_ZN13fhandler_fifo6copytoEP13fhandler_base__ZN13fhandler_fifo6copytoEP13fhandler_base__ZN13fhandler_fifoC2Ev__ZN13fhandler_fifoC1Ev__ZN13fhandler_fifo9fifo_nameEPcPKc__ZN13fhandler_fifo4waitEPv__ZZN13fhandler_fifo4waitEPvE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN13fhandler_fifo8raw_readEPvRj@12__ZZN13fhandler_fifo3armEPvE19__PRETTY_FUNCTION____ZZN13fhandler_fifo8raw_readEPvRjE19__PRETTY_FUNCTION____ZN13fhandler_fifo4openEij__ZZN13fhandler_fifo4openEijE19__PRETTY_FUNCTION__.text$_ZN19fhandler_dev_floppy5cloneE13cygheap_types__ZN19fhandler_dev_floppy5cloneE13cygheap_types.rdata$_ZTV19fhandler_dev_floppy.text$_ZN19fhandler_dev_floppyD1Ev__ZN19fhandler_dev_floppyD1Ev.text$_ZN19fhandler_dev_floppyD0Ev__ZN19fhandler_dev_floppyD0Ev__ZN19fhandler_dev_floppy3dupEP13fhandler_basei__ZN19fhandler_dev_floppy5closeEv.text$_ZN19fhandler_dev_floppy6copytoEP13fhandler_base__ZN19fhandler_dev_floppy6copytoEP13fhandler_base__ZN19fhandler_dev_floppy5lseekExi__ZZN19fhandler_dev_floppy5lseekExiE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN19fhandler_dev_floppyC2Ev__ZN19fhandler_dev_floppyC1Ev__ZN19fhandler_dev_floppy14get_drive_infoEP11hd_geometry__ZZN19fhandler_dev_floppy14get_drive_infoEP11hd_geometryE19__PRETTY_FUNCTION____ZN19fhandler_dev_floppy5ioctlEjPv__ZZN19fhandler_dev_floppy5ioctlEjPvE19__PRETTY_FUNCTION____ZN19fhandler_dev_floppy4openEij__ZZN19fhandler_dev_floppy4openEijE19__PRETTY_FUNCTION____ZN19fhandler_dev_floppy9read_fileEPvmPmPi__ZZN19fhandler_dev_floppy9read_fileEPvmPmPiE19__PRETTY_FUNCTION____ZN19fhandler_dev_floppy8raw_readEPvRj@12__ZZN19fhandler_dev_floppy8raw_readEPvRjE19__PRETTY_FUNCTION____ZN19fhandler_dev_floppy14lock_partitionEm__ZZN19fhandler_dev_floppy14lock_partitionEmE19__PRETTY_FUNCTION____ZN19fhandler_dev_floppy10write_fileEPKvmPmPi__ZZN19fhandler_dev_floppy10write_fileEPKvmPmPiE19__PRETTY_FUNCTION____ZN19fhandler_dev_floppy9raw_writeEPKvj@12__ZZN19fhandler_dev_floppy9raw_writeEPKvjE19__PRETTY_FUNCTION__.text$_ZN17fhandler_mailslotD1Ev__ZN17fhandler_mailslotD1Ev__ZN17fhandler_mailslot5ioctlEjPv__ZZN17fhandler_mailslot5ioctlEjPvE19__PRETTY_FUNCTION____ZN17fhandler_mailslot9raw_writeEPKvj@12__ZN17fhandler_mailslot5fstatEP8__stat64@8__ZZN17fhandler_mailslot5fstatEP8__stat64E19__PRETTY_FUNCTION__.text$_ZN17fhandler_mailslotD0Ev__ZN17fhandler_mailslotD0Ev.text$_ZN17fhandler_mailslot5cloneE13cygheap_types__ZN17fhandler_mailslot5cloneE13cygheap_types.rdata$_ZTV17fhandler_mailslot.text$_ZN17fhandler_mailslot6copytoEP13fhandler_base__ZN17fhandler_mailslot6copytoEP13fhandler_base__ZN17fhandler_mailslotC2Ev__ZN17fhandler_mailslotC1Ev__ZN17fhandler_mailslot15get_object_attrER18_OBJECT_ATTRIBUTESP15_UNICODE_STRINGi__ZN17fhandler_mailslot4openEij__ZZN17fhandler_mailslot4openEijE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION__.text$_ZN16fhandler_dev_mem5cloneE13cygheap_types__ZN16fhandler_dev_mem5cloneE13cygheap_types.rdata$_ZTV16fhandler_dev_mem__ZN16fhandler_dev_mem5fstatEP8__stat64@8__ZN16fhandler_dev_mem5writeEPKvj@12__ZZN16fhandler_dev_mem5writeEPKvjE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN16fhandler_dev_memD2Ev__ZN16fhandler_dev_memD1Ev__ZN16fhandler_dev_memD0Ev.text$_ZN16fhandler_dev_mem6copytoEP13fhandler_base__ZN16fhandler_dev_mem6copytoEP13fhandler_base__ZN16fhandler_dev_mem4readEPvRj@12__ZZN16fhandler_dev_mem4readEPvRjE19__PRETTY_FUNCTION____ZN16fhandler_dev_mem4openEij__ZZN16fhandler_dev_mem4openEijE19__PRETTY_FUNCTION____ZN16fhandler_dev_mem5lseekExi__ZZN16fhandler_dev_mem5lseekExiE19__PRETTY_FUNCTION____ZN16fhandler_dev_memC2Ev__ZN16fhandler_dev_memC1Ev__ZN17fhandler_netdrive7seekdirEP5__DIRl.text$_ZN17fhandler_netdrive5cloneE13cygheap_types__ZN17fhandler_netdrive5cloneE13cygheap_types.rdata$_ZTV17fhandler_netdrive.text$_ZN17fhandler_netdriveD1Ev__ZN17fhandler_netdriveD1Ev.text$_ZN17fhandler_netdriveD0Ev__ZN17fhandler_netdriveD0Ev__ZN17fhandler_netdrive8closedirEP5__DIR__ZN17fhandler_netdrive9rewinddirEP5__DIR__ZL22create_thread_and_waitiPvS_mPKc__ZL15thread_netdrivePv@4__ZN17fhandler_netdrive7readdirEP5__DIRP6dirent__ZZN17fhandler_netdrive7readdirEP5__DIRP6direntE19__PRETTY_FUNCTION____ZN17fhandler_netdrive6existsEv__ZN17fhandler_netdrive5fstatEP8__stat64@8__ZZN17fhandler_netdrive5fstatEP8__stat64E19__PRETTY_FUNCTION__.text$_ZN17fhandler_netdrive6copytoEP13fhandler_base__ZN17fhandler_netdrive6copytoEP13fhandler_base__ZN17fhandler_netdrive4openEij__ZZN17fhandler_netdrive4openEijE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN17fhandler_netdriveC2Ev__ZN17fhandler_netdriveC1Ev.text$_ZN17fhandler_nodeviceD1Ev__ZN17fhandler_nodeviceD1Ev.rdata$_ZTV17fhandler_nodevice.text$_ZN17fhandler_nodeviceD0Ev__ZN17fhandler_nodeviceD0Ev__ZN17fhandler_nodevice4openEij__ZZN17fhandler_nodevice4openEijE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN17fhandler_nodeviceC2Ev__ZN17fhandler_nodeviceC1Ev__ZN13fhandler_proc12fill_filebufEv__ZL8proc_tab.text$_ZN13fhandler_proc5cloneE13cygheap_types__ZN13fhandler_proc5cloneE13cygheap_types.rdata$_ZTV13fhandler_proc.text$_ZN13fhandler_procD1Ev__ZN13fhandler_procD1Ev.text$_ZN13fhandler_procD0Ev__ZN13fhandler_procD0Ev__ZL18format_proc_mountsPvRPc__ZL19format_proc_versionPvRPc__ZL16format_proc_miscPvRPc__ZL23format_proc_filesystemsPvRPc__ZL19format_proc_devicesPvRPc__ZL18format_proc_uptimePvRPc__ZZL18format_proc_uptimePvRPcE19__PRETTY_FUNCTION____ZN13fhandler_proc7readdirEP5__DIRP6dirent__ZZN13fhandler_proc7readdirEP5__DIRP6direntE19__PRETTY_FUNCTION____ZL17format_proc_swapsPvRPc__ZL16format_proc_statPvRPc__ZZL16format_proc_statPvRPcE19__PRETTY_FUNCTION____ZL16format_proc_selfPvRPc__ZL22format_proc_partitionsPvRPc__ZZL22format_proc_partitionsPvRPcE19__PRETTY_FUNCTION____ZL19format_proc_meminfoPvRPc__ZL19format_proc_loadavgPvRPc__ZN13fhandler_proc8closedirEP5__DIR__ZL12proc_tab_cmpPKvS0___ZL19format_proc_cpuinfoPvRPc__ZZL19format_proc_cpuinfoPvRPcE19__PRETTY_FUNCTION__.text$_ZN13fhandler_proc6copytoEP13fhandler_base__ZN13fhandler_proc6copytoEP13fhandler_base__ZN13fhandler_proc7opendirEi__ZN13fhandler_proc4openEij__ZZN13fhandler_proc4openEijE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____Z15virt_tab_searchPKcbPK10virt_tab_tj__ZN13fhandler_proc5fstatEP8__stat64@8__ZZN13fhandler_proc5fstatEP8__stat64E19__PRETTY_FUNCTION____ZN13fhandler_proc6existsEv__ZZN13fhandler_proc6existsEvE19__PRETTY_FUNCTION____ZN13fhandler_proc17get_proc_fhandlerEPKc__ZZN13fhandler_proc17get_proc_fhandlerEPKcE19__PRETTY_FUNCTION____ZN13fhandler_procC2Ev__ZN13fhandler_procC1Ev.text$_ZN16fhandler_process5cloneE13cygheap_types__ZN16fhandler_process5cloneE13cygheap_types.rdata$_ZTV16fhandler_process.text$_ZN16fhandler_processD1Ev__ZN16fhandler_processD1Ev__ZL21format_process_winpidPvRPc__ZL18format_process_uidPvRPc__ZL18format_process_sidPvRPc__ZL19format_process_ppidPvRPc__ZL19format_process_pgidPvRPc__ZL18format_process_gidPvRPc__ZN16fhandler_process7readdirEP5__DIRP6dirent__ZL11process_tab__ZZN16fhandler_process7readdirEP5__DIRP6direntE19__PRETTY_FUNCTION____ZL25format_process_winexenamePvRPc__ZL14get_mem_valuesmPmS_S_S_S_S___ZZL14get_mem_valuesmPmS_S_S_S_S_E19__PRETTY_FUNCTION____ZL20format_process_statmPvRPc__ZL19format_process_rootPvRPc__ZL25format_process_mountstuffPvRPcb__ZL21format_process_mountsPvRPc__ZL24format_process_mountinfoPvRPc__ZL18format_process_cwdPvRPc__ZL19format_process_cttyPvRPc__ZL22format_process_cmdlinePvRPc__ZN16fhandler_process8closedirEP5__DIR__ZN16fhandler_process7opendirEi__ZN16fhandler_process6existsEv__ZZN16fhandler_process6existsEvE19__PRETTY_FUNCTION__.text$_ZN16fhandler_processD0Ev__ZN16fhandler_processD0Ev.text$_ZN16fhandler_process6copytoEP13fhandler_base__ZN16fhandler_process6copytoEP13fhandler_base__ZL22format_process_exenamePvRPc__ZN16fhandler_process12fill_filebufEv__ZZN16fhandler_process12fill_filebufEvE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN16fhandler_process5fstatEP8__stat64@8__ZZN16fhandler_process5fstatEP8__stat64E19__PRETTY_FUNCTION____ZL17format_process_fdPvRPc__ZZL17format_process_fdPvRPcE19__PRETTY_FUNCTION____ZN16fhandler_process4openEij__ZZN16fhandler_process4openEijE19__PRETTY_FUNCTION____ZN16fhandler_processC2Ev__ZN16fhandler_processC1Ev.text$_ZN11thread_infoC1EmPv__ZN11thread_infoC1EmPv__ZZN11thread_infoC1EmPvE19__PRETTY_FUNCTION____ZL19format_process_mapsPvRPc__Z17get_process_statem__ZZ17get_process_statemE19__PRETTY_FUNCTION____ZL21format_process_statusPvRPc_CSWTCH.167__ZL19format_process_statPvRPc__ZZL19format_process_statPvRPcE19__PRETTY_FUNCTION____ZN16fhandler_procnet12fill_filebufEv__ZL11procnet_tab.text$_ZN16fhandler_procnet5cloneE13cygheap_types__ZN16fhandler_procnet5cloneE13cygheap_types.rdata$_ZTV16fhandler_procnet.text$_ZN16fhandler_procnetD1Ev__ZN16fhandler_procnetD1Ev__ZL22format_procnet_ifinet6PvRPc__ZL12dad_to_flags__ZN16fhandler_procnet7readdirEP5__DIRP6dirent__ZZN16fhandler_procnet7readdirEP5__DIRP6direntE19__PRETTY_FUNCTION____ZN16fhandler_procnet6existsEv__ZZN16fhandler_procnet6existsEvE19__PRETTY_FUNCTION__.text$_ZN16fhandler_procnetD0Ev__ZN16fhandler_procnetD0Ev.text$_ZN16fhandler_procnet6copytoEP13fhandler_base__ZN16fhandler_procnet6copytoEP13fhandler_base__ZN16fhandler_procnet5fstatEP8__stat64@8__ZZN16fhandler_procnet5fstatEP8__stat64E19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN16fhandler_procnet4openEij__ZZN16fhandler_procnet4openEijE19__PRETTY_FUNCTION____ZN16fhandler_procnetC2Ev__ZN16fhandler_procnetC1Ev__ZN16fhandler_procsys7telldirEP5__DIR__ZN16fhandler_procsys7seekdirEP5__DIRl__ZN16fhandler_procsys5writeEPKvj@12.text$_ZN16fhandler_procsys5cloneE13cygheap_types__ZN16fhandler_procsys5cloneE13cygheap_types.rdata$_ZTV16fhandler_procsys.text$_ZN16fhandler_procsysD1Ev__ZN16fhandler_procsysD1Ev.text$_ZN16fhandler_procsysD0Ev__ZN16fhandler_procsysD0Ev__ZN16fhandler_procsys5closeEv__ZN16fhandler_procsys4readEPvRj@12__ZN16fhandler_procsys8closedirEP5__DIR__ZN16fhandler_procsys7readdirEP5__DIRP6dirent__ZZN16fhandler_procsys7readdirEP5__DIRP6direntE19__PRETTY_FUNCTION____ZN16fhandler_procsys7opendirEi__ZN16fhandler_procsys12fill_filebufEv.text$_ZN16fhandler_procsys6copytoEP13fhandler_base__ZN16fhandler_procsys6copytoEP13fhandler_base.text$RtlSplitUnicodePath_RtlSplitUnicodePath@12__ZN16fhandler_procsys6existsEP8__stat64__ZZN16fhandler_procsys6existsEP8__stat64E19__PRETTY_FUNCTION____ZN16fhandler_procsys4openEij__ZZN16fhandler_procsys4openEijE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN16fhandler_procsys5fstatEP8__stat64@8__ZZN16fhandler_procsys5fstatEP8__stat64E19__PRETTY_FUNCTION____ZN16fhandler_procsys6existsEv__ZN16fhandler_procsysC2Ev__ZN16fhandler_procsysC1Ev__ZN20fhandler_procsysvipc12fill_filebufEv__ZL15procsysvipc_tab.text$_ZN20fhandler_procsysvipc5cloneE13cygheap_types__ZN20fhandler_procsysvipc5cloneE13cygheap_types.rdata$_ZTV20fhandler_procsysvipc.text$_ZN20fhandler_procsysvipcD1Ev__ZN20fhandler_procsysvipcD1Ev__ZL22format_procsysvipc_shmPvRPc__ZL22format_procsysvipc_semPvRPc__ZL22format_procsysvipc_msgPvRPc__ZN20fhandler_procsysvipc7readdirEP5__DIRP6dirent__ZZN20fhandler_procsysvipc7readdirEP5__DIRP6direntE19__PRETTY_FUNCTION____ZN20fhandler_procsysvipc6existsEv__ZZN20fhandler_procsysvipc6existsEvE19__PRETTY_FUNCTION__.text$_ZN20fhandler_procsysvipcD0Ev__ZN20fhandler_procsysvipcD0Ev.text$_ZN20fhandler_procsysvipc6copytoEP13fhandler_base__ZN20fhandler_procsysvipc6copytoEP13fhandler_base__ZN20fhandler_procsysvipc5fstatEP8__stat64@8__ZZN20fhandler_procsysvipc5fstatEP8__stat64E19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN20fhandler_procsysvipc4openEij__ZZN20fhandler_procsysvipc4openEijE19__PRETTY_FUNCTION____ZN20fhandler_procsysvipcC2Ev__ZN20fhandler_procsysvipcC1Ev__ZN19fhandler_dev_random3dupEP13fhandler_basei.text$_ZN19fhandler_dev_random5cloneE13cygheap_types__ZN19fhandler_dev_random5cloneE13cygheap_types.rdata$_ZTV19fhandler_dev_random.text$_ZN19fhandler_dev_randomD1Ev__ZN19fhandler_dev_randomD1Ev.text$_ZN19fhandler_dev_randomD0Ev__ZN19fhandler_dev_randomD0Ev__ZN19fhandler_dev_random5closeEv__ZN19fhandler_dev_random4openEij.text$_ZN19fhandler_dev_random6copytoEP13fhandler_base__ZN19fhandler_dev_random6copytoEP13fhandler_base__ZN19fhandler_dev_random5lseekExi__ZZN19fhandler_dev_random5lseekExiE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN19fhandler_dev_randomC2Ev__ZN19fhandler_dev_randomC1Ev__ZN19fhandler_dev_random16crypt_gen_randomEPvj__ZZN19fhandler_dev_random16crypt_gen_randomEPvjE19__PRETTY_FUNCTION____ZN19fhandler_dev_random5writeEPKvj@12__ZZN19fhandler_dev_random5writeEPKvjE19__PRETTY_FUNCTION____ZN19fhandler_dev_random4readEPvRj@12__ZZN19fhandler_dev_random4readEPvRjE19__PRETTY_FUNCTION____ZN19fhandler_dev_random12pseudo_writeEPKvj__ZN19fhandler_dev_random11pseudo_readEPvj__ZN16fhandler_dev_raw16fixup_after_forkEPv.text$_ZN16fhandler_dev_raw5cloneE13cygheap_types__ZN16fhandler_dev_raw5cloneE13cygheap_types.rdata$_ZTV16fhandler_dev_raw__ZN16fhandler_dev_raw16fixup_after_execEv__ZN16fhandler_dev_raw5ioctlEjPv__ZN16fhandler_dev_raw3dupEP13fhandler_basei__ZN16fhandler_dev_raw4openEij__ZZN16fhandler_dev_raw4openEijE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN16fhandler_dev_raw5fstatEP8__stat64@8__ZZN16fhandler_dev_raw5fstatEP8__stat64E19__PRETTY_FUNCTION____ZN16fhandler_dev_rawD2Ev__ZN16fhandler_dev_rawD1Ev__ZN16fhandler_dev_rawD0Ev.text$_ZN16fhandler_dev_raw6copytoEP13fhandler_base__ZN16fhandler_dev_raw6copytoEP13fhandler_base__ZN16fhandler_dev_rawC2Ev__ZN16fhandler_dev_rawC1Ev__ZN17fhandler_registry7telldirEP5__DIR__ZN17fhandler_registry7seekdirEP5__DIRl.text$_ZN17fhandler_registry5cloneE13cygheap_types__ZN17fhandler_registry5cloneE13cygheap_types.rdata$_ZTV17fhandler_registry.text$_ZN17fhandler_registryD1Ev__ZN17fhandler_registryD1Ev__ZN17fhandler_registry3dupEP13fhandler_basei__ZZN17fhandler_registry3dupEP13fhandler_baseiE19__PRETTY_FUNCTION____ZL14multi_wcstombsPcjPKwj__ZN17fhandler_registry5closeEv__ZL10fetch_hkeyi__ZL13registry_keys__ZL14decode_regnamePwPKci__ZN17fhandler_registry9rewinddirEP5__DIR__ZN17fhandler_registry8closedirEP5__DIR__ZZN17fhandler_registry8closedirEP5__DIRE19__PRETTY_FUNCTION____ZN17fhandler_registry7opendirEi__ZN17fhandler_registry8set_nameER9path_conv.text$_ZN17fhandler_registryD0Ev__ZN17fhandler_registryD0Ev.text$_ZN17fhandler_registry6copytoEP13fhandler_base__ZN17fhandler_registry6copytoEP13fhandler_base__ZL8open_keyPKcmmb__ZZL8open_keyPKcmmbE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZL16registry_listing__ZN17fhandler_registry5fstatEP8__stat64@8__ZZN17fhandler_registry5fstatEP8__stat64E19__PRETTY_FUNCTION____ZN17fhandler_registry6existsEv__ZZN17fhandler_registry6existsEvE19__PRETTY_FUNCTION____ZL15perf_data_files__ZN17fhandler_registry7readdirEP5__DIRP6dirent__ZZN17fhandler_registry7readdirEP5__DIRP6direntE19__PRETTY_FUNCTION____ZL17special_dot_files__ZN17fhandler_registry12fill_filebufEv__ZZN17fhandler_registry12fill_filebufEvE19__PRETTY_FUNCTION____ZN17fhandler_registry4openEij__ZZN17fhandler_registry4openEijE19__PRETTY_FUNCTION____ZN17fhandler_registryC2Ev__ZN17fhandler_registryC1Ev.text$_ZN15fhandler_serial5lseekExi__ZN15fhandler_serial5lseekExi.text$_ZNK15fhandler_serial6is_ttyEv__ZNK15fhandler_serial6is_ttyEv.text$_ZN15fhandler_serial9tcgetpgrpEv__ZN15fhandler_serial9tcgetpgrpEv.text$_ZN15fhandler_serial9tcsetpgrpEi__ZN15fhandler_serial9tcsetpgrpEi__ZN15fhandler_serial4initEPvmj.text$_ZN15fhandler_serial5cloneE13cygheap_types__ZN15fhandler_serial5cloneE13cygheap_types.rdata$_ZTV15fhandler_serial.text$_ZN15fhandler_serialD1Ev__ZN15fhandler_serialD1Ev.text$_ZN15fhandler_serialD0Ev__ZN15fhandler_serialD0Ev__ZN15fhandler_serial6tcflowEi__ZZN15fhandler_serial6tcflowEiE19__PRETTY_FUNCTION____ZN15fhandler_serial11tcsendbreakEi__ZZN15fhandler_serial11tcsendbreakEiE19__PRETTY_FUNCTION____ZN15fhandler_serial5closeEv__ZN15fhandler_serial9raw_writeEPKvj@12__ZZN15fhandler_serial9raw_writeEPKvjE19__PRETTY_FUNCTION____ZN15fhandler_serial7tcdrainEv.text$_ZN15fhandler_serial6copytoEP13fhandler_base__ZN15fhandler_serial6copytoEP13fhandler_base__ZN15fhandler_serial7tcflushEi__ZZN15fhandler_serial7tcflushEiE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN15fhandler_serial9tcsetattrEiPK7termios__ZZN15fhandler_serial9tcsetattrEiPK7termiosE19__PRETTY_FUNCTION____ZN15fhandler_serial9tcgetattrEP7termios__ZZN15fhandler_serial9tcgetattrEP7termiosE19__PRETTY_FUNCTION____ZN15fhandler_serial8raw_readEPvRj@12__ZZN15fhandler_serial8raw_readEPvRjE19__PRETTY_FUNCTION____ZN15fhandler_serialC2Ev__ZN15fhandler_serialC1Ev__ZN15fhandler_serial16overlapped_setupEv__ZN15fhandler_serial3dupEP13fhandler_basei__ZN15fhandler_serial16fixup_after_execEv__ZZN15fhandler_serial16fixup_after_execEvE19__PRETTY_FUNCTION____ZN15fhandler_serial16fixup_after_forkEPv__ZZN15fhandler_serial16fixup_after_forkEPvE19__PRETTY_FUNCTION____ZN15fhandler_serial4openEij__ZZN15fhandler_serial4openEijE19__PRETTY_FUNCTION____ZN15fhandler_serial18switch_modem_linesEii__ZN15fhandler_serial5ioctlEjPv__ZZN15fhandler_serial5ioctlEjPvE19__PRETTY_FUNCTION__.text$_ZNK15fhandler_socket17need_fixup_beforeEv__ZNK15fhandler_socket17need_fixup_beforeEv.text$_ZN15fhandler_socket9is_socketEv__ZN15fhandler_socket9is_socketEv.text$_ZN15fhandler_socket5lseekExi__ZN15fhandler_socket5lseekExi.text$_ZN15fhandler_socket6hcloseEPv__ZN15fhandler_socket6hcloseEPv__ZN15fhandler_socket16fixup_after_execEv.text$_ZN15fhandler_socket5cloneE13cygheap_types__ZN15fhandler_socket5cloneE13cygheap_types.rdata$_ZTV15fhandler_socket__ZN15fhandler_socket17set_close_on_execEb__ZZN15fhandler_socket17set_close_on_execEbE19__PRETTY_FUNCTION____ZN15fhandler_socket5fcntlEiPv__ZZN15fhandler_socket5fcntlEiPvE19__PRETTY_FUNCTION____ZN15fhandler_socket16get_proc_fd_nameEPc__ZN15fhandler_socketD2Ev__ZN15fhandler_socketD1Ev__ZN15fhandler_socketD0Ev__ZN15fhandler_socket4linkEPKc@8__ZN15fhandler_socket5fstatEP8__stat64@8__ZN15fhandler_socket16fixup_after_forkEPv__ZZN15fhandler_socket16fixup_after_forkEPvE19__PRETTY_FUNCTION____ZZN15fhandler_socket16fixup_after_forkEPvE12__FUNCTION____ZN15fhandler_socket22fixup_before_fork_execEm__ZZN15fhandler_socket22fixup_before_fork_execEmE19__PRETTY_FUNCTION____ZZN15fhandler_socket22fixup_before_fork_execEmE12__FUNCTION____ZL21search_wsa_event_slotl__ZL12wsa_slot_mtx__ZL10wsa_events__ZZL21search_wsa_event_slotlE19__PRETTY_FUNCTION__.text$_ZN15fhandler_socket6copytoEP13fhandler_base__ZN15fhandler_socket6copytoEP13fhandler_base__ZN15fhandler_socket4openEij__ZZN15fhandler_socket4openEijE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN15fhandler_socket6fchmodEj@8__ZZN15fhandler_socket6fchmodEjE19__PRETTY_FUNCTION____ZN15fhandler_socket4faclEiiP7__acl32@16__ZZN15fhandler_socket4faclEiiP7__acl32E19__PRETTY_FUNCTION____ZN15fhandler_socket6fchownEmm@12__ZZN15fhandler_socket6fchownEmmE19__PRETTY_FUNCTION____ZN15fhandler_socket8fstatvfsEP7statvfs@8__ZZN15fhandler_socket8fstatvfsEP7statvfsE19__PRETTY_FUNCTION____ZN15fhandler_socket5ioctlEjPv__ZZN15fhandler_socket5ioctlEjPvE19__PRETTY_FUNCTION____ZZN15fhandler_socket5ioctlEjPvE12__FUNCTION____Z13get_inet_addrPK8sockaddriP16sockaddr_storagePiS4_S4___ZZ13get_inet_addrPK8sockaddriP16sockaddr_storagePiS4_S4_E19__PRETTY_FUNCTION____ZN15fhandler_socketC2Ev__ZN15fhandler_socketC1Ev__ZN15fhandler_socket26af_local_set_sockpair_credEv__ZN15fhandler_socket20af_local_setblockingERbS0___ZN15fhandler_socket22af_local_unsetblockingEbb__ZN15fhandler_socket17af_local_set_credEv__ZN15fhandler_socket13af_local_copyEPS___ZN15fhandler_socket19af_local_set_secretEPc__ZN15fhandler_socket11init_eventsEv__ZL20socket_serial_number__ZZN15fhandler_socket11init_eventsEvE12__FUNCTION____ZZN15fhandler_socket11init_eventsEvE19__PRETTY_FUNCTION____ZN15fhandler_socket15evaluate_eventsElRlb__ZN15fhandler_socket15wait_for_eventsElm__ZN15fhandler_socket5readvEPK5iovecii@16__ZZN15fhandler_socket13recv_internalEP7_WSAMSGE12__FUNCTION____ZN15fhandler_socket4readEPvRj@12__ZN15fhandler_socket6writevEPK5iovecii@16__ZZN15fhandler_socket13send_internalEP7_WSAMSGiE12__FUNCTION____ZZN15fhandler_socket13send_internalEP7_WSAMSGiE19__PRETTY_FUNCTION____ZN15fhandler_socket5writeEPKvj@12__ZN15fhandler_socket14release_eventsEv__ZN15fhandler_socket5closeEv__ZZN15fhandler_socket5closeEvE19__PRETTY_FUNCTION____ZZN15fhandler_socket5closeEvE12__FUNCTION____ZN15fhandler_socket17init_fixup_beforeEv__ZN15fhandler_socket6listenEi__ZZN15fhandler_socket6listenEiE12__FUNCTION____ZN15fhandler_socket11getsocknameEP8sockaddrPi__ZZN15fhandler_socket11getsocknameEP8sockaddrPiE12__FUNCTION____ZN15fhandler_socket11getpeernameEP8sockaddrPi__ZZN15fhandler_socket11getpeernameEP8sockaddrPiE12__FUNCTION____ZN15fhandler_socket8recvfromEPvjiP8sockaddrPi__ZN15fhandler_socket18af_local_recv_credEv__ZZN15fhandler_socket18af_local_recv_credEvE19__PRETTY_FUNCTION____ZN15fhandler_socket20af_local_recv_secretEv__ZZN15fhandler_socket20af_local_recv_secretEvE19__PRETTY_FUNCTION____ZN15fhandler_socket7recvmsgEP6msghdri.data_cygwin_nocopy__ZN15fhandler_socket6sendtoEPKvjiPK8sockaddri__ZN15fhandler_socket18af_local_send_credEv__ZZN15fhandler_socket18af_local_send_credEvE19__PRETTY_FUNCTION____ZN15fhandler_socket20af_local_send_secretEv__ZZN15fhandler_socket20af_local_send_secretEvE19__PRETTY_FUNCTION____ZN15fhandler_socket15af_local_acceptEv__ZZN15fhandler_socket15af_local_acceptEvE19__PRETTY_FUNCTION____ZN15fhandler_socket16af_local_connectEv__ZZN15fhandler_socket16af_local_connectEvE19__PRETTY_FUNCTION____ZN15fhandler_socket7sendmsgEPK6msghdri__ZN15fhandler_socket8shutdownEi__ZZN15fhandler_socket8shutdownEiE12__FUNCTION____ZN15fhandler_socket12set_sun_pathEPKc__ZN15fhandler_socket4bindEPK8sockaddri__ZZN15fhandler_socket4bindEPK8sockaddriE19__PRETTY_FUNCTION____ZZN15fhandler_socket4bindEPK8sockaddriE12__FUNCTION____ZN15fhandler_socket17set_peer_sun_pathEPKc__ZN15fhandler_socket7accept4EP8sockaddrPii__ZZN15fhandler_socket7accept4EP8sockaddrPiiE12__FUNCTION____ZZN15fhandler_socket7accept4EP8sockaddrPiiE19__PRETTY_FUNCTION____ZZN13cygheap_fdnewC1EibE19__PRETTY_FUNCTION____ZZN15fhandler_socket7accept4EP8sockaddrPiiE2un__ZN15fhandler_socket7connectEPK8sockaddri__ZZN15fhandler_socket7connectEPK8sockaddriE12__FUNCTION____ZN15fhandler_socket3dupEP13fhandler_basei__ZZN15fhandler_socket3dupEP13fhandler_baseiE19__PRETTY_FUNCTION____ZN15fhandler_socket10getpeereidEPiPmS1___ZZN15fhandler_socket10getpeereidEPiPmS1_E19__PRETTY_FUNCTION__.cygwin_dll_common.text$_ZN17fhandler_dev_tape5cloneE13cygheap_types__ZN17fhandler_dev_tape5cloneE13cygheap_types.rdata$_ZTV17fhandler_dev_tape.text$_ZN17fhandler_dev_tapeD1Ev__ZN17fhandler_dev_tapeD1Ev.text$_ZN17fhandler_dev_tapeD0Ev__ZN17fhandler_dev_tapeD0Ev__ZN17fhandler_dev_tape17set_close_on_execEb__ZN17fhandler_dev_tape16fixup_after_forkEPv.text$_ZN17fhandler_dev_tape6copytoEP13fhandler_base__ZN17fhandler_dev_tape6copytoEP13fhandler_base__ZN17fhandler_dev_tape5fstatEP8__stat64@8__ZZN17fhandler_dev_tape5fstatEP8__stat64E19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN17fhandler_dev_tape3dupEP13fhandler_basei__ZZN17fhandler_dev_tape5_lockEbE19__PRETTY_FUNCTION____ZZN17fhandler_dev_tape3dupEP13fhandler_baseiE19__PRETTY_FUNCTION____ZN17fhandler_dev_tape5lseekExi__ZZN17fhandler_dev_tape5lseekExiE19__PRETTY_FUNCTION____ZN11mtinfo_part10initializeEl__ZN12mtinfo_drive10initializeEib__ZN12mtinfo_drive6get_dpEPv__ZZN12mtinfo_drive5errorEPKcE19__PRETTY_FUNCTION____ZN12mtinfo_drive6get_mpEPv__ZN12mtinfo_drive10async_waitEPvPm__ZN12mtinfo_drive7get_posEPvPlS1___ZN12mtinfo_drive8_set_posEPvilii__ZN12mtinfo_drive7set_posEPvilb__ZN12mtinfo_drive4openEPv__ZZN12mtinfo_drive4openEPvE19__PRETTY_FUNCTION____ZN17fhandler_dev_tape4openEij__ZZN17fhandler_dev_tape4openEijE19__PRETTY_FUNCTION____ZN12mtinfo_drive17create_partitionsEPvl__ZZN12mtinfo_drive17create_partitionsEPvlE19__PRETTY_FUNCTION____ZN12mtinfo_drive13set_partitionEPvl__ZN12mtinfo_drive11write_marksEPvim__ZN12mtinfo_drive5eraseEPvi__ZN12mtinfo_drive7prepareEPvib__ZN12mtinfo_drive5writeEPvS0_PKvRj__ZN17fhandler_dev_tape9raw_writeEPKvj@12__ZZN17fhandler_dev_tape9raw_writeEPKvjE19__PRETTY_FUNCTION____ZN12mtinfo_drive4readEPvS0_S0_Rj__ZN17fhandler_dev_tape8raw_readEPvRj@12__ZZN17fhandler_dev_tape8raw_readEPvRjE19__PRETTY_FUNCTION____ZN12mtinfo_drive5closeEPvb__ZZN12mtinfo_drive5closeEPvbE19__PRETTY_FUNCTION____ZN17fhandler_dev_tape5closeEv__ZN12mtinfo_drive15set_compressionEPvl__ZN12mtinfo_drive13set_blocksizeEPvl__ZN12mtinfo_drive10get_statusEPvP5mtget__ZN12mtinfo_drive11set_optionsEPvl__ZN12mtinfo_drive5ioctlEPvjS0___ZZN12mtinfo_drive5ioctlEPvjS0_E19__PRETTY_FUNCTION____ZN17fhandler_dev_tape5ioctlEjPv__ZN6mtinfo10initializeEv__ZN17fhandler_dev_tapeC2Ev__ZZN17fhandler_dev_tapeC1EvE19__PRETTY_FUNCTION____ZN17fhandler_dev_tapeC1Ev.text$_ZN16fhandler_termios6doechoEPKvm__ZN16fhandler_termios6doechoEPKvm.text$_ZN16fhandler_termios5cloneE13cygheap_types__ZN16fhandler_termios5cloneE13cygheap_types.rdata$_ZTV16fhandler_termios.text$_ZN16fhandler_termiosD1Ev__ZN16fhandler_termiosD1Ev.text$_ZN16fhandler_termiosD0Ev__ZN16fhandler_termiosD0Ev.text$_ZN16fhandler_termios6copytoEP13fhandler_base__ZN16fhandler_termios6copytoEP13fhandler_base__ZN16fhandler_termios5lseekExi__ZZN16fhandler_termios5lseekExiE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN16fhandler_termios8tcgetsidEv__ZZN16fhandler_termios8tcgetsidEvE19__PRETTY_FUNCTION____ZN16fhandler_termios9tcgetpgrpEv__ZZN16fhandler_termios9tcgetpgrpEvE19__PRETTY_FUNCTION____ZN16fhandler_termios6tcinitEb__ZN19fhandler_pty_master9tcgetpgrpEv__ZN7tty_min9kill_pgrpEi__ZN16fhandler_termios9tcsetpgrpEi__ZZN16fhandler_termios9tcsetpgrpEiE19__PRETTY_FUNCTION____ZN7tty_min25is_orphaned_process_groupEi__ZZN7tty_min25is_orphaned_process_groupEiE19__PRETTY_FUNCTION____ZN16fhandler_termios8bg_checkEi__ZZN16fhandler_termios8bg_checkEiE19__PRETTY_FUNCTION____ZN16fhandler_termios9line_editEPKciR7termios__ZZN16fhandler_termios9line_editEPKciR7termiosE19__PRETTY_FUNCTION____ZN16fhandler_termios8sigflushEv__ZN16fhandler_termios5ioctlEiPv__ZZN16fhandler_termios5ioctlEiPvE19__PRETTY_FUNCTION__.text$_ZNK19fhandler_pty_common13use_archetypeEv__ZNK19fhandler_pty_common13use_archetypeEv.text$_ZN18fhandler_pty_slave7ttynameEv__ZN18fhandler_pty_slave7ttynameEv__ZN18fhandler_pty_slave8get_unitEv__ZN18fhandler_pty_slave9tcgetattrEP7termios__ZN18fhandler_pty_slave9tcsetattrEiPK7termios__ZZN18fhandler_pty_slave9tcsetattrEiPK7termiosE19__PRETTY_FUNCTION____ZN19fhandler_pty_master9tcgetattrEP7termios__ZN19fhandler_pty_master9tcsetattrEiPK7termios__ZN19fhandler_pty_common17set_close_on_execEb__ZN18fhandler_pty_slave16fixup_after_execEv__ZN19fhandler_pty_master16fixup_after_execEv.text$_ZN19fhandler_pty_common5cloneE13cygheap_types__ZN19fhandler_pty_common5cloneE13cygheap_types.rdata$_ZTV19fhandler_pty_common.text$_ZN18fhandler_pty_slave5cloneE13cygheap_types__ZN18fhandler_pty_slave5cloneE13cygheap_types.rdata$_ZTV18fhandler_pty_slave.text$_ZN19fhandler_pty_master5cloneE13cygheap_types__ZN19fhandler_pty_master5cloneE13cygheap_types.rdata$_ZTV19fhandler_pty_master.text$_ZN19fhandler_pty_commonD1Ev__ZN19fhandler_pty_commonD1Ev__ZN18fhandler_pty_slave16fixup_after_forkEPv__ZZN18fhandler_pty_slave16fixup_after_forkEPvE19__PRETTY_FUNCTION____ZN19fhandler_pty_master7cleanupEv__ZZN19fhandler_pty_master7cleanupEvE19__PRETTY_FUNCTION____ZN19fhandler_pty_common5closeEv__ZZN19fhandler_pty_common5closeEvE19__PRETTY_FUNCTION____ZN18fhandler_pty_slave7tcflushEi__ZZN18fhandler_pty_slave7tcflushEiE19__PRETTY_FUNCTION____ZN19fhandler_pty_master3dupEP13fhandler_basei__ZZN19fhandler_pty_master3dupEP13fhandler_baseiE19__PRETTY_FUNCTION____ZN18fhandler_pty_slave7cleanupEv__ZZN18fhandler_pty_slave7cleanupEvE19__PRETTY_FUNCTION____ZN19fhandler_pty_master16fixup_after_forkEPv__ZZN19fhandler_pty_master16fixup_after_forkEPvE19__PRETTY_FUNCTION____ZN19fhandler_pty_master6doechoEPKvm__ZZN19fhandler_pty_master6doechoEPKvmE19__PRETTY_FUNCTION____ZN19fhandler_pty_master5writeEPKvj@12__ZN19fhandler_pty_masterD2Ev__ZN19fhandler_pty_masterD1Ev__ZN19fhandler_pty_masterD0Ev__ZN19fhandler_pty_master10open_setupEi__ZZN19fhandler_pty_master10open_setupEiE19__PRETTY_FUNCTION____ZN18fhandler_pty_slave5fstatEP8__stat64@8__ZN18fhandler_pty_slave3dupEP13fhandler_basei__ZZN18fhandler_pty_slave3dupEP13fhandler_baseiE19__PRETTY_FUNCTION____ZN18fhandler_pty_slave10open_setupEi__ZZN18fhandler_pty_slave10open_setupEiE19__PRETTY_FUNCTION____ZN19fhandler_pty_common22__release_output_mutexEPKci__ZN18fhandler_pty_slave5closeEv__ZZN18fhandler_pty_slave5closeEvE19__PRETTY_FUNCTION____ZN19fhandler_pty_common22__acquire_output_mutexEPKcim__ZN19fhandler_pty_master7hit_eofEv__ZZN19fhandler_pty_master7hit_eofEvE19__PRETTY_FUNCTION____ZN19fhandler_pty_master12accept_inputEv__ZZN19fhandler_pty_master12accept_inputEvE19__PRETTY_FUNCTION__.text$_ZN19fhandler_pty_commonD0Ev__ZN19fhandler_pty_commonD0Ev.text$_ZN18fhandler_pty_slaveD1Ev__ZN18fhandler_pty_slaveD1Ev.text$_ZN18fhandler_pty_slaveD0Ev__ZN18fhandler_pty_slaveD0Ev__ZN19fhandler_pty_master4openEij__ZN18fhandler_pty_slave4initEPvmj__ZZN18fhandler_pty_slave4initEPvmjE19__PRETTY_FUNCTION____ZN19fhandler_pty_master5closeEv__ZZN19fhandler_pty_master5closeEvE19__PRETTY_FUNCTION__.text$_ZN19fhandler_pty_common6copytoEP13fhandler_base__ZN19fhandler_pty_common6copytoEP13fhandler_base__ZN19fhandler_pty_common5lseekExi__ZZN19fhandler_pty_common5lseekExiE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN19fhandler_pty_master9ptsname_rEPcj__ZZN19fhandler_pty_master9ptsname_rEPcjE19__PRETTY_FUNCTION____ZN18fhandler_pty_slave5writeEPKvj@12__ZZN18fhandler_pty_slave5writeEPKvjE19__PRETTY_FUNCTION__.text$_ZN18fhandler_pty_slave6copytoEP13fhandler_base__ZN18fhandler_pty_slave6copytoEP13fhandler_base.text$_ZN19fhandler_pty_master6copytoEP13fhandler_base__ZN19fhandler_pty_master6copytoEP13fhandler_base__ZN18fhandler_pty_slave4openEij__ZZN18fhandler_pty_slave4openEijE19__PRETTY_FUNCTION____Z15bytes_availableRmPv__ZZ15bytes_availableRmPvE19__PRETTY_FUNCTION____ZN19fhandler_pty_master5ioctlEjPv__ZZN19fhandler_pty_master5ioctlEjPvE19__PRETTY_FUNCTION____ZN19fhandler_pty_common15bytes_availableERm__ZN18fhandler_pty_slave5ioctlEjPv__ZZN18fhandler_pty_slave5ioctlEjPvE19__PRETTY_FUNCTION____ZN18fhandler_pty_slave4readEPvRj@12__ZZN18fhandler_pty_slave4readEPvRjE19__PRETTY_FUNCTION____ZN19fhandler_pty_master14flush_to_slaveEv__ZN19fhandler_pty_master20process_slave_outputEPcji__ZZN19fhandler_pty_master20process_slave_outputEPcjiE19__PRETTY_FUNCTION____ZN19fhandler_pty_master7tcflushEi__ZZN19fhandler_pty_master7tcflushEiE19__PRETTY_FUNCTION____ZN19fhandler_pty_master4readEPvRj@12__ZN18fhandler_pty_slaveC2Ei__ZN18fhandler_pty_slaveC1Ei__ZN18fhandler_pty_slave16fch_open_handlesEv__ZN18fhandler_pty_slave10fch_set_sdER19security_descriptorb__ZN18fhandler_pty_slave17fch_close_handlesEv__ZN18fhandler_pty_slave6fchownEmm@12__ZN18fhandler_pty_slave6fchmodEj@8__ZN19fhandler_pty_master17pty_master_threadEv__ZZN19fhandler_pty_master17pty_master_threadEvE19__PRETTY_FUNCTION____ZL17pty_master_threadPv@4__ZN19fhandler_pty_master5setupEv__ZZN19fhandler_pty_master5setupEvE19__PRETTY_FUNCTION____ZN19fhandler_pty_masterC2Ei__ZN19fhandler_pty_masterC1Ei__ZN16fhandler_virtual16fixup_after_execEv__ZN16fhandler_virtual7telldirEP5__DIR__ZN16fhandler_virtual7seekdirEP5__DIRl__ZN16fhandler_virtual9rewinddirEP5__DIR__ZN16fhandler_virtual8closedirEP5__DIR__ZN16fhandler_virtual6existsEv__ZN16fhandler_virtual12fill_filebufEv.text$_ZN16fhandler_virtual5cloneE13cygheap_types__ZN16fhandler_virtual5cloneE13cygheap_types.rdata$_ZTV16fhandler_virtual__ZN16fhandler_virtual8fstatvfsEP7statvfs@8__ZN16fhandler_virtual4faclEiiP7__acl32@16__ZN16fhandler_virtual4openEij__ZN16fhandler_virtual5closeEv__ZN16fhandler_virtual3dupEP13fhandler_basei__ZN16fhandler_virtualD2Ev__ZN16fhandler_virtualD1Ev__ZN16fhandler_virtualD0Ev.text$_ZN16fhandler_virtual6copytoEP13fhandler_base__ZN16fhandler_virtual6copytoEP13fhandler_base__ZN16fhandler_virtual6fchownEmm@12__ZZN16fhandler_virtual6fchownEmmE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN16fhandler_virtual6fchmodEj@8__ZZN16fhandler_virtual6fchmodEjE19__PRETTY_FUNCTION____ZN16fhandler_virtual5writeEPKvj@12__ZZN16fhandler_virtual5writeEPKvjE19__PRETTY_FUNCTION____ZN16fhandler_virtual5lseekExi__ZZN16fhandler_virtual5lseekExiE19__PRETTY_FUNCTION____ZN16fhandler_virtual4readEPvRj@12__ZZN16fhandler_virtual4readEPvRjE19__PRETTY_FUNCTION____ZN16fhandler_virtual7opendirEi__ZZN16fhandler_virtual7opendirEiE19__PRETTY_FUNCTION____ZZN13cygheap_fdnewC1EibE19__PRETTY_FUNCTION____ZN16fhandler_virtualC2Ev__ZN16fhandler_virtualC1Ev.text$_ZN16fhandler_windows10is_windowsEv__ZN16fhandler_windows10is_windowsEv.text$_ZN16fhandler_windows5lseekExi__ZN16fhandler_windows5lseekExi.text$_ZN16fhandler_windows5closeEv__ZN16fhandler_windows5closeEv.text$_ZN16fhandler_windows5cloneE13cygheap_types__ZN16fhandler_windows5cloneE13cygheap_types.rdata$_ZTV16fhandler_windows.text$_ZN16fhandler_windowsD1Ev__ZN16fhandler_windowsD1Ev.text$_ZN16fhandler_windowsD0Ev__ZN16fhandler_windowsD0Ev__ZN16fhandler_windows16fixup_after_forkEPv__ZN16fhandler_windows17set_close_on_execEb__ZN16fhandler_windows5writeEPKvj@12__ZN16fhandler_windows4openEij.text$_ZN16fhandler_windows6copytoEP13fhandler_base__ZN16fhandler_windows6copytoEP13fhandler_base__ZN16fhandler_windows4readEPvRj@12__ZZN16fhandler_windows4readEPvRjE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN16fhandler_windows5ioctlEjPv__ZZN16fhandler_windows5ioctlEjPvE19__PRETTY_FUNCTION____ZN16fhandler_windowsC2Ev__ZN16fhandler_windowsC1Ev__ZN17fhandler_dev_zero5lseekExi.text$_ZN17fhandler_dev_zero5cloneE13cygheap_types__ZN17fhandler_dev_zero5cloneE13cygheap_types.rdata$_ZTV17fhandler_dev_zero.text$_ZN17fhandler_dev_zeroD1Ev__ZN17fhandler_dev_zeroD1Ev.text$_ZN17fhandler_dev_zeroD0Ev__ZN17fhandler_dev_zeroD0Ev__ZN17fhandler_dev_zero4readEPvRj@12__ZN17fhandler_dev_zero5writeEPKvj@12__ZZN17fhandler_dev_zero5writeEPKvjE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN17fhandler_dev_zero4openEij.text$_ZN17fhandler_dev_zero6copytoEP13fhandler_base__ZN17fhandler_dev_zero6copytoEP13fhandler_base__ZN17fhandler_dev_zeroC2Ev__ZN17fhandler_dev_zeroC1Ev__ZL20get_obj_handle_countPv__ZZL20get_obj_handle_countPvE19__PRETTY_FUNCTION____ZL20allow_others_to_syncv__ZZL20allow_others_to_syncvE4done__ZZL20allow_others_to_syncvE19__PRETTY_FUNCTION____ZL14lf_findoverlapP7lockf_tS0_iPPS0_S1___ZL8lf_splitP7lockf_tS0_PS0___ZZL8lf_splitP7lockf_tS0_PS0_E19__PRETTY_FUNCTION__.text$_ZN14cygheap_fdenumD1Ev__ZN14cygheap_fdenumD1Ev.text$_ZN14cygheap_fdenumD0Ev__ZN14cygheap_fdenumD0Ev__ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN7inode_tC2Emy__ZN7inode_tC1Emy__ZN7inode_t3getEmybb__ZL11lockf_guard__ZN7lockf_t13from_obj_nameEP7inode_tPPS_PKw__ZN7lockf_t20create_lock_obj_attrEP11lockfattr_tm__ZN7lockf_t13open_lock_objEv__ZN7lockf_t15create_lock_objEv__ZZN7lockf_t15create_lock_objEvE19__PRETTY_FUNCTION____ZN7lockf_t12del_lock_objEPvb__ZL11lf_wakelockP7lockf_tPv__ZL12lf_clearlockP7lockf_tPS0_Pv__ZN7lockf_tD2Ev__ZN7lockf_tD1Ev__Z21create_lock_in_parentPv@4__ZZ21create_lock_in_parentPvE19__PRETTY_FUNCTION__.rdata$_ZTV14cygheap_fdenum__ZN7inode_t18get_all_locks_listEv__ZZN7inode_t18get_all_locks_listEvE19__PRETTY_FUNCTION____ZL11lf_getblockP7lockf_tP7inode_t__ZN7inode_t12del_my_locksExPv__ZN7inode_tD2Ev__ZN7inode_tD1Ev__Z22fixup_lockf_after_execv__ZN7inode_t27unlock_and_remove_if_unusedEv__ZN13fhandler_base12del_my_locksE20del_lock_called_from__Z21delete_lock_in_parentPv@4__ZN18fhandler_disk_file4lockEiP9__flock64__ZZN18fhandler_disk_file4lockEiP9__flock64E19__PRETTY_FUNCTION____ZZN13cygheap_fdgetC1EibbE19__PRETTY_FUNCTION____ZZ5flockE19__PRETTY_FUNCTION____ZZ5lockfE19__PRETTY_FUNCTION__.data_cygwin_nocopy_fnmatch1_initial.2322__ZL12resume_childPv__ZZL12resume_childPvE19__PRETTY_FUNCTION____ZL16sync_with_parentPKcb@8__ZZL16sync_with_parentPKcbE19__PRETTY_FUNCTION____ZN4frok5errorEPKcz__ZZN4frok5errorEPKczE3buf__ZN10child_info7preforkEb__ZN4frok5childEPVc@8__ZZN4frok5childEPVcE19__PRETTY_FUNCTION____Z10child_copyPvbz__ZZ10child_copyPvbzE19__PRETTY_FUNCTION____ZZ10child_copyPvbzE3huh__ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN4frok6parentEPVc@8__ZZN4frok6parentEPVcE19__PRETTY_FUNCTION____ZZ4forkE19__PRETTY_FUNCTION____ZZ5vforkE19__PRETTY_FUNCTION___fts_compar_fts_lfree_fts_maxarglen_fts_alloc_fts_stat.clone.2_fts_safe_changedir.clone.3_fts_sort.clone.4_fts_build_fts_open_fts_close_fts_read_fts_children_fts_get_clientptr_fts_get_stream_fts_set_clientptr_permute_args_parse_long_options_illoptstring_recargstring_getopt_internal_posixly_correct.2210_nonopt_end_nonopt_start_recargchar_illoptchar_getopt_long_getopt_long_only__ZL6g_CtocPKyPcj__ZL5matchPyS_S___ZL7comparePKvS0___ZL7g_lstatPyP8__stat64P6glob_t.clone.0__ZL6g_statPyP8__stat64P6glob_t.clone.1__ZL10globextendPKyP6glob_tPj.clone.3__ZL5glob2PyS_S_S_P6glob_tPj__ZL5glob3PyS_S_S_S_P6glob_tPj__ZL5glob0PKyP6glob_tPj__ZL8globexp1PKyP6glob_tPj__ZL8globexp2PKyS0_P6glob_tPiPj_globfree_glob_pattern_p__GLOBAL__I_hMainThread__ZL9_mtinterf.data_cygwin_nocopy__ZN6pwdgrp11parse_groupEv__ZL8null_ptr__ZN6pwdgrpC2ERP6passwd__ZN6pwdgrpC1ERP6passwd__ZN6pwdgrpC2ERP9__group32__ZN6pwdgrpC1ERP9__group32__Z17internal_getgrsidR7cygpsid__ZL9group_buf__Z17internal_getgrgidmb__ZL10get_groupsPKcmR10cygsidlist__ZZL10get_groupsPKcmR10cygsidlistE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN6pwdgrp10read_groupEv__ZZN6pwdgrp10read_groupEvE9pretty_ls__ZZN6pwdgrp10read_groupEvE7linebuf__ZZN6pwdgrp10read_groupEvE19__PRETTY_FUNCTION____Z17internal_getgrnamPKcb_getgrgid_r_getgrgid32_getgrgid__ZZ8getgrgidE3g16_getgrnam_r_getgrnam32_getgrnam__ZZ8getgrnamE3g16_endgrent_getgrent32_getgrent__ZZ8getgrentE3g16_setgrent__Z17internal_getgrenti__Z18internal_getgroupsiPmP7cygpsid__ZZ18internal_getgroupsiPmP7cygpsidE19__PRETTY_FUNCTION___getgroups32_getgroups__ZZ9getgroupsE19__PRETTY_FUNCTION___initgroups32__ZZ12initgroups32E19__PRETTY_FUNCTION___initgroups_getgrouplist__ZZ12getgrouplistE19__PRETTY_FUNCTION___setgroups32__ZZ11setgroups32E19__PRETTY_FUNCTION___setgroups__GLOBAL__I__ZN6pwdgrp11parse_groupEv.data_cygwin_nocopy__Z9heap_initv__ZL10page_const__ZZ9heap_initvE19__PRETTY_FUNCTION____ZZ4sbrkE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZL8rvadeltaP17_IMAGE_NT_HEADERSmRm__ZL6putmemP19_IMAGE_THUNK_DATA32PKv__Z24find_first_notloaded_dllR9path_conv__ZZ24find_first_notloaded_dllR9path_convE3buf__Z21hook_or_detect_cygwinPKcPKvRtPv__ZZL8makenamePKcRPcRiiE7testers__Z10ld_preloadv__Z22fixup_hooks_after_forkv_cygwin_inet_aton_cygwin_inet_addr_cygwin_inet_network__ZL13threadfunc_fePv@4__ZL11_my_oldfunc_dll_entry@12__ZL20dll_finished_loading__ZL10search_for__ZZ5ioctlE19__PRETTY_FUNCTION____ZZN13cygheap_fdgetC1EibbE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION___CreateEventW@16_CreateEventA@16_OpenEventW@12_OpenEventA@12_CreateMutexW@12_CreateMutexA@12_OpenMutexW@12_OpenMutexA@12_CreateSemaphoreW@16_CreateSemaphoreA@16_OpenSemaphoreW@12_OpenSemaphoreA@12_CreateFileMappingW@24_CreateFileMappingA@24_OpenFileMappingW@12_OpenFileMappingA@12___wrap__Znwj___wrap__Znaj___wrap__ZdlPv___wrap__ZdaPv___wrap__ZnwjRKSt9nothrow_t___wrap__ZnajRKSt9nothrow_t___wrap__ZdlPvRKSt9nothrow_t___wrap__ZdaPvRKSt9nothrow_t__ZL9settznamev__ZL6lclmem__ZL8wildabbr__ZL8getznamePKc__ZL6getnumPKcPiii__ZL7getsecsPKcPl__ZL9getoffsetPKcPl__ZL7getrulePKcP4rule__ZL9transtimeliPK4rulel__ZL11mon_lengths__ZL18increment_overflowPii__ZL18normalize_overflowPiS_i__ZL8time2subP2tmPFvPKllS0_ElPii__ZL12year_lengths__ZL6gmtmem__ZL5time2P2tmPFvPKllS0_ElPi__ZL5time1P2tmPFvPKllS0_El__ZL6tzloadPKcP5state__ZL16_posixrules_data__ZL7tzparsePKcP5statei__ZL7gmtloadP5state__ZL7timesubPKllPK5stateP2tm.clone.0__ZL8localsubPKllP2tm__ZL6gmtsubPKllP2tm__ZL10gmt_is_set__Z9tzsetwallv__ZL10lcl_is_set__ZL10lcl_TZname__ZL11tzset_guard_localtime_localtime_r_gmtime_r_timelocal_time2posix_posix2time.data_cygwin_nocopy__ZL19use_internal_malloc__ZZ4freeE19__PRETTY_FUNCTION____ZL20export_malloc_called__ZZ6mallocE19__PRETTY_FUNCTION____ZZ7reallocE19__PRETTY_FUNCTION___reallocf__ZZ6callocE19__PRETTY_FUNCTION___posix_memalign_memalign__ZZ8memalignE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZZ6vallocE19__PRETTY_FUNCTION___malloc_usable_size__ZZ18malloc_usable_sizeE19__PRETTY_FUNCTION___malloc_trim__ZZ11malloc_trimE19__PRETTY_FUNCTION____ZZ7malloptE19__PRETTY_FUNCTION___malloc_stats__ZZ12malloc_statsE19__PRETTY_FUNCTION___mallinfo__ZZ8mallinfoE19__PRETTY_FUNCTION____Z11malloc_initv__ZZ11malloc_initvE19__PRETTY_FUNCTION_____set_ENOMEM__ZZ12__set_ENOMEME19__PRETTY_FUNCTION__.data_cygwin_nocopy_get_registry_dns_items_cygwin_query_get_dns_info_scanline_minires_dprintf_get_tcp_buf_get_resolv_minires_get_search___res_state___res_ninit___res_init___res_nclose___res_close___dn_expand___res_nsend_SServ.12172___res_send___dn_comp___res_nmkquery___res_nquery___res_nsearch___res_search___res_nquerydomain___res_querydomain___res_query___res_mkquery___dn_skipname_dn_length1__ZL9dummytestPVc__Z14thread_wrapperPv@4_cygwin_wcscasecmp@8_cygwin_wcsncasecmp@12_cygwin_strcasecmp@8_cygwin_strncasecmp@12_cygwin_strlwr@4_cygwin_strupr@4__Z26check_invalid_virtual_addrPKvj@8__Z11check_iovecPK5iovecib__ZZ11check_iovecPK5iovecibE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____Z15winprio_to_nicem__Z15nice_to_winprioRi__ZZ15nice_to_winprioRiE8priority__Z20CreatePipeOverlappedPPvS0_P20_SECURITY_ATTRIBUTES@12__Z18ReadPipeOverlappedPvS_mPmm@20__Z19WritePipeOverlappedPvPKvmPmm@20__Z12backslashifyPKcPcb__Z8slashifyPKcPcb_CygwinCreateThread@28.data_cygwin_nocopy__ZL8_gettempPcPiiji__ZL7padchar__ZZL8_gettempPcPiijiE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION___mkstemps_mkostemp_mkostemps__ZL7MapViewPvS_jmiix__ZZL7MapViewPvS_jmiixE19__PRETTY_FUNCTION____ZL13CreateMappingPvjxmii__Z41__static_initialization_and_destruction_0ii.clone.33__ZL12fh_anonymous__ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZNK11mmap_record16compatible_flagsEi__ZNK11mmap_record17find_unused_pagesEm__ZN11mmap_record5matchEPcmRS0_Rm__ZN11mmap_record13init_page_mapERS___ZZN11mmap_record13init_page_mapERS_E19__PRETTY_FUNCTION____ZN11mmap_record9map_pagesExm__ZZN11mmap_record9map_pagesExmE19__PRETTY_FUNCTION____ZN11mmap_record9map_pagesEPcm__ZZN11mmap_record9map_pagesEPcmE19__PRETTY_FUNCTION____ZN11mmap_record11unmap_pagesEPcm__ZZN11mmap_record11unmap_pagesEPcmE19__PRETTY_FUNCTION____ZN11mmap_record6accessEPc__ZN11mmap_record8alloc_fhEv__ZN11mmap_record7free_fhEP13fhandler_base__ZN9mmap_list10add_recordER11mmap_record__ZN9mmap_list3setEiP8__stat64__ZN9mmap_list10del_recordEP11mmap_record__ZN9mmap_list7try_mapEPvjix__ZZN9mmap_list7try_mapEPvjixE19__PRETTY_FUNCTION____ZN10mmap_areas14get_list_by_fdEiP8__stat64__ZN10mmap_areas8add_listEiP8__stat64__ZL11mmap_workerP9mmap_listP13fhandler_basePcjiiixP8__stat64__ZL13mmapped_areas__ZN10mmap_areas8del_listEP9mmap_list__Z17is_mmapped_regionPcS___ZL10mmap_guard__Z29mmap_is_attached_or_noreservePvj__ZZ6mmap64E19__PRETTY_FUNCTION____ZZN13cygheap_fdgetC1EibbE19__PRETTY_FUNCTION____ZZ6munmapE19__PRETTY_FUNCTION____ZZ5msyncE19__PRETTY_FUNCTION___mprotect__ZZ8mprotectE19__PRETTY_FUNCTION____ZZ5mlockE19__PRETTY_FUNCTION____ZZ7munlockE19__PRETTY_FUNCTION___posix_madvise__ZZ13posix_madviseE19__PRETTY_FUNCTION____ZN13fhandler_base4mmapEPPcjiix__ZZN13fhandler_base4mmapEPPcjiixE19__PRETTY_FUNCTION____ZN13fhandler_base6munmapEPvPcj__ZZN13fhandler_base6munmapEPvPcjE19__PRETTY_FUNCTION____ZN13fhandler_base5msyncEPvPcji__ZZN13fhandler_base5msyncEPvPcjiE19__PRETTY_FUNCTION____ZN13fhandler_base21fixup_mmap_after_forkEPviixmS0___ZZN13fhandler_base21fixup_mmap_after_forkEPviixmS0_E19__PRETTY_FUNCTION____ZN17fhandler_dev_zero4mmapEPPcjiix__ZZN17fhandler_dev_zero4mmapEPPcjiixE19__PRETTY_FUNCTION____ZN17fhandler_dev_zero6munmapEPvPcj__ZN17fhandler_dev_zero5msyncEPvPcji__ZN17fhandler_dev_zero21fixup_mmap_after_forkEPviixmS0___ZZN17fhandler_dev_zero21fixup_mmap_after_forkEPviixmS0_E19__PRETTY_FUNCTION____ZN18fhandler_disk_file4mmapEPPcjiix__ZZN18fhandler_disk_file4mmapEPPcjiixE19__PRETTY_FUNCTION____ZN18fhandler_disk_file6munmapEPvPcj__ZN18fhandler_disk_file5msyncEPvPcji__ZN18fhandler_disk_file21fixup_mmap_after_forkEPviixmS0___ZZN18fhandler_disk_file21fixup_mmap_after_forkEPviixmS0_E19__PRETTY_FUNCTION____ZN16fhandler_dev_mem4mmapEPPcjiix__ZZN16fhandler_dev_mem4mmapEPPcjiixE19__PRETTY_FUNCTION____ZN16fhandler_dev_mem6munmapEPvPcj__ZN16fhandler_dev_mem5msyncEPvPcji__ZN16fhandler_dev_mem21fixup_mmap_after_forkEPviixmS0___ZZN16fhandler_dev_mem21fixup_mmap_after_forkEPviixmS0_E19__PRETTY_FUNCTION____Z22fixup_mmaps_after_forkPv@4__ZZ22fixup_mmaps_after_forkPvE19__PRETTY_FUNCTION____GLOBAL__I__ZNK11mmap_record16compatible_flagsEi__GLOBAL__D__ZNK11mmap_record16compatible_flagsEi.data_cygwin_nocopy.text$_ZN18client_request_msgD1Ev__ZN18client_request_msgD1Ev.rdata$_ZTV18client_request_msg.text$_ZN18client_request_msgD0Ev__ZN18client_request_msgD0Ev__ZN18client_request_msgC2EiiP8msqid_ds__ZN18client_request_msgC1EiiP8msqid_ds__ZN18client_request_msgC2Exi__ZN18client_request_msgC1Exi__ZN18client_request_msgC2EiPvjli__ZN18client_request_msgC1EiPvjli__ZN18client_request_msgC2EiPKvji__ZN18client_request_msgC1EiPKvji__ZZ6msgctlE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZZ6msggetE19__PRETTY_FUNCTION____ZZ6msgrcvE19__PRETTY_FUNCTION____ZZ6msgsndE19__PRETTY_FUNCTION____ZL9set_flagsPjj__ZZL9set_flagsPjjE19__PRETTY_FUNCTION____ZL19sort_by_native_namePKvS0___ZL15mounts_for_sort__ZL18sort_by_posix_namePKvS0___ZL13compare_flagsPKvS0___ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN13fs_info_cache7genhashEP27_FILE_FS_VOLUME_INFORMATION__ZN13fs_info_cache6searchEP27_FILE_FS_VOLUME_INFORMATIONRj__ZN13fs_info_cache3addEjP7fs_info__ZN7fs_info6updateEP15_UNICODE_STRINGPv__ZL9fsi_cache__ZZN7fs_info6updateEP15_UNICODE_STRINGPvE19__PRETTY_FUNCTION____ZL14fillout_mntentPKcS0_j__ZL18cygdrive_getmntentv__ZN10mount_item11build_win32EPcPKcPjj__ZN10mount_info15get_mounts_hereEPKciP15_UNICODE_STRINGS3___ZN10mount_info19cygdrive_posix_pathEPKcPci__ZN10mount_info19cygdrive_win32_pathEPKcPcRi__ZZN10mount_info19cygdrive_win32_pathEPKcPcRiE19__PRETTY_FUNCTION____ZN10mount_info18conv_to_win32_pathEPKcPcR6devicePj__ZZN10mount_info18conv_to_win32_pathEPKcPcR6devicePjE19__PRETTY_FUNCTION____ZN10mount_info18conv_to_posix_pathEPKcPci__ZZN10mount_info18conv_to_posix_pathEPKcPciE19__PRETTY_FUNCTION____ZN10mount_info18conv_to_posix_pathEPwPci__ZN10mount_info25set_flags_from_win32_pathEPKc_fstab_read_flags__ZZ16fstab_read_flagsE19__PRETTY_FUNCTION___fstab_list_flags__ZN10mount_info19write_cygdrive_infoEPKcj__ZZN10mount_info19write_cygdrive_infoEPKcjE19__PRETTY_FUNCTION____ZN10mount_info17get_cygdrive_infoEPcS0_S0_S0___ZN10mount_info4sortEv__ZN10mount_info8del_itemEPKcj__ZZN10mount_info8del_itemEPKcjE19__PRETTY_FUNCTION____ZN10mount_item9getmntentEv__ZN10mount_info9getmntentEi__ZN10mount_item4initEPKcS1_j__ZN10mount_info8add_itemEPKcS1_j__ZZN10mount_info8add_itemEPKcS1_jE19__PRETTY_FUNCTION____ZN10mount_info15from_fstab_lineEPcb__ZN10mount_info10from_fstabEbPwS0___ZZN10mount_info10from_fstabEbPwS0_E19__PRETTY_FUNCTION____ZN10mount_info4initEv__ZZN10mount_info17create_root_entryEPwE19__PRETTY_FUNCTION____ZZ5mountE19__PRETTY_FUNCTION___cygwin_umount__ZZ13cygwin_umountE19__PRETTY_FUNCTION____ZZ6umountE19__PRETTY_FUNCTION____Z13get_disk_typePKw_setmntent_getmntent_getmntent_r_endmntent__ZN18dos_drive_mappingsC2Ev__ZZN18dos_drive_mappingsC1EvE19__PRETTY_FUNCTION____ZN18dos_drive_mappingsC1Ev__ZN18dos_drive_mappings14fixup_if_matchEPw__ZN18dos_drive_mappingsD2Ev__ZN18dos_drive_mappingsD1Ev__GLOBAL__I__ZN10mount_info11got_usr_binE.data_cygwin_nocopy__ZL9get_flagsP21_IP_ADAPTER_ADDRESSES__ZL14set_host_errnov__ZL11host_errmap__ZL14get_ipv6_funcsP11HINSTANCE____ZL15ws_freeaddrinfo__ZL14ws_getaddrinfo__ZL14ws_getnameinfo__ZL15load_ipv6_funcsv__ZL15load_ipv6_guard__ZL11ipv6_inited__ZL6ga_dupP8addrinfob__ZL10ga_duplistP8addrinfob__ZL7ga_portP8addrinfoii__ZL10inet_pton4PKcPh__ZZL10inet_pton4PKcPhE6digits__ZL10inet_ntop4PKhPcj__ZZL10inet_ntop4PKhPcjE3fmt__ZL21get_ipv4fromreg_ipcntPKc__ZL15get_ipv4fromregP5ifallPKcm__ZL12get_routedstm__ZL10get_2k_ifsv__Z8call_gaaPv@4__ZL11ga_aistructPPP8addrinfoPKS_PKvi.clone.2__ZL3geti__ZZN13cygheap_fdgetC1EibbE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZZL3getiE19__PRETTY_FUNCTION__.text$_ZN13cygheap_fdnewC1Eib__ZN13cygheap_fdnewC1Eib__ZZN13cygheap_fdnewC1EibE19__PRETTY_FUNCTION___inet_netof_inet_makeaddr__Z19__set_winsock_errnoPKci__ZL6errmap__ZZ19__set_winsock_errnoPKciE19__PRETTY_FUNCTION___cygwin_getprotobyname__ZZL7dup_entRP8unionentS0_NS_11struct_typeEE19__PRETTY_FUNCTION____ZZL7dup_entRP8unionentS0_NS_11struct_typeEE12__FUNCTION___cygwin_getprotobynumber__Z6fdsockR15cygheap_fdmanipPK6devicej__ZZ6fdsockR15cygheap_fdmanipPK6devicejE19__PRETTY_FUNCTION____ZZNK15cygheap_fdmanip6isopenEvE19__PRETTY_FUNCTION___cygwin_socket__ZZ13cygwin_socketE19__PRETTY_FUNCTION____ZZ13cygwin_socketE12__FUNCTION___cygwin_sendto__ZZ13cygwin_sendtoE19__PRETTY_FUNCTION___cygwin_recvfrom__ZZ15cygwin_recvfromE19__PRETTY_FUNCTION___cygwin_setsockopt__ZZL22convert_ws1_ip_optnameiE11ws2_optname__ZZ17cygwin_setsockoptE12__FUNCTION____ZZ17cygwin_setsockoptE19__PRETTY_FUNCTION___cygwin_getsockopt__ZZ17cygwin_getsockoptE19__PRETTY_FUNCTION____ZZ17cygwin_getsockoptE12__FUNCTION___getpeereid_cygwin_connect__ZZ14cygwin_connectE19__PRETTY_FUNCTION___cygwin_getservbyname__ZZ20cygwin_getservbynameE19__PRETTY_FUNCTION___cygwin_getservbyport__ZZ20cygwin_getservbyportE19__PRETTY_FUNCTION___cygwin_gethostname__ZZ18cygwin_gethostnameE12__FUNCTION____ZZ18cygwin_gethostnameE19__PRETTY_FUNCTION___cygwin_gethostbyname__ZZ20cygwin_gethostbynameE19__PRETTY_FUNCTION___cygwin_gethostbyaddr__ZZ20cygwin_gethostbyaddrE19__PRETTY_FUNCTION___gethostbyname2__ZZ14gethostbyname2E19__PRETTY_FUNCTION____ZZL16gethostby_helperPKciiiiE19__PRETTY_FUNCTION___cygwin_accept__ZZ13cygwin_acceptE19__PRETTY_FUNCTION____ZZ7accept4E19__PRETTY_FUNCTION___cygwin_bind__ZZ11cygwin_bindE19__PRETTY_FUNCTION___cygwin_getsockname__ZZ18cygwin_getsocknameE19__PRETTY_FUNCTION___cygwin_listen__ZZ13cygwin_listenE19__PRETTY_FUNCTION___cygwin_shutdown__ZZ15cygwin_shutdownE19__PRETTY_FUNCTION___cygwin_hstrerror_cygwin_herror_CSWTCH.558_cygwin_getpeername__ZZ18cygwin_getpeernameE19__PRETTY_FUNCTION___cygwin_recv__ZZ11cygwin_recvE19__PRETTY_FUNCTION___cygwin_send__ZZ11cygwin_sendE19__PRETTY_FUNCTION___getdomainname_ip_addr_prefix__Z22get_adapters_addressesPP21_IP_ADAPTER_ADDRESSESm__ZZ22get_adapters_addressesPP21_IP_ADAPTER_ADDRESSESmE19__PRETTY_FUNCTION____ZL10get_xp_ifsm_getifaddrs__ZZ10getifaddrsE19__PRETTY_FUNCTION___freeifaddrs__Z10get_ifconfP6ifconfi__ZZ10get_ifconfP6ifconfiE19__PRETTY_FUNCTION___if_nametoindex_if_indextoname__ZZ14if_indextonameE19__PRETTY_FUNCTION___if_nameindex__ZZ12if_nameindexE19__PRETTY_FUNCTION___if_freenameindex_cygwin_bindresvport_sa__ZZ22cygwin_bindresvport_saE19__PRETTY_FUNCTION___cygwin_bindresvport_socketpair__ZZ10socketpairE19__PRETTY_FUNCTION____ZZ10socketpairE12__FUNCTION___sethostent_endhostent_cygwin_recvmsg__ZZ14cygwin_recvmsgE19__PRETTY_FUNCTION___cygwin_sendmsg__ZZ14cygwin_sendmsgE19__PRETTY_FUNCTION___cygwin_inet_pton__ZZL10inet_pton6PKcPhE9xdigits_l__ZZL10inet_pton6PKcPhE9xdigits_u_cygwin_inet_ntop_cygwin_inet_ntoa__Z16ipv4_getaddrinfoPKcS0_PK8addrinfoPPS1___Z16ipv4_getnameinfoPK8sockaddriPcjS2_ji_cygwin_gai_strerror__ZL10gai_errmap_cygwin_freeaddrinfo_cygwin_getaddrinfo_cygwin_getnameinfo__ZZ18cygwin_getnameinfoE12__FUNCTION____Z17ipv4_freeaddrinfoP8addrinfo.data_cygwin_nocopy__ZL16open_system_filePKc__ZZL16open_system_filePKcE19__PRETTY_FUNCTION____ZL16parse_alias_listPPPcS0___ZL5SPACE__ZZL16parse_alias_listPPPcS0_E19__PRETTY_FUNCTION____ZL15get_entire_lineP9__sFILE64__ZZL15get_entire_lineP9__sFILE64E19__PRETTY_FUNCTION____ZL13free_protoentP8protoent.clone.1__ZL16current_protoent__ZL12free_serventP7servent.clone.3__ZL15current_servent_cygwin_setservent__ZL8svc_file__ZL12svc_read_pos__ZZ17cygwin_setserventE19__PRETTY_FUNCTION___cygwin_getservent__ZZL19parse_services_lineP9__sFILE64P7serventE19__PRETTY_FUNCTION____ZZ17cygwin_getserventE19__PRETTY_FUNCTION___cygwin_endservent__ZZ17cygwin_endserventE19__PRETTY_FUNCTION___cygwin_setprotoent__ZL10proto_file__ZL14proto_read_pos__ZZ18cygwin_setprotoentE19__PRETTY_FUNCTION___cygwin_getprotoent__ZZL19parse_protocol_lineP9__sFILE64P8protoentE19__PRETTY_FUNCTION____ZZ18cygwin_getprotoentE19__PRETTY_FUNCTION___cygwin_endprotoent__ZZ18cygwin_endprotoentE19__PRETTY_FUNCTION__.data_cygwin_nocopy__Z16nfs_fetch_fattr3PvP6fattr3__ZL14check_codepagePc__ZL10locale_cmpPKvS0___ZL11lc_mbstowcsPFiP6_reentPwPKcjS3_P10_mbstate_tES3_S1_S3_j__ZL11lc_wcstombsPFiP6_reentPcwPKcP10_mbstate_tES3_S1_PKwjb__ZL15__charfromwcharPKwPPcjPFiP6_reentS1_wPKcP10_mbstate_tES6___ZL15__getlocaleinfommPPcj__ZL12getlocaleintmm__ZL13conv_groupingmmPPc__ZL22__get_lcid_from_localePKc__ZL11last_locale__ZL9last_lcid__ZZL22__get_lcid_from_localePKcE19__PRETTY_FUNCTION____ZZL22__get_lcid_from_localePKcE4C.50__ZZL22__get_lcid_from_localePKcE4C.41__ZL18__eval_datetimefmtmm8dt_flagsPPcj.clone.0___set_lc_time_from_win__ZL6lc_era___set_lc_ctype_from_win___set_lc_numeric_from_win___set_lc_monetary_from_win___set_lc_messages_from_win__ZL6lc_msg___collate_load_locale__ZL14collate_mbtowc___get_current_collate_codeset__ZZ7wcscollE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZZ7strcollE19__PRETTY_FUNCTION_____collate_range_cmp__ZZ7wcsxfrmE19__PRETTY_FUNCTION____ZZ7strxfrmE19__PRETTY_FUNCTION_____set_charset_from_locale___set_locale_from_locale_alias_internal_setlocale__ZZ18internal_setlocaleE19__PRETTY_FUNCTION____Z17initial_setlocalev_setlocale__ZL15setxattr_workerR9path_convPKcPKvji@20__ZZL15setxattr_workerR9path_convPKcPKvjiE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZL15getxattr_workerR9path_convPKcPvj@16__ZZL15getxattr_workerR9path_convPKcPvjE19__PRETTY_FUNCTION____Z7read_eaPvR9path_convPKcPcj@20__ZZ7read_eaPvR9path_convPKcPcjE19__PRETTY_FUNCTION____Z8write_eaPvR9path_convPKcS3_ji@24__ZZ8write_eaPvR9path_convPKcS3_jiE19__PRETTY_FUNCTION___getxattr__ZZ8getxattrE19__PRETTY_FUNCTION___lgetxattr__ZZ9lgetxattrE19__PRETTY_FUNCTION___fgetxattr__ZZN13cygheap_fdgetC1EibbE19__PRETTY_FUNCTION____ZZ9fgetxattrE19__PRETTY_FUNCTION___listxattr_llistxattr_flistxattr_setxattr__ZZ8setxattrE19__PRETTY_FUNCTION___lsetxattr__ZZ9lsetxattrE19__PRETTY_FUNCTION___fsetxattr__ZZ9fsetxattrE19__PRETTY_FUNCTION___removexattr_lremovexattr_fremovexattr__ZL17_getpass_close_fdPv__ZN6pwdgrp12parse_passwdEv__Z17internal_getpwsidR7cygpsid__Z17internal_getpwuidmb__Z17internal_getpwnamPKcb__ZN6pwdgrp11read_passwdEv__ZZN6pwdgrp11read_passwdEvE9pretty_ls__ZZN6pwdgrp11read_passwdEvE7linebuf__ZZN6pwdgrp11read_passwdEvE19__PRETTY_FUNCTION___getpwuid32_getpwuid_getpwuid_r32_getpwuid_r_getpwnam_getpwnam_r_getpwent_getpwduid_setpwent_endpwent_setpassent__GLOBAL__I_passwd_buf.data_cygwin_nocopy__ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____Z13path_prefix_pPKcS0_ib__Z10pathnmatchPKcS0_ib__Z9pathmatchPKcS0_b__Z22has_dot_last_componentPKcb__ZN9path_conv19set_normalized_pathEPKc__Z18get_nt_native_pathPKcR15_UNICODE_STRINGb__ZN9path_conv18get_nt_native_pathEv__ZN9path_conv19get_wide_win32_pathEPw__ZN9path_convD2Ev__ZN9path_convD1Ev__ZN9path_conv9is_binaryEv__Z13file_get_fnoiPvbP30_FILE_NETWORK_OPEN_INFORMATION__Z12nofinalslashPKcPc@8__ZN12symlink_info17check_nfs_symlinkEPv__ZN12symlink_info8posixifyEPc__ZN12symlink_info19check_reparse_pointEPvb__ZZN12symlink_info19check_reparse_pointEPvbE19__PRETTY_FUNCTION____ZN12symlink_info13check_sysfileEPv__ZZN12symlink_info13check_sysfileEPvE19__PRETTY_FUNCTION____ZN12symlink_info14check_shortcutEPv__ZL13GUID_shortcut__ZN11suffix_scan3hasEPKcPK11suffix_info__ZN11suffix_scan4nextEv__ZN12symlink_info9set_errorEi__ZN12symlink_info12parse_deviceEPKc__ZN12symlink_info5checkEPcPK11suffix_infoR7fs_infoR16path_conv_handle__ZZN12symlink_info5checkEPcPK11suffix_infoR7fs_infoR16path_conv_handleE19__PRETTY_FUNCTION____ZN12symlink_info3setEPc__Z14hash_path_nameyP15_UNICODE_STRING@12__Z14hash_path_nameyPKw@12__Z14hash_path_nameyPKc@12_cygwin_posix_path_list_p_cygwin_split_path__ZN13fcwd_access_t20SetFSCharacteristicsEl__ZN13fcwd_access_t16fast_cwd_versionEv__ZN13fcwd_access_t8CopyPathER15_UNICODE_STRING__ZN13fcwd_access_t4FreeEPv__ZN13fcwd_access_t6FillInEPvP15_UNICODE_STRINGm__ZN13fcwd_access_t29SetDirHandleFromBufferPointerEPwPv__ZN13fcwd_access_t21SetVersionFromPointerEPhb__ZN8cwdstuff18override_win32_cwdEbm__ZZN8cwdstuff18override_win32_cwdEbmE19__PRETTY_FUNCTION____ZZL13find_fast_cwdvE19__PRETTY_FUNCTION____ZN8cwdstuff3setEP9path_convPKc__ZN8cwdstuff4initEv__ZNK8cwdstuff14get_error_descEv__ZN8cwdstuff11reset_posixEPw__ZN8cwdstuff3getEPciij__ZZN8cwdstuff3getEPciijE19__PRETTY_FUNCTION____ZZ6getcwdE19__PRETTY_FUNCTION___get_current_dir_name__Z20normalize_win32_pathPKcPcRS1___ZZ20normalize_win32_pathPKcPcRS1_E19__PRETTY_FUNCTION____Z20normalize_posix_pathPKcPcRS1___ZZ20normalize_posix_pathPKcPcRS1_E19__PRETTY_FUNCTION____ZN9path_conv5checkEPKcjPK11suffix_info__ZZN9path_conv5checkEPKcjPK11suffix_infoE19__PRETTY_FUNCTION___cygwin_conv_path__ZZ16cygwin_conv_pathE19__PRETTY_FUNCTION____ZL14conv_path_listPKcPcjj_cygwin_posix_to_win32_path_list__ZZ31cygwin_posix_to_win32_path_listE19__PRETTY_FUNCTION___cygwin_win32_to_posix_path_list__ZZ31cygwin_win32_to_posix_path_listE19__PRETTY_FUNCTION___env_PATH_to_posix__ZZ17env_PATH_to_posixE19__PRETTY_FUNCTION___cygwin_conv_to_full_posix_path_cygwin_conv_to_posix_path_cygwin_conv_to_full_win32_path_cygwin_conv_to_win32_path_cygwin_create_path__Z10warn_msdosPKc__ZZ5chdirE19__PRETTY_FUNCTION____ZZN13cygheap_fdgetC1EibbE19__PRETTY_FUNCTION____ZZ6fchdirE19__PRETTY_FUNCTION____Z14symlink_workerPKcS0_bb__ZZ14symlink_workerPKcS0_bbE19__PRETTY_FUNCTION____ZN9path_conv5checkEPK15_UNICODE_STRINGjPK11suffix_info__ZL23conv_path_list_buf_sizePKcb_cygwin_posix_to_win32_path_list_buf_size_cygwin_win32_to_posix_path_list_buf_size_cygwin_conv_path_list__ZZ21cygwin_conv_path_listE19__PRETTY_FUNCTION___readlink__ZZ8readlinkE19__PRETTY_FUNCTION___realpath__ZZ8realpathE19__PRETTY_FUNCTION___canonicalize_file_name__ZN3etc16test_file_changeEi__ZZN3etc16test_file_changeEiE19__PRETTY_FUNCTION____ZN3etc4initEiP18_OBJECT_ATTRIBUTES__ZZN3etc4initEiP18_OBJECT_ATTRIBUTESE19__PRETTY_FUNCTION____ZN3etc11dir_changedEi__ZZN3etc11dir_changedEiE9changed_h__ZZN3etc11dir_changedEiE19__PRETTY_FUNCTION____ZN3etc12file_changedEi__ZZN3etc12file_changedEiE19__PRETTY_FUNCTION___basename__ZZ8basenameE3buf__ZZ7dirnameE3buf__GLOBAL__I_stat_suffixes.data_cygwin_nocopy__ZL11status_exitm__ZZL11status_exitmE19__PRETTY_FUNCTION____ZN11pinfo_basicC2Ev__ZN11pinfo_basicC1Ev__ZN5pinfo13set_exit_codeEm__ZN5pinfo32maybe_set_exit_code_from_windowsEv__ZZN5pinfo32maybe_set_exit_code_from_windowsEvE19__PRETTY_FUNCTION____ZN5pinfo4exitEm__ZZN5pinfo4exitEmE19__PRETTY_FUNCTION____ZN5pinfo4initEimPv__ZZN5pinfo4initEimPvE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN5pinfo8thisprocEPv__ZGVZN5pinfo8thisprocEPvE15myself_identity__ZZN5pinfo8thisprocEPvE15myself_identity__ZZN5pinfo8thisprocEPvE19__PRETTY_FUNCTION____Z10pinfo_initPPci@8__ZZ10pinfo_initPPciE19__PRETTY_FUNCTION____ZN5pinfo7set_aclEv__ZZN5pinfo7set_aclEvE19__PRETTY_FUNCTION____ZN5pinfoC2EPvR13pinfo_minimali__ZZN5pinfoC1EPvR13pinfo_minimaliE19__PRETTY_FUNCTION____ZN5pinfoC1EPvR13pinfo_minimali__ZN6_pinfo5_cttyEPc__ZN6_pinfo8set_cttyEP16fhandler_termiosi__ZZN6_pinfo8set_cttyEP16fhandler_termiosiE19__PRETTY_FUNCTION____ZN6_pinfo6existsEv@4__ZN6_pinfo5aliveEv__Z15commune_processPv@4__ZZ15commune_processPvE19__PRETTY_FUNCTION____ZZN13cygheap_fdgetC1EibbE19__PRETTY_FUNCTION____ZN6_pinfo15commune_requestEjz__ZZN6_pinfo15commune_requestEjzE19__PRETTY_FUNCTION____ZN6_pinfo13pipe_fhandlerEPvRj__ZN6_pinfo2fdEiRj__ZN6_pinfo3fdsERj__ZN6_pinfo4rootERj__ZN6_pinfo3cwdERj__ZN6_pinfo7cmdlineERj__ZN5pinfo4waitEv__ZZN5pinfo4waitEvE19__PRETTY_FUNCTION____ZN6_pinfo12alert_parentEc__ZZN6_pinfo12alert_parentEcE19__PRETTY_FUNCTION____ZN5pinfo7releaseEv__Z41__static_initialization_and_destruction_0ii.clone.29__ZL11proc_waiterPv@4__ZZL11proc_waiterPvE19__PRETTY_FUNCTION___cygwin_winpid_to_pid__ZZ20cygwin_winpid_to_pidE19__PRETTY_FUNCTION____ZN7winpids14enum_processesEb__ZZN7winpids14enum_processesEbE7szprocs__ZZN7winpids14enum_processesEbE5procs__ZZN7winpids14enum_processesEbE19__PRETTY_FUNCTION____ZN7winpids3setEb__ZN7winpids9enum_initEb__ZN7winpids7releaseEv__ZN7winpidsD2Ev__ZN7winpidsD1Ev__GLOBAL__I__ZN11pinfo_basicC2Ev__GLOBAL__D__ZN11pinfo_basicC2Ev.data_cygwin_nocopy.text$_ZNK13fhandler_pipe6ispipeEv__ZNK13fhandler_pipe6ispipeEv.text$_ZNK13fhandler_pipe13get_popen_pidEv__ZNK13fhandler_pipe13get_popen_pidEv.text$_ZN13fhandler_pipe5cloneE13cygheap_types__ZN13fhandler_pipe5cloneE13cygheap_types.rdata$_ZTV13fhandler_pipe.text$_ZN13fhandler_pipeD1Ev__ZN13fhandler_pipeD1Ev__ZN13fhandler_pipe16get_proc_fd_nameEPc__ZN13fhandler_pipe5ioctlEjPv__ZZN13fhandler_pipe5ioctlEjPvE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN13fhandler_pipe3dupEP13fhandler_basei__ZZN13fhandler_pipe3dupEP13fhandler_baseiE19__PRETTY_FUNCTION____ZN13fhandler_pipe4initEPvmj.text$_ZN13fhandler_pipeD0Ev__ZN13fhandler_pipeD0Ev.text$_ZN13fhandler_pipe6copytoEP13fhandler_base__ZN13fhandler_pipe6copytoEP13fhandler_base__ZN13fhandler_pipe8fstatvfsEP7statvfs@8__ZZN13fhandler_pipe8fstatvfsEP7statvfsE19__PRETTY_FUNCTION____ZN13fhandler_pipe9ftruncateExb@16__ZZN13fhandler_pipe9ftruncateExbE19__PRETTY_FUNCTION____ZN13fhandler_pipe7fadviseExxi@24__ZZN13fhandler_pipe7fadviseExxiE19__PRETTY_FUNCTION____ZN13fhandler_pipe5lseekExi__ZZN13fhandler_pipe5lseekExiE19__PRETTY_FUNCTION____ZN13fhandler_pipe4openEij__ZZN13fhandler_pipe4openEijE19__PRETTY_FUNCTION____ZN13fhandler_pipeC2Ev__ZN13fhandler_pipeC1Ev__ZN13fhandler_pipe6createEP20_SECURITY_ATTRIBUTESPPvS3_mPKcm__ZZN13fhandler_pipe6createEP20_SECURITY_ATTRIBUTESPPvS3_mPKcmE19__PRETTY_FUNCTION____ZZN13fhandler_pipe6createEP20_SECURITY_ATTRIBUTESPPvS3_mPKcmE14pipe_unique_id__ZN13fhandler_pipe6createEPPS_ji__ZZN13fhandler_pipe6createEPPS_jiE19__PRETTY_FUNCTION____ZL11pipe_workerPiji__ZZN13cygheap_fdnewC1EibE19__PRETTY_FUNCTION____ZZ5_pipeE19__PRETTY_FUNCTION____ZZ4pipeE19__PRETTY_FUNCTION____ZZ5pipe2E19__PRETTY_FUNCTION____ZL14ipc_mutex_initPPvPKc__ZZL14ipc_mutex_initPPvPKcE19__PRETTY_FUNCTION____ZL13ipc_cond_initPPvPKcc__ZZL13ipc_cond_initPPvPKccE19__PRETTY_FUNCTION____ZL18ipc_cond_timedwaitPvS_PK8timespec__ZL14ipc_mutex_lockPv__ZZL14ipc_mutex_lockPvE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZL10check_pathPc10ipc_type_tPKcj__ZL9ipc_names__ZZL10check_pathPc10ipc_type_tPKcjE19__PRETTY_FUNCTION____ZL11_mq_receiveiPcjPjPK8timespec__ZZL11_mq_receiveiPcjPjPK8timespecE19__PRETTY_FUNCTION____ZL8_mq_sendiPKcjjPK8timespec__ZZL8_mq_sendiPKcjjPK8timespecE19__PRETTY_FUNCTION___shm_open__ZZ8shm_openE19__PRETTY_FUNCTION___shm_unlink__ZZ7mq_openE19__PRETTY_FUNCTION___mq_getattr__ZZ10mq_getattrE19__PRETTY_FUNCTION___mq_setattr__ZZ10mq_setattrE19__PRETTY_FUNCTION___mq_notify__ZZ9mq_notifyE19__PRETTY_FUNCTION___mq_timedsend_mq_receive_mq_timedreceive_mq_close__ZZ8mq_closeE19__PRETTY_FUNCTION___mq_unlink_sem_open__ZZ8sem_openE19__PRETTY_FUNCTION____Z10_sem_closePP9semaphoreb_sem_close_sem_unlink__ZL14__report_errorPKcz__ZZL14__report_errorPKczE18CYGWIN_FAILURE_MSG__ZZL14__report_errorPKczE14UNKNOWN_MODULE__ZL14__write_memoryPvPKvj__pei386_runtime_relocator_pthread_create_pthread_once_pthread_atfork_pthread_exit_pthread_join_pthread_detach_pthread_suspend_pthread_continue_pthread_getsequence_np_pthread_self_pthread_mutex_init_pthread_spin_init_pthread_cond_init_pthread_rwlock_init_pthread_cancel_pthread_setcancelstate_pthread_setcanceltype_pthread_testcancel__pthread_cleanup_push__pthread_cleanup_pop_sem_init_sem_destroy_sem_wait_sem_trywait_sem_timedwait_sem_post_sem_getvalue_setstate__ZL9rand_type__ZL5state__ZL7degrees__ZL4seps__ZL8rand_deg__ZL8rand_sep__ZL4rptr__ZL4fptr__ZL7end_ptr_initstate_srandomdev__ZL7randtbl_altoffset_allocset_p_b_coll_elem_wgetnext_p_b_symbol_xwcrtomb_ordinary_p_bracket_doinsert_regerror_null.2999_sstep.clone.2_sdissect_sbackref_lbackref_mbackref_lstep.clone.3_ldissect_mstep.clone.1_mdissect__ZL7top_keybmPPv__ZN7reg_key9build_regEP6HKEY__mPc__ZZN7reg_key9build_regEP6HKEY__mPcE19__PRETTY_FUNCTION____ZN7reg_keyC2EP6HKEY__mz__ZN7reg_keyC1EP6HKEY__mz__ZN7reg_keyC2Ebmz__ZN7reg_keyC1Ebmz__ZN7reg_key9get_dwordEPKwm__ZN7reg_key9set_dwordEPKwm__ZN7reg_key10get_stringEPKwPwjS1___ZN7reg_key10set_stringEPKwS1___ZN7reg_keyD2Ev__ZN7reg_keyD1Ev__Z22get_registry_hive_pathPKwPw@8__ZZ22get_registry_hive_pathPKwPwE19__PRETTY_FUNCTION____Z18load_registry_hivePKw@4__ZZ18load_registry_hivePKwE19__PRETTY_FUNCTION____Z10add_rusageP6rusageS0_@8__Z11fill_rusageP6rusagePv@8_getrusage__ZZ9getrusageE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION___getrlimit__ZZ9getrlimitE19__PRETTY_FUNCTION___setrlimit__ZZ9setrlimitE19__PRETTY_FUNCTION____ZL5tokenv__ZL5cfile__ZL6tokval__ZL6toktab_cygwin_rexec__ZL12__icheckhostPK8sockaddriPKc_cygwin_rresvport_af_cygwin_rcmd_af__ZZ14cygwin_rcmd_afE12canonnamebuf_cygwin_rcmd_cygwin_rresvport_iruserok_sa_iruserok_alphasort__ZZ7scandirE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION___sched_get_priority_max__ZZ22sched_get_priority_maxE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION___sched_get_priority_min__ZZ22sched_get_priority_minE19__PRETTY_FUNCTION___valid_sched_parameters_sched_getparam__ZZ14sched_getparamE19__PRETTY_FUNCTION___sched_getscheduler_sched_rr_get_interval__ZZ21sched_rr_get_intervalE9quantable__ZZ21sched_rr_get_intervalE19__PRETTY_FUNCTION___sched_setparam__ZZ14sched_setparamE19__PRETTY_FUNCTION___sched_set_thread_priority_sched_setscheduler__ZZ18sched_setschedulerE19__PRETTY_FUNCTION___sched_yield__ZL9searchaceP7__acl32iim__ZL6getaceR7__acl32iimm__ZL6acecmpPKvS0___ZL9permtostrj__ZZL9permtostrjE4pbuf__ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____Z6setaclPvR9path_conviP7__acl32Rb__ZZ6setaclPvR9path_conviP7__acl32RbE19__PRETTY_FUNCTION____ZZ5acl32E19__PRETTY_FUNCTION____ZZ6lacl32E19__PRETTY_FUNCTION____ZZN13cygheap_fdgetC1EibbE19__PRETTY_FUNCTION____ZZ6facl32E19__PRETTY_FUNCTION___aclcheck32_aclsort32__ZZ9aclsort32E19__PRETTY_FUNCTION____Z6getaclPvR9path_conviP7__acl32__ZZ6getaclPvR9path_conviP7__acl32E19__PRETTY_FUNCTION___acltomode32__ZZ11acltomode32E19__PRETTY_FUNCTION___aclfrommode32__ZZ13aclfrommode32E19__PRETTY_FUNCTION___acltopbits32_aclfrompbits32_acltotext32__ZZ11acltotext32E19__PRETTY_FUNCTION___aclfromtext32__ZZ13aclfromtext32E19__PRETTY_FUNCTION____ZZ4laclE19__PRETTY_FUNCTION___aclcheck_acltomode_aclfrommode_acltopbits_aclfrompbits_acltotext_aclfromtext__ZL37get_full_privileged_inheritable_tokenPv__ZZL37get_full_privileged_inheritable_tokenPvE19__PRETTY_FUNCTION____ZL18close_local_policyRPv__ZL15get_user_groupsPwR10cygsidlistS_S___ZZL15get_user_groupsPwR10cygsidlistS_S_E19__PRETTY_FUNCTION____ZL22get_unix_group_sidlistP6passwdR10cygsidlist.clone.11__ZL19sid_in_token_groupsP13_TOKEN_GROUPS7cygpsid__ZL23get_token_group_sidlistR10cygsidlistP13_TOKEN_GROUPS5_LUIDRi__ZL13get_priv_listPvR6cygsidR10cygsidlistRjP7cygpsid.clone.14__ZL9sys_privs__ZZL13get_priv_listPvR6cygsidR10cygsidlistRjP7cygpsidE19__PRETTY_FUNCTION____ZZL20get_system_priv_listRjE19__PRETTY_FUNCTION__.text$_ZNK7cygpsideqEPv__ZNK7cygpsideqEPv__Z13set_imp_tokenPvi__ZZ13set_imp_tokenPviE19__PRETTY_FUNCTION___cygwin_set_impersonation_token__Z19extract_nt_dom_userPK6passwdPwS2___ZZ19extract_nt_dom_userPK6passwdPwS2_E19__PRETTY_FUNCTION___cygwin_logon_user__ZZ17cygwin_logon_userE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____Z17open_local_policym__Z16get_logon_serverPwS_b__ZZ16get_logon_serverPwS_bE19__PRETTY_FUNCTION____Z17get_server_groupsR10cygsidlistPvP6passwd__ZZL21get_user_local_groupsPwS_R10cygsidlistS_E19__PRETTY_FUNCTION____ZL21get_setgroups_sidlistR10cygsidlistPvP6passwdP13_TOKEN_GROUPSR11user_groups5_LUIDRi__ZL22get_initgroups_sidlistR10cygsidlistPvS1_P6passwdP13_TOKEN_GROUPS5_LUIDRi__Z12verify_tokenPvR6cygsidR11user_groupsPb__ZZ12verify_tokenPvR6cygsidR11user_groupsPbE19__PRETTY_FUNCTION____Z12create_tokenR6cygsidR11user_groupsP6passwd__ZZ12create_tokenR6cygsidR11user_groupsP6passwdE19__PRETTY_FUNCTION____Z7lsaauthR6cygsidR11user_groupsP6passwd__ZZ7lsaauthR6cygsidR11user_groupsP6passwdE19__PRETTY_FUNCTION____ZZNK10cygsidlist11debug_printEPKcE19__PRETTY_FUNCTION____ZZNK6cygsid11debug_printEPKcE19__PRETTY_FUNCTION____Z14lsaprivkeyauthP6passwd__ZZ14lsaprivkeyauthP6passwdE19__PRETTY_FUNCTION____ZN7cygpsid6get_idEiPi__ZNK7cygpsid6stringEPw__ZNK7cygpsid6stringEPc__ZN6cygsid7get_sidEmmPmb__ZN6cygsid10getfromstrEPKcb__ZNK7cygpsideqEPKc__ZN6cygsid9getfrompwEPK6passwd__ZN6cygsid9getfromgrEPK9__group32__ZN10cygsidlist10alloc_sidsEi__ZN10cygsidlist9free_sidsEv__ZN10cygsidlist3addEPvb__Z13get_sids_info7cygpsidS_PmS0___ZZNK7cygpsid11debug_printEPKcE19__PRETTY_FUNCTION____ZN19security_descriptor4freeEv__ZN19security_descriptor7reallocEj__ZN19security_descriptor6mallocEj__Z14privilege_luidPwR5_LUIDRb__ZL7cygpriv__Z13set_privilegePvmb__ZZ13set_privilegePvmbE19__PRETTY_FUNCTION____Z21set_cygwin_privilegesPv__Z20init_global_securityv__ZZL11get_null_sdvE8null_sdp__ZZL11get_null_sdvE2sd__Z7sec_aclP4_ACLbbPvS1_m__ZZ7sec_aclP4_ACLbbPvS1_mE19__PRETTY_FUNCTION____Z10__sec_userPvS_S_mi@20__ZZ10__sec_userPvS_S_miE19__PRETTY_FUNCTION____Z12_recycler_sdPvbb__Z12_everyone_sdPvm__ZZ12_everyone_sdPvmE19__PRETTY_FUNCTION____GLOBAL__I_sec_none__ZL26well_known_null_sid_struct__ZL27well_known_world_sid_struct__ZL27well_known_local_sid_struct__ZL35well_known_console_logon_sid_struct__ZL35well_known_creator_owner_sid_struct__ZL35well_known_creator_group_sid_struct__ZL28well_known_dialup_sid_struct__ZL29well_known_network_sid_struct__ZL27well_known_batch_sid_struct__ZL33well_known_interactive_sid_struct__ZL29well_known_service_sid_struct__ZL41well_known_authenticated_users_sid_struct__ZL30well_known_this_org_sid_struct__ZL28well_known_system_sid_struct__ZL29well_known_builtin_sid_struct__ZL28well_known_admins_sid_struct__ZL27well_known_users_sid_struct__ZL21fake_logon_sid_struct__ZL37mandatory_medium_integrity_sid_struct__ZL35mandatory_high_integrity_sid_struct__ZL37mandatory_system_integrity_sid_struct__ZL42well_known_samba_unix_user_fake_sid_struct.data_cygwin_nocopy__ZL16get_info_from_sdP20_SECURITY_DESCRIPTORPjPmS2___ZZL16get_info_from_sdP20_SECURITY_DESCRIPTORPjPmS2_E19__PRETTY_FUNCTION____ZL12check_accessR19security_descriptorR16_GENERIC_MAPPINGmib.clone.20__ZZL12check_accessR19security_descriptorR16_GENERIC_MAPPINGmibE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZL10get_reg_sdPvR19security_descriptor__ZZL10get_reg_sdPvR19security_descriptorE19__PRETTY_FUNCTION____Z11get_file_sdPvR9path_convR19security_descriptorb@16__ZL12file_mapping__ZZ11get_file_sdPvR9path_convR19security_descriptorbE19__PRETTY_FUNCTION____Z11set_file_sdPvR9path_convR19security_descriptorb@16__Z17get_reg_attributeP6HKEY__PjPmS2_@16__Z18get_file_attributePvR9path_convPjPmS3_@20__Z22add_access_allowed_aceP4_ACLimPvRjm@24__Z21add_access_denied_aceP4_ACLimPvRjm@24__ZL8alloc_sdR9path_convmmiR19security_descriptor.clone.21__ZZNK6cygsid11debug_printEPKcE19__PRETTY_FUNCTION____ZZL8alloc_sdR9path_convmmiR19security_descriptorE19__PRETTY_FUNCTION____Z22set_security_attributeR9path_conviP20_SECURITY_ATTRIBUTESR19security_descriptor__Z13get_object_sdPvR19security_descriptor@8__ZZ13get_object_sdPvR19security_descriptorE19__PRETTY_FUNCTION____Z20get_object_attributePvPmS0_Pj@16__Z31create_object_sd_from_attributePvmmjR19security_descriptor@20__Z13set_object_sdPvR19security_descriptorb@12__Z20set_object_attributePvmmj@16__Z18set_file_attributePvR9path_convmmj@20__ZZ18set_file_attributePvR9path_convmmjE19__PRETTY_FUNCTION____Z17check_file_accessR9path_convib@12__ZZ17check_file_accessR9path_convibE19__PRETTY_FUNCTION____Z21check_registry_accessPvib@12__ZZ21check_registry_accessPvibE11reg_mapping__ZZ21check_registry_accessPvibE19__PRETTY_FUNCTION__.data_cygwin_nocopy__ZL11verify_trueP13select_recordP13_types_fd_setS2_S2___ZL10no_startupP13select_recordP12select_stuff__ZL9no_verifyP13select_recordP13_types_fd_setS2_S2___ZN17fhandler_dev_null11select_readEP12select_stuff__ZN17fhandler_dev_null12select_writeEP12select_stuff__ZN17fhandler_dev_null13select_exceptEP12select_stuff.text$_ZN17fhandler_dev_null5cloneE13cygheap_types__ZN17fhandler_dev_null5cloneE13cygheap_types.rdata$_ZTV17fhandler_dev_null.text$_ZN17fhandler_dev_nullD1Ev__ZN17fhandler_dev_nullD1Ev.text$_ZN17fhandler_dev_nullD0Ev__ZN17fhandler_dev_nullD0Ev__ZL16mailslot_cleanupP13select_recordP12select_stuff__ZL14serial_cleanupP13select_recordP12select_stuff__ZL12pipe_cleanupP13select_recordP12select_stuff__ZL17start_thread_pipeP13select_recordP12select_stuff__ZL19start_thread_serialP13select_recordP12select_stuff__ZL21start_thread_mailslotP13select_recordP12select_stuff__ZL8set_bitsP13select_recordP13_types_fd_setS2_S2___ZZL8set_bitsP13select_recordP13_types_fd_setS2_S2_E19__PRETTY_FUNCTION____ZL9verify_okP13select_recordP13_types_fd_setS2_S2___ZL11peek_socketP13select_recordb__ZZL11peek_socketP13select_recordbE19__PRETTY_FUNCTION____ZL19start_thread_socketP13select_recordP12select_stuff__ZZL19start_thread_socketP13select_recordP12select_stuffE19__PRETTY_FUNCTION____ZL13thread_socketPv@4__ZZL13thread_socketPvE19__PRETTY_FUNCTION____Z14socket_cleanupP13select_recordP12select_stuff__ZZ14socket_cleanupP13select_recordP12select_stuffE19__PRETTY_FUNCTION____ZL16verify_tty_slaveP13select_recordP13_types_fd_setS2_S2___ZL19pipe_data_availableiP13fhandler_basePvb__ZZL19pipe_data_availableiP13fhandler_basePvbE19__PRETTY_FUNCTION____ZL12peek_consoleP13select_recordb__ZZL12peek_consoleP13select_recordbE19__PRETTY_FUNCTION____ZL14verify_consoleP13select_recordP13_types_fd_setS2_S2_.text$_ZN17fhandler_dev_null6copytoEP13fhandler_base__ZN17fhandler_dev_null6copytoEP13fhandler_base__ZL13peek_mailslotP13select_recordb__ZZL13peek_mailslotP13select_recordbE19__PRETTY_FUNCTION____ZL15verify_mailslotP13select_recordP13_types_fd_setS2_S2___ZL15thread_mailslotPv@4__ZZL15thread_mailslotPvE19__PRETTY_FUNCTION____ZL12peek_windowsP13select_recordb__ZZL12peek_windowsP13select_recordbE19__PRETTY_FUNCTION____ZL14verify_windowsP13select_recordP13_types_fd_setS2_S2___ZL9peek_pipeP13select_recordb__ZZL9peek_pipeP13select_recordbE19__PRETTY_FUNCTION____ZL11thread_pipePv@4__ZZL11thread_pipePvE19__PRETTY_FUNCTION____ZL11peek_serialP13select_recordb__ZZL11peek_serialP13select_recordbE19__PRETTY_FUNCTION____ZL13thread_serialPv@4__ZZL13thread_serialPvE19__PRETTY_FUNCTION____ZN12select_stuff7cleanupEv__ZZN12select_stuff7cleanupEvE19__PRETTY_FUNCTION____ZN12select_stuffD2Ev__ZZN12select_stuff7destroyEvE19__PRETTY_FUNCTION____ZN12select_stuffD1Ev__ZN12select_stuff12test_and_setEiP13_types_fd_setS1_S1___ZN12select_stuff4waitEP13_types_fd_setS1_S1_m__ZZN12select_stuff4waitEP13_types_fd_setS1_S1_mE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN12select_stuff4pollEP13_types_fd_setS1_S1___ZL6selectiP13_types_fd_setS0_S0_m__ZZL6selectiP13_types_fd_setS0_S0_mE19__PRETTY_FUNCTION___cygwin_select__ZZ13cygwin_selectE19__PRETTY_FUNCTION____ZN13fhandler_pipe11select_readEP12select_stuff__ZN13fhandler_pipe12select_writeEP12select_stuff__ZN13fhandler_pipe13select_exceptEP12select_stuff__ZN13fhandler_fifo11select_readEP12select_stuff__ZN13fhandler_fifo12select_writeEP12select_stuff__ZN13fhandler_fifo13select_exceptEP12select_stuff__ZN16fhandler_console11select_readEP12select_stuff__ZN16fhandler_console12select_writeEP12select_stuff__ZN16fhandler_console13select_exceptEP12select_stuff__ZN19fhandler_pty_common11select_readEP12select_stuff__ZN19fhandler_pty_common12select_writeEP12select_stuff__ZN19fhandler_pty_common13select_exceptEP12select_stuff__ZN18fhandler_pty_slave11select_readEP12select_stuff__ZN15fhandler_serial11select_readEP12select_stuff__ZN15fhandler_serial12select_writeEP12select_stuff__ZN15fhandler_serial13select_exceptEP12select_stuff__ZN13fhandler_base11select_readEP12select_stuff__ZN13fhandler_base12select_writeEP12select_stuff__ZN13fhandler_base13select_exceptEP12select_stuff__ZN15fhandler_socket11select_readEP12select_stuff__ZN15fhandler_socket12select_writeEP12select_stuff__ZN15fhandler_socket13select_exceptEP12select_stuff__ZN16fhandler_windows11select_readEP12select_stuff__ZN16fhandler_windows12select_writeEP12select_stuff__ZN16fhandler_windows13select_exceptEP12select_stuff__ZN17fhandler_mailslot11select_readEP12select_stuff.text$_ZN18client_request_semD1Ev__ZN18client_request_semD1Ev.rdata$_ZTV18client_request_sem.text$_ZN18client_request_semD0Ev__ZN18client_request_semD0Ev__ZN18client_request_semC2EiiiP5semun__ZN18client_request_semC1EiiiP5semun__ZN18client_request_semC2Exii__ZN18client_request_semC1Exii__ZN18client_request_semC2EiP6sembufj__ZN18client_request_semC1EiP6sembufj__ZZ6semctlE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZZ6semgetE19__PRETTY_FUNCTION____ZZ5semopE19__PRETTY_FUNCTION__.text$_ZN21client_request_setpwdD1Ev__ZN21client_request_setpwdD1Ev.rdata$_ZTV21client_request_setpwd.text$_ZN21client_request_setpwdD0Ev__ZN21client_request_setpwdD0Ev__ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN21client_request_setpwdC2EP15_UNICODE_STRING__ZN21client_request_setpwdC1EP15_UNICODE_STRING__Z9setlsapwdPKcS0___ZZ9setlsapwdPKcS0_E19__PRETTY_FUNCTION____Z21get_shared_parent_dirv__ZL17shared_parent_dir__Z22get_session_parent_dirv__ZL18session_parent_dir__Z11shared_namePcPKci@12__Z11shared_namePwPKwi@12__Z11open_sharedPKwiRPvmP16shared_locationsP20_SECURITY_ATTRIBUTESm@28__ZL7offsets__ZZ11open_sharedPKwiRPvmP16shared_locationsP20_SECURITY_ATTRIBUTESmE19__PRETTY_FUNCTION____Z11open_sharedPKwiRPvm16shared_locationsP20_SECURITY_ATTRIBUTESm@28__ZN9user_info10initializeEv__ZN9user_info6createEb__ZZN9user_info6createEbE19__PRETTY_FUNCTION____Z14shared_destroyv@0__ZN11shared_info22init_obcaseinsensitiveEv__ZN11shared_info10initializeEv__ZZN11shared_info10initializeEvE19__PRETTY_FUNCTION____Z11memory_initb.data_cygwin_nocopy.text$_ZN18client_request_shmD1Ev__ZN18client_request_shmD1Ev.rdata$_ZTV18client_request_shm.text$_ZN18client_request_shmD0Ev__ZN18client_request_shmD0Ev__ZN18client_request_shmC2EiPKvi__ZN18client_request_shmC1EiPKvi__ZN18client_request_shmC2EiiP8shmid_ds__ZN18client_request_shmC1EiiP8shmid_ds__ZN18client_request_shmC2EPKv__ZN18client_request_shmC1EPKv__ZN18client_request_shmC2Exji__ZN18client_request_shmC1Exji__ZN18client_request_shmC2EP4proc__ZN18client_request_shmC1EP4proc__Z21fixup_shms_after_forkv@0__ZL8sph_list__ZZ21fixup_shms_after_forkvE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZZ6shmctlE19__PRETTY_FUNCTION____ZL9shm_guard__ZL8ssh_list__ZZ5shmdtE19__PRETTY_FUNCTION____ZZ6shmgetE19__PRETTY_FUNCTION____ZZ5shmatE19__PRETTY_FUNCTION__.data_cygwin_nocopy__sigfe_maybestabilize_sig_stack__ZL16sigaction_workeriPK9sigactionPS_b__ZZL16sigaction_workeriPK9sigactionPS_bE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZZ6signalE19__PRETTY_FUNCTION___clock_nanosleep__ZZ15clock_nanosleepE19__PRETTY_FUNCTION___nanosleep__ZZ9nanosleepE19__PRETTY_FUNCTION____ZZ6usleepE19__PRETTY_FUNCTION____Z18handle_sigprocmaskiPKmPmRm@16__ZZ18handle_sigprocmaskiPKmPmRmE19__PRETTY_FUNCTION___sigprocmask__ZZ11sigprocmaskE19__PRETTY_FUNCTION____ZN6_pinfo4killER9siginfo_t@8__ZZN6_pinfo4killER9siginfo_tE19__PRETTY_FUNCTION____Z9kill_pgrpiR9siginfo_t__ZZ9kill_pgrpiR9siginfo_tE19__PRETTY_FUNCTION____ZL5kill0iR9siginfo_t__ZZL5kill0iR9siginfo_tE19__PRETTY_FUNCTION____Z7killsysii_sigaction__ZZ9sigactionE19__PRETTY_FUNCTION___sigaddset__ZZ9sigaddsetE19__PRETTY_FUNCTION___sigdelset__ZZ9sigdelsetE19__PRETTY_FUNCTION___sigismember__ZZ11sigismemberE19__PRETTY_FUNCTION___sigemptyset_sigfillset_sigsuspend_sigpause_siginterrupt__ZZ12siginterruptE19__PRETTY_FUNCTION___sigwaitinfo__ZZ11sigwaitinfoE19__PRETTY_FUNCTION___sigqueue__ZZ8sigqueueE19__PRETTY_FUNCTION____ZL8talktomeP9siginfo_t__ZZL8talktomeP9siginfo_tE19__PRETTY_FUNCTION____ZL10my_readsig__ZL11remove_proci@4__ZL6cprocs__ZL6nprocs__ZZL11remove_prociE19__PRETTY_FUNCTION____Z8sigallocv@0__Z23signal_fixup_after_execv@0__Z10pid_existsi@4__Z12proc_subprocmm@8__ZL17sync_proc_subproc__ZZL13get_proc_lockmmE8lastwhat__ZZ12proc_subprocmmE19__PRETTY_FUNCTION____ZL10waitq_head__ZZL21stopped_or_terminatedP12struct_waitqP6_pinfoE19__PRETTY_FUNCTION____ZZL10checkstateP12struct_waitqE19__PRETTY_FUNCTION____ZZL13get_proc_lockmmE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN7_cygtls9remove_wqEm__ZN7_cygtls11signal_exitEi__ZL10my_sendsig__ZZN7_cygtls11signal_exitEiE19__PRETTY_FUNCTION____Z14proc_terminatev@0__ZZ14proc_terminatevE19__PRETTY_FUNCTION____Z21create_signal_arrivedv@0__Z12sigproc_initv@0__Z8sig_sendP6_pinfoR9siginfo_tP7_cygtls@12__ZZL21proc_can_be_signalledP6_pinfoE19__PRETTY_FUNCTION____ZZ8sig_sendP6_pinfoR9siginfo_tP7_cygtlsE19__PRETTY_FUNCTION____Z8sig_sendP6_pinfoi@8__ZL7sigheld__Z17sigproc_terminate11exit_states@4__ZZ17sigproc_terminate11exit_statesE19__PRETTY_FUNCTION____Z20sig_dispatch_pendingb@4__ZL4sigq_sigpending__Z9sig_cleari@4__ZL8wait_sigPv@4__ZZL8wait_sigPvE19__PRETTY_FUNCTION____ZN10child_infoC2Ej16child_info_typesb__ZZN10child_infoC1Ej16child_info_typesbE19__PRETTY_FUNCTION____ZN10child_infoC1Ej16child_info_typesb__ZN15child_info_forkC2Ev__ZN15child_info_forkC1Ev__ZN16child_info_spawnC2E16child_info_typesb__ZN16child_info_spawnC1E16child_info_typesb__ZN17cygheap_exec_info5allocEv__ZN16child_info_spawn15wait_for_myselfEv__ZN10child_info7cleanupEv__ZN10child_infoD2Ev__ZN10child_infoD1Ev__ZN16child_info_spawn7cleanupEv__ZN16child_info_spawn15record_childrenEv__ZN16child_info_spawn17reattach_childrenEv__ZN10child_info5readyEb__ZZN10child_info5readyEbE19__PRETTY_FUNCTION____ZN10child_info4syncEiRPvm__ZZN10child_info4syncEiRPvmE19__PRETTY_FUNCTION____ZN10child_info10proc_retryEPv__ZZN10child_info10proc_retryEPvE19__PRETTY_FUNCTION____ZN15child_info_fork5abortEPKcz__ZZN15child_info_fork5abortEPKczE19__PRETTY_FUNCTION____ZN15pending_signals3addER9sigpacket__ZN15pending_signals3delEv__ZN15pending_signals4nextEv.data_cygwin_nocopy@_ZL4__rnPciixiiy@36__ZL7hex_str@_ZL5__wrnPwiixiiy@36__Z16__small_vsprintfPcPKcS___Z15__small_sprintfPcPKcz_small_printf__Z17__small_vswprintfPwPKwPc__Z16__small_swprintfPwPKwz__ZL10do_cleanupPv__ZL14perhaps_suffixPKcR9path_convRij__ZL12exe_suffixes__ZZL14perhaps_suffixPKcR9path_convRijE19__PRETTY_FUNCTION____Z41__static_initialization_and_destruction_0ii.clone.49__ZL6handleib__ZZN13cygheap_fdgetC1EibbE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____Z9find_execPKcR9path_convS0_jPS0_@20__ZZ9find_execPKcR9path_convS0_jPS0_E19__PRETTY_FUNCTION____Z5iscmdPKcS0___ZN2av5fixupEPKcR9path_convS1_b__ZZN2av5fixupEPKcR9path_convS1_bE19__PRETTY_FUNCTION____ZN16child_info_spawn6workerEPKcPKS1_S3_iii__ZZN16child_info_spawn6workerEPKcPKS1_S3_iiiE19__PRETTY_FUNCTION____ZZ7spawnveE19__PRETTY_FUNCTION____ZZ7spawnveE9empty_env_spawnvpe_spawnlpe__GLOBAL__I__Z9find_execPKcR9path_convS0_jPS0__20__GLOBAL__D__Z9find_execPKcR9path_convS0_jPS0__20.data_cygwin_nocopy__ZN6strace12microsecondsEv__ZZN6strace12microsecondsEvE3now__ZN6strace7vsprntfEPcPKcS2_S0___ZZN6strace7vsprntfEPcPKcS2_S0_E9nonewline__ZN6strace5writeEjPKci__ZN6strace14write_childpidEm__ZN6strace6vprntfEjPKcS1_Pc__ZN6strace5prntfEjPKcS1_z__ZN6strace8dll_infoEv__ZN6strace8activateEb_strace_printf__ZN6strace2wmEiii__GLOBAL__I_strace.data_cygwin_nocopy___setup_vars_negative.10243___calc_left_pad__ZL11__db_mbtowcP6_reentPwPKcjjP10_mbstate_t.clone.0__ZL11__db_wctombP6_reentPcwj.clone.1__Z15transform_charsPwS___ZL9tfx_chars___sjis_wctomb___eucjp_wctomb___gbk_wctomb___kr_wctomb___big5_wctomb___sjis_mbtowc___eucjp_mbtowc___gbk_mbtowc___kr_mbtowc___big5_mbtowc__Z15sys_cp_wcstombsPFiP6_reentPcwPKcP10_mbstate_tES3_S1_jPKwj@24__ZL13tfx_rev_chars__Z12sys_wcstombsPcjPKwj@16__Z18sys_wcstombs_allocPPciPKwj@16__Z15sys_cp_mbstowcsPFiP6_reentPwPKcjS3_P10_mbstate_tES3_S1_jS3_j@24__Z12sys_mbstowcsPwjPKcj@16__Z18sys_mbstowcs_allocPPwiPKcj@16_strccpy@12_RtlInt64ToHexUnicodeString@16__ZL10hex_wchars__ZL8conv_numPKhPijjP13_alt_digits_t__ZL13free_era_infoP11_era_info_t__ZL11find_stringPKhPiPKPKcS5_i__ZL10__strptimePKcS0_P2tmPP11_era_info_tPP13_alt_digits_t__ZL18_DAYS_BEFORE_MONTH_strptime_strsignal__ZL7siglist_strtosigno_psiginfo.data_cygwin_nocopy__ZN4muto4grabEv__ZN4muto4initEPKc__ZN4muto7acquireEm__ZN4muto8acquiredEv__ZN4muto7releaseEv.data_cygwin_nocopy_ascii_strcasematch__ZL14setmode_helperP9__sFILE64__ZZL14setmode_helperP9__sFILE64E19__PRETTY_FUNCTION____ZL14copy_ut_to_utxP4utmpP5utmpx__ZL12mknod_workerPKcjjtt@20__ZL17start_transactionRPvS0___ZZL17start_transactionRPvS0_E19__PRETTY_FUNCTION____ZL19check_dir_not_emptyPvR9path_conv__ZZL19check_dir_not_emptyPvR9path_convE19__PRETTY_FUNCTION____ZL29nt_path_has_executable_suffixP15_UNICODE_STRING.clone.8__ZZL29nt_path_has_executable_suffixP15_UNICODE_STRINGE27blessed_executable_suffixes__ZL20rename_append_suffixR9path_convPKcjS2___ZL12chown_workerPKcjmm__ZZL12chown_workerPKcjmmE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZL16gen_full_path_atPciPKcb__ZZL16gen_full_path_atPciPKcbE19__PRETTY_FUNCTION____ZZN13cygheap_fdgetC1EibbE19__PRETTY_FUNCTION__.text$NtSetAttributesFile_NtSetAttributesFile@8__ZL10try_to_binR9path_convRPvm__ZZL10try_to_binR9path_convRPvmE19__PRETTY_FUNCTION____ZL11desktop_ini__ZL5info2__ZL15desktop_ini_ext.text$_ZNK9path_conv14is_lnk_specialEv__ZNK9path_conv14is_lnk_specialEv.text$_ZN9path_convC1EPKcjPK11suffix_info__ZN9path_convC1EPKcjPK11suffix_info.text$_ZN13cygheap_fdgetC1Eibb__ZN13cygheap_fdgetC1Eibb__Z15close_all_filesb@4__ZZ3dupE19__PRETTY_FUNCTION____ZZN13cygheap_fdnewC1EibE19__PRETTY_FUNCTION____ZZ4dup2E19__PRETTY_FUNCTION____ZZ4dup3E19__PRETTY_FUNCTION____Z9unlink_ntR9path_conv__ZZ9unlink_ntR9path_convE19__PRETTY_FUNCTION____ZZ6unlinkE19__PRETTY_FUNCTION____remove_r__ZZ9_remove_rE19__PRETTY_FUNCTION____ZZ6removeE19__PRETTY_FUNCTION____ZZ6getpidE19__PRETTY_FUNCTION____getpid_r__ZZ7getppidE19__PRETTY_FUNCTION____ZZ6setsidE19__PRETTY_FUNCTION____ZZ6getsidE19__PRETTY_FUNCTION____ZZ4readE19__PRETTY_FUNCTION____ZZ5readvE19__PRETTY_FUNCTION____ZZ5preadE19__PRETTY_FUNCTION____ZZ5writeE19__PRETTY_FUNCTION____ZZ6writevE19__PRETTY_FUNCTION____ZZ6pwriteE19__PRETTY_FUNCTION____ZZ4openE19__PRETTY_FUNCTION____ZZ7lseek64E19__PRETTY_FUNCTION____ZL13locked_appendiPKvj.clone.76__ZZ5closeE19__PRETTY_FUNCTION____ZZ6isattyE19__PRETTY_FUNCTION____ZZ4linkE19__PRETTY_FUNCTION___lchown32_fchown32__ZZ8fchown32E19__PRETTY_FUNCTION____Z12chmod_deviceR9path_convj__ZZ5chmodE19__PRETTY_FUNCTION____ZZ6fchmodE19__PRETTY_FUNCTION____ZZ5fsyncE19__PRETTY_FUNCTION____ZZL11sync_workerPvtPKwE19__PRETTY_FUNCTION____ZZ4syncE19__PRETTY_FUNCTION____ZZ6stat64E19__PRETTY_FUNCTION____ZN13fhandler_base10stat_fixupEP8__stat64__ZL13dev_st_inited__ZL6dev_st__Z11stat_workerR9path_convP8__stat64@8__ZZ11stat_workerR9path_convP8__stat64E19__PRETTY_FUNCTION____ZZ7fstat64E19__PRETTY_FUNCTION____fstat_r__fstat64_r__stat64_r__ZZ7lstat64E19__PRETTY_FUNCTION____ZZ6accessE19__PRETTY_FUNCTION___euidaccess__ZZ10euidaccessE19__PRETTY_FUNCTION____ZZ6renameE19__PRETTY_FUNCTION___setdtablesize_getdtablesize_getpagesize_fpathconf_pathconf__ZZ8pathconfE19__PRETTY_FUNCTION___ttyname_r__ZZ9ttyname_rE19__PRETTY_FUNCTION____ZZ7ttynameE4name__ZZ7ttynameE19__PRETTY_FUNCTION____cygwin_istext_for_stdio__ZZ24_cygwin_istext_for_stdioE19__PRETTY_FUNCTION____ZZ7setmodeE19__PRETTY_FUNCTION___cygwin_setmode_posix_fadvise__ZZ13posix_fadviseE19__PRETTY_FUNCTION___posix_fallocate__ZZ15posix_fallocateE19__PRETTY_FUNCTION___ftruncate64__ZZ11ftruncate64E19__PRETTY_FUNCTION___ftruncate_truncate64__ZZ10truncate64E19__PRETTY_FUNCTION___truncate_get_osfhandle__ZZ13get_osfhandleE19__PRETTY_FUNCTION___fstatvfs__ZZ7statvfsE19__PRETTY_FUNCTION____ZZ7setpgidE19__PRETTY_FUNCTION____ZZ7getpgidE19__PRETTY_FUNCTION___ptsname_r__ZZ9ptsname_rE19__PRETTY_FUNCTION____ZZ7ptsnameE3buf__ZZ7mknod32E19__PRETTY_FUNCTION___seteuid32__ZZ9seteuid32E19__PRETTY_FUNCTION___setuid32__ZZ8setuid32E19__PRETTY_FUNCTION___setreuid32__ZZ10setreuid32E19__PRETTY_FUNCTION___setreuid_setegid32__ZZ9setegid32E19__PRETTY_FUNCTION___setgid32_setregid32__ZZ10setregid32E19__PRETTY_FUNCTION___setregid__ZZ6chrootE19__PRETTY_FUNCTION_____assertfail__ZZ7vhangupE19__PRETTY_FUNCTION___setpriority__ZZ11setpriorityE19__PRETTY_FUNCTION___getpriority__ZZ11getpriorityE19__PRETTY_FUNCTION____ZZ3ffsE5table_endutent__ZL7utmp_fd__ZL13utmp_readonly__ZL17internal_setutentb__ZL9utmp_file_setutent_utmpname__ZZ8utmpnameE19__PRETTY_FUNCTION___getutent__ZL4utix__ZL13utmp_data_buf_getutline_pututline__ZZ9pututlineE19__PRETTY_FUNCTION___setutxent_endutxent_getutxent__ZZ9getutxentE3utx_getutxid__ZZ8getutxidE3utx_getutxline__ZZ10getutxlineE3utx_pututxline__ZZ10pututxlineE3utx_updwtmpx_gethostid__ZZ9gethostidE19__PRETTY_FUNCTION___getusershell__ZL8shell_fp__ZZ12getusershellE3buf__ZL11shell_index__ZZ12getusershellE10def_shells_setusershell_endusershell_flockfile_ftrylockfile_funlockfile__ZZ5popenE19__PRETTY_FUNCTION____ZZ6pcloseE19__PRETTY_FUNCTION___faccessat__ZZ9faccessatE19__PRETTY_FUNCTION___fchmodat__ZZ8fchmodatE19__PRETTY_FUNCTION___fchownat__ZZ8fchownatE19__PRETTY_FUNCTION____ZZ7fstatatE19__PRETTY_FUNCTION___utimensat__ZZ9utimensatE19__PRETTY_FUNCTION___futimesat__ZZ6linkatE19__PRETTY_FUNCTION___mkfifoat_readlinkat_renameat_scandirat_symlinkat_unlinkat__ZZ8unlinkatE19__PRETTY_FUNCTION____lseek64_fdatasync_utmpxname.data_cygwin_nocopy__ZL13get_page_sizei__ZL10get_avphysi__ZZL10get_avphysiE19__PRETTY_FUNCTION____ZL16get_nproc_valuesi__ZZL16get_nproc_valuesiE19__PRETTY_FUNCTION____ZL12get_open_maxi__ZZ7sysconfE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZZ7confstrE19__PRETTY_FUNCTION___get_nprocs_conf_get_nprocs_get_phys_pages_get_avphys_pages__ZZ7sysinfoE19__PRETTY_FUNCTION____ZL15connect_syslogdv__ZL14syslogd_inited__ZL12syslogd_sock__ZZL15connect_syslogdvE19__PRETTY_FUNCTION____ZZ7openlogE19__PRETTY_FUNCTION____ZL14syslog_globals_setlogmask__ZN12pass_handlerC2Ev__ZN12pass_handlerC1Ev__ZN12pass_handler8shutdownEv__ZN12pass_handlerD2Ev__ZN12pass_handlerD1Ev__ZN12pass_handler10initializeEi__ZZN12pass_handler10initializeEiE19__PRETTY_FUNCTION____ZN12pass_handler8print_vaEPKcPc__ZZN12pass_handler8print_vaEPKcPcE19__PRETTY_FUNCTION____ZN12pass_handler5printEPKcz_CSWTCH.64__ZL17try_connect_guard__ZZ7vsyslogE19__PRETTY_FUNCTION____ZL10klog_guard_closelog.data_cygwin_nocopy_tcsendbreak__ZZ11tcsendbreakE19__PRETTY_FUNCTION____ZZN13cygheap_fdgetC1EibbE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZZ7tcdrainE19__PRETTY_FUNCTION____ZZ7tcflushE19__PRETTY_FUNCTION____ZZ6tcflowE19__PRETTY_FUNCTION___tcsetattr__ZZ9tcsetattrE19__PRETTY_FUNCTION____ZZNK15cygheap_fdmanip6isopenEvE19__PRETTY_FUNCTION___tcgetattr__ZZ9tcgetattrE19__PRETTY_FUNCTION___tcgetpgrp__ZZ9tcgetpgrpE19__PRETTY_FUNCTION___tcgetsid__ZZ8tcgetsidE19__PRETTY_FUNCTION___tcsetpgrp__ZZ9tcsetpgrpE19__PRETTY_FUNCTION___cfgetospeed_cfgetispeed_cfsetospeed__ZZL8setspeedRjjE19__PRETTY_FUNCTION___cfsetispeed_cfmakeraw.text$_ZN17verifyable_objectD1Ev__ZN17verifyable_objectD1Ev.rdata$_ZTV17verifyable_object__ZN12pthread_attrD2Ev__ZN12pthread_attrD1Ev__ZN16pthread_condattrD2Ev__ZN16pthread_condattrD1Ev__ZN18pthread_rwlockattrD2Ev__ZN18pthread_rwlockattrD1Ev__ZN17pthread_mutexattrD2Ev__ZN17pthread_mutexattrD1Ev__ZN7pthread14getsequence_npEv__ZN12pthread_null6createEPFPvS0_EP12pthread_attrS0___ZN12pthread_null6cancelEv__ZN12pthread_null10testcancelEv__ZN12pthread_null14setcancelstateEiPi__ZN12pthread_null13setcanceltypeEiPi__ZN12pthread_null20push_cleanup_handlerEP24_pthread_cleanup_handler__ZN12pthread_null19pop_cleanup_handlerEi__ZN12pthread_null14getsequence_npEv__ZN13pthread_mutex17_fixup_after_forkEv__ZZN13pthread_mutex17_fixup_after_forkEvE19__PRETTY_FUNCTION____ZN12pthread_null4exitEPv.text$_ZN17verifyable_objectD0Ev__ZN17verifyable_objectD0Ev__ZN17pthread_mutexattrD0Ev__ZN18pthread_rwlockattrD0Ev__ZN16pthread_condattrD0Ev__ZN12pthread_attrD0Ev__ZN9semaphore17_fixup_after_forkEv__ZZN9semaphore17_fixup_after_forkEvE19__PRETTY_FUNCTION____ZN11pthread_key18_fixup_before_forkEv__ZN11pthread_key14run_destructorEv__ZN11pthread_key17_fixup_after_forkEv__ZN11pthread_keyD2Ev.rdata$_ZTV11pthread_key__ZN11pthread_keyD1Ev__ZN11pthread_keyD0Ev__ZN13pthread_mutexD2Ev.rdata$_ZTV13pthread_mutex__ZN13pthread_mutexD1Ev.text$_ZN16pthread_spinlockD1Ev__ZN16pthread_spinlockD1Ev.rdata$_ZTV16pthread_spinlock.text$_ZN16pthread_spinlockD0Ev__ZN16pthread_spinlockD0Ev__ZN13pthread_mutexD0Ev__ZN12pthread_condD2Ev.rdata$_ZTV12pthread_cond__ZN12pthread_condD1Ev__ZN12pthread_condD0Ev__ZN14pthread_rwlockD2Ev.rdata$_ZTV14pthread_rwlock__ZN14pthread_rwlockD1Ev__ZN14pthread_rwlockD0Ev__ZN7pthreadD2Ev.rdata$_ZTV7pthread__ZN7pthreadD1Ev__ZN12pthread_nullD2Ev.rdata$_ZTV12pthread_null__ZN12pthread_nullD1Ev__ZN12pthread_nullD0Ev__ZN7pthreadD0Ev__ZN9semaphoreD2Ev.rdata$_ZTV9semaphore__ZN9semaphoreD1Ev__ZN9semaphoreD0Ev___getreent___cygwin_lock_init___cygwin_lock_init_recursive.text$_ZN7pthread14is_good_objectEPKPS___ZN7pthread14is_good_objectEPKPS___ZN11MTinterface17fixup_before_forkEv__ZN7pthread4selfEv__ZN7pthread17_fixup_after_forkEv__ZN7pthread20push_cleanup_handlerEP24_pthread_cleanup_handler__ZN7pthread20set_tls_self_pointerEPS___ZN7pthread19create_cancel_eventEv__ZZN7pthread19create_cancel_eventEvE19__PRETTY_FUNCTION____ZN7pthread9precreateEP12pthread_attr__ZZN7pthread9precreateEP12pthread_attrE19__PRETTY_FUNCTION____ZN7pthread10postcreateEv__ZN7pthread16get_cancel_eventEv__ZN7pthread24pop_all_cleanup_handlersEv__ZN7pthread13get_thread_idEv__ZN7pthread19suspend_except_selfEv__ZN7pthread6resumeEv__ZN12pthread_attrC2Ev.rdata$_ZTV12pthread_attr__ZN12pthread_attrC1Ev__ZN16pthread_condattrC2Ev.rdata$_ZTV16pthread_condattr__ZN16pthread_condattrC1Ev__ZN12pthread_cond10init_mutexEv__ZZN10fast_mutex4initEvE19__PRETTY_FUNCTION____ZN18pthread_rwlockattrC2Ev.rdata$_ZTV18pthread_rwlockattr__ZN18pthread_rwlockattrC1Ev__ZN14pthread_rwlock10init_mutexEv__ZN14pthread_rwlock10add_readerEPNS_13RWLOCK_READERE__ZN14pthread_rwlock13remove_readerEPNS_13RWLOCK_READERE__ZN14pthread_rwlock13lookup_readerEP7pthread__ZN11pthread_keyC2EPFvPvE__ZN11pthread_keyC1EPFvPvE__ZN13pthread_mutex10init_mutexEv__ZN11MTinterface4InitEv__ZN13pthread_mutexC2EP17pthread_mutexattr__ZN13pthread_mutexC1EP17pthread_mutexattr__ZN12pthread_condC2EP16pthread_condattr__ZZN12pthread_condC1EP16pthread_condattrE19__PRETTY_FUNCTION____ZN12pthread_condC1EP16pthread_condattr__ZN14pthread_rwlockC2EP18pthread_rwlockattr__ZZN14pthread_rwlockC1EP18pthread_rwlockattrE19__PRETTY_FUNCTION____ZN14pthread_rwlockC1EP18pthread_rwlockattr__ZN7pthreadC2Ev__ZN7pthreadC1Ev__ZN7pthread15init_mainthreadEv__ZN11MTinterface16fixup_after_forkEv__Z41__static_initialization_and_destruction_0ii.clone.20__ZN13pthread_mutex4lockEv__ZZN13pthread_mutex4lockEvE19__PRETTY_FUNCTION____ZN13pthread_mutex6unlockEv__ZZN13pthread_mutex6unlockEvE19__PRETTY_FUNCTION____ZZN13pthread_mutex8no_ownerEvE19__PRETTY_FUNCTION____ZN7pthread19thread_init_wrapperEPv@4__ZZN7pthread19thread_init_wrapperEPvE19__PRETTY_FUNCTION____ZN12pthread_cond17_fixup_after_forkEv__ZN12pthread_cond7unblockEb__ZN14pthread_rwlock14wrlock_cleanupEPv__ZN14pthread_rwlock14rdlock_cleanupEPv__ZN7pthread13setcanceltypeEiPi__ZN7pthread14setcancelstateEiPi__ZN7pthread6createEPFPvS0_EP12pthread_attrS0___ZZN7pthread6createEPFPvS0_EP12pthread_attrS0_E19__PRETTY_FUNCTION____ZN14pthread_rwlock17_fixup_after_forkEv__ZN14pthread_rwlock9trywrlockEv__ZN7pthread19pop_cleanup_handlerEi__ZN7pthread4exitEPv__ZN7pthread11cancel_selfEv__ZN7pthread18static_cancel_selfEv__ZN7pthread10testcancelEv__ZN12pthread_cond4waitEP13pthread_mutexP14_LARGE_INTEGER__ZN14pthread_rwlock6wrlockEv__ZN7pthread6cancelEv__ZN14pthread_rwlock9tryrdlockEv__ZN14pthread_rwlock6rdlockEv__ZN14pthread_rwlock6unlockEv__ZN13pthread_mutex7trylockEv__ZN13pthread_mutex7destroyEv__ZN17pthread_mutexattrC2Ev.rdata$_ZTV17pthread_mutexattr__ZN17pthread_mutexattrC1Ev__ZN16pthread_spinlockC2Ei__ZN16pthread_spinlockC1Ei__ZN16pthread_spinlock4lockEv__ZZN16pthread_spinlock4lockEvE19__PRETTY_FUNCTION____ZN16pthread_spinlock6unlockEv__ZZN16pthread_spinlock6unlockEvE19__PRETTY_FUNCTION____ZN7pthread6createEPPS_PKP12pthread_attrPFPvS6_ES6___ZN7pthread6cancelEPS___ZN7pthread13atforkprepareEv__ZN7pthread12atforkparentEv__ZN7pthread11atforkchildEv__ZN7pthread6atforkEPFvvES1_S1__pthread_attr_init_pthread_attr_getinheritsched_pthread_attr_getschedparam_pthread_attr_getschedpolicy_pthread_attr_getscope_pthread_attr_setdetachstate_pthread_attr_getdetachstate_pthread_attr_setinheritsched_pthread_attr_setschedparam_pthread_attr_setschedpolicy_pthread_attr_setscope_pthread_attr_setstack_pthread_attr_getstack_pthread_attr_setstackaddr_pthread_attr_getstackaddr_pthread_attr_setstacksize_pthread_attr_getstacksize_pthread_attr_setguardsize_pthread_attr_getguardsize_pthread_attr_destroy__ZN7pthread4joinEPPS_PPv__ZN7pthread6detachEPPS___ZN7pthread7suspendEPPS___ZN7pthread6resumeEPPS__pthread_getattr_np__ZZ18pthread_getattr_npE19__PRETTY_FUNCTION___pthread_getconcurrency_pthread_getcpuclockid_pthread_getschedparam_pthread_key_create_pthread_key_delete_pthread_setconcurrency_pthread_setschedparam_pthread_setschedprio_pthread_setspecific_pthread_getspecific_pthread_cond_destroy__ZN12pthread_cond4initEPPS_PKP16pthread_condattr__ZL24__pthread_cond_wait_initPP12pthread_condPP13pthread_mutex__ZZN13pthread_mutex15can_be_unlockedEvE19__PRETTY_FUNCTION___pthread_cond_broadcast_pthread_cond_signal_pthread_cond_timedwait_pthread_cond_wait_pthread_condattr_init_pthread_condattr_getpshared_pthread_condattr_setpshared_pthread_condattr_getclock_pthread_condattr_setclock_pthread_condattr_destroy_pthread_rwlock_destroy__ZN14pthread_rwlock4initEPPS_PKP18pthread_rwlockattr_pthread_rwlock_rdlock_pthread_rwlock_tryrdlock_pthread_rwlock_wrlock_pthread_rwlock_trywrlock_pthread_rwlock_unlock_pthread_rwlockattr_init_pthread_rwlockattr_getpshared_pthread_rwlockattr_setpshared_pthread_rwlockattr_destroy_pthread_kill_pthread_sigmask__ZZ15pthread_sigmaskE19__PRETTY_FUNCTION___pthread_sigqueue_pthread_equal__ZN13pthread_mutex4initEPPS_PKP17pthread_mutexattrS0___ZZN13pthread_mutex4initEPPS_PKP17pthread_mutexattrS0_E19__PRETTY_FUNCTION___pthread_mutex_getprioceiling_pthread_mutex_lock___cygwin_lock_lock__ZZ18__cygwin_lock_lockE19__PRETTY_FUNCTION___pthread_mutex_trylock___cygwin_lock_trylock_pthread_mutex_unlock___cygwin_lock_unlock__ZZ20__cygwin_lock_unlockE19__PRETTY_FUNCTION____ZN7pthread4onceEP12pthread_oncePFvvE_pthread_mutex_destroy___cygwin_lock_fini_pthread_mutex_setprioceiling__ZN16pthread_spinlock4initEPPS_i__ZZN16pthread_spinlock4initEPPS_iE19__PRETTY_FUNCTION___pthread_spin_lock_pthread_spin_trylock_pthread_spin_unlock_pthread_spin_destroy_pthread_mutexattr_getprotocol_pthread_mutexattr_getpshared_pthread_mutexattr_gettype_pthread_mutexattr_init_pthread_mutexattr_destroy_pthread_mutexattr_setprotocol_pthread_mutexattr_setprioceiling_pthread_mutexattr_getprioceiling_pthread_mutexattr_setpshared_pthread_mutexattr_settype__ZN9semaphoreC2Eij__ZN9semaphoreC1Eij__ZN9semaphoreC2Ey5_LUIDiPPS_ijj__ZN9semaphoreC1Ey5_LUIDiPPS_ijj__ZN9semaphore5_postEv__ZN9semaphore9_getvalueEPi__ZZN9semaphore9_getvalueEPiE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN9semaphore8_trywaitEv__ZZN9semaphore8_trywaitEvE19__PRETTY_FUNCTION____ZN9semaphore10_timedwaitEPK8timespec__ZZN9semaphore10_timedwaitEPK8timespecE19__PRETTY_FUNCTION____ZN9semaphore5_waitEv__ZZN9semaphore5_waitEvE19__PRETTY_FUNCTION____ZN9semaphore10_terminateEv__ZN9semaphore4initEPPS_ij__ZZN9semaphore4initEPPS_ijE19__PRETTY_FUNCTION____ZN9semaphore7destroyEPPS___ZZN9semaphore7destroyEPPS_E19__PRETTY_FUNCTION____ZN9semaphore5closeEPPS___ZZN9semaphore5closeEPPS_E19__PRETTY_FUNCTION____ZN9semaphore4openEy5_LUIDiijjRb__ZZN9semaphore4openEy5_LUIDiijjRbE19__PRETTY_FUNCTION____ZN9semaphore4waitEPPS___ZZN9semaphore4waitEPPS_E19__PRETTY_FUNCTION____ZN9semaphore7trywaitEPPS___ZZN9semaphore7trywaitEPPS_E19__PRETTY_FUNCTION____ZN9semaphore9timedwaitEPPS_PK8timespec__ZZN9semaphore9timedwaitEPPS_PK8timespecE19__PRETTY_FUNCTION____ZN9semaphore4postEPPS___ZZN9semaphore4postEPPS_E19__PRETTY_FUNCTION____ZN9semaphore8getvalueEPPS_Pi__ZZN9semaphore8getvalueEPPS_PiE19__PRETTY_FUNCTION____ZN9semaphore11getinternalEPPS_PiPyP5_LUIDPj__ZZN9semaphore11getinternalEPPS_PiPyP5_LUIDPjE19__PRETTY_FUNCTION____ZN12pthread_null16get_null_pthreadEv__ZN12pthread_nullC2Ev__ZN12pthread_nullC1Ev__GLOBAL__I__ZN13pthread_mutex10_new_mutexE__GLOBAL__D__ZN13pthread_mutex10_new_mutexE.data_cygwin_nocopy__ZL12timer_threadPv@4__ZZL12timer_threadPvE19__PRETTY_FUNCTION____ZL6it_badRK8timespec__ZZL6it_badRK8timespecE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN18lock_timer_trackerC2Ev__ZN18lock_timer_trackerC1Ev__ZN18lock_timer_trackerD2Ev__ZN18lock_timer_trackerD1Ev__ZN13timer_tracker6cancelEv__ZN13timer_trackerD2Ev__ZN13timer_trackerD1Ev__ZN13timer_trackerC2EmPK8sigevent__ZN13timer_trackerC1EmPK8sigevent__Z41__static_initialization_and_destruction_0ii.clone.4__ZN13timer_tracker7gettimeEP10itimerspec__ZN13timer_tracker7settimeEiPK10itimerspecPS0___ZZN13timer_tracker7settimeEiPK10itimerspecPS0_E19__PRETTY_FUNCTION___timer_gettime__ZZ13timer_gettimeE19__PRETTY_FUNCTION___timer_create__ZZ12timer_createE19__PRETTY_FUNCTION___timer_settime__ZZ13timer_settimeE19__PRETTY_FUNCTION___timer_delete__ZZ12timer_deleteE19__PRETTY_FUNCTION____Z23fixup_timers_after_forkv_setitimer__ZZ9setitimerE19__PRETTY_FUNCTION___getitimer__ZZ9getitimerE19__PRETTY_FUNCTION____ZZ5alarmE19__PRETTY_FUNCTION____ZZ6ualarmE19__PRETTY_FUNCTION____GLOBAL__I_ttstart__GLOBAL__D_ttstart.data_cygwin_nocopy__ZL19timeval_to_timespecPK7timevalP8timespec__ZL12__to_clock_tP9_FILETIMEi@8__ZZL12__to_clock_tP9_FILETIMEiE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION___settimeofday__ZZ12settimeofdayE19__PRETTY_FUNCTION___timezone__Z9totimevalP7timevalP9_FILETIMEii@16__Z18time_t_to_filetimelP9_FILETIME__Z20timespec_to_filetimePK8timespecP9_FILETIME@8__Z19timeval_to_filetimePK7timevalP9_FILETIME@8__Z9to_time_tP9_FILETIME@4__Z14to_timestruc_tP9_FILETIMEP8timespec@8__Z19time_as_timestruc_tP8timespec@4__ZZ4timeE19__PRETTY_FUNCTION____Z14utimens_workerR9path_convPK8timespec__ZZ14utimens_workerR9path_convPK8timespecE19__PRETTY_FUNCTION___futimens__ZZN13cygheap_fdgetC1EibbE19__PRETTY_FUNCTION____ZZ8futimensE19__PRETTY_FUNCTION____ZZ5utimeE19__PRETTY_FUNCTION____ZN8hires_ns5primeEv__ZN8hires_ns5nsecsEv__ZZN8hires_ns5nsecsEvE19__PRETTY_FUNCTION____ZN8hires_ms14timeGetTime_nsEv__ZN8hires_ms5primeEv__ZN8hires_ms5nsecsEv_gettimeofday__ZZ12gettimeofdayE6tzflag__ZZ5timesE19__PRETTY_FUNCTION___clock_gettime__ZZ13clock_gettimeE19__PRETTY_FUNCTION___clock_settime__ZZ13clock_settimeE19__PRETTY_FUNCTION____ZN8hires_ns10resolutionEv__ZZN8hires_ns10resolutionEvE19__PRETTY_FUNCTION____ZN8hires_ms10resolutionEv__ZL9minperiod_clock_getres__ZZ12clock_getresE19__PRETTY_FUNCTION___clock_setres__ZZ12clock_setresE10period_set__ZZ12clock_setresE19__PRETTY_FUNCTION___clock_getcpuclockid__gettimeofday.data_cygwin_nocopy__ZN11tls_pathbuf7destroyEv__ZN11tmp_pathbufC2Ev__ZN11tmp_pathbufC1Ev__ZN11tmp_pathbufD2Ev__ZN11tmp_pathbufD1Ev__ZN11tmp_pathbuf5c_getEv__ZN11tmp_pathbuf5w_getEv_posix_openpt__ZZN13cygheap_fdgetC1EibbE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION___unlockpt__ZZ6revokeE19__PRETTY_FUNCTION____ZN8tty_list12init_sessionEv@0__ZN3tty12init_sessionEv@0__ZN8tty_list4initEv__ZN3tty13not_allocatedERPvS1___ZN3tty6existsEv__ZZN3tty6existsEvE19__PRETTY_FUNCTION____ZN8tty_list7connectEi__ZZN8tty_list7connectEiE19__PRETTY_FUNCTION____ZN8tty_list6attachEi@8__ZN3tty10open_mutexEPKcm__ZN3tty10open_inuseEm__ZN3tty11slave_aliveEv__ZN3tty12create_inuseEP20_SECURITY_ATTRIBUTES__ZZN3tty12create_inuseEP20_SECURITY_ATTRIBUTESE19__PRETTY_FUNCTION____ZN3tty4initEv__ZN3tty9get_eventEPKcP20_SECURITY_ATTRIBUTESi__ZZN3tty9get_eventEPKcP20_SECURITY_ATTRIBUTESiE19__PRETTY_FUNCTION____ZN9lock_ttysC2Em__ZZN9lock_ttysC1EmE19__PRETTY_FUNCTION____ZN9lock_ttysC1Em__ZN9lock_ttys7releaseEv__ZN8tty_list8allocateERPvS1___ZZN8tty_list8allocateERPvS1_E19__PRETTY_FUNCTION____ZN7tty_min7ttynameEv.data_cygwin_nocopy__ZN12cygheap_user4initEv__ZZN12cygheap_user4initEvE19__PRETTY_FUNCTION___getlogin_r_getlogin__ZZ8getloginE8username__ZZ8getloginE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION___getuid32_getgid32_geteuid32_getegid32__ZN12cygheap_user8test_uidERPcPKcj__ZN12cygheap_user10env_domainEPKcj__ZN12cygheap_user15env_userprofileEPKcj__ZN12cygheap_user8env_nameEPKcj__ZN12cygheap_user10env_logsrvEPKcj__ZN12cygheap_user10ontherangeE10homebodiesP6passwd__ZZN12cygheap_user10ontherangeE10homebodiesP6passwdE19__PRETTY_FUNCTION____ZN12cygheap_user13env_homedriveEPKcj__ZN12cygheap_user12env_homepathEPKcj__Z17internal_getloginR12cygheap_user__ZZ17internal_getloginR12cygheap_userE19__PRETTY_FUNCTION____Z10uinfo_initv__ZN12cygheap_user14env_systemrootEPKcj__ZZN12cygheap_user14env_systemrootEPKcjE19__PRETTY_FUNCTION____ZN6pwdgrp8next_strEc__ZN6pwdgrp8next_numERm__ZN6pwdgrp8add_lineEPc__ZN6pwdgrp4loadEPKw__ZZN6pwdgrp4loadEPKwE9succeeded__ZZN6pwdgrp4loadEPKwE19__PRETTY_FUNCTION____ZZN6pwdgrp4loadEPKwE6failed__ZZ5wait4E19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN7wincapc4initEv.cygwin_dll_common__ZN7wininfo7processEP6HWND__jjl@20__ZL21process_window_eventsP6HWND__jjl@16__ZN7wininfo4lockEv__ZN7wininfo7releaseEv__ZN7wininfocvP6HWND__Ev__ZN7wininfo9winthreadEv@4__ZZN7wininfo9winthreadEvE9classname__ZL9winthreadPv@4.data_cygwin_nocopy__ZN7linebuf3addEPKci__ZN7linebuf6finishEb__ZN7linebuf7prependEPKci__ZN7linebuf8fromargvER2avPKcb__ZZN7linebuf8fromargvER2avPKcbE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN2av7unshiftEPKci__ZL30wow64_eval_expected_main_stackRPvS0___ZZL30wow64_eval_expected_main_stackRPvS0_E19__PRETTY_FUNCTION____Z27wow64_test_for_64bit_parentv__Z30wow64_revert_to_original_stackRPv__Z21wow64_respawn_processv.data_cygwin_nocopy__ZL8sys_trimP12malloc_statej.clone.7__ZL4_gm___ZL7mparams_dlmalloc__ZL6iallocP12malloc_statejPjiPPv.clone.2.clone.3__ZL17internal_memalignP12malloc_statejj.clone.10_dlcalloc_dlrealloc_dlmemalign_dlindependent_calloc_dlindependent_comalloc_dlvalloc_dlpvalloc_dlmalloc_trim_dlmalloc_footprint_dlmalloc_max_footprint_dlmallinfo_dlmalloc_stats_dlmalloc_usable_size_dlmallopt__ZN14client_requestD2Ev.rdata$_ZTV14client_request__ZN14client_requestD1Ev.text$_ZN26client_request_get_versionD1Ev__ZN26client_request_get_versionD1Ev.text$_ZN25client_request_attach_ttyD1Ev__ZN25client_request_attach_ttyD1Ev.text$_ZN25client_request_attach_ttyD0Ev__ZN25client_request_attach_ttyD0Ev.text$_ZN26client_request_get_versionD0Ev__ZN26client_request_get_versionD0Ev__ZN14client_requestD0Ev__ZN14client_request4sendEP20transport_layer_base__ZZN14client_request4sendEP20transport_layer_baseE19__PRETTY_FUNCTION____ZN25client_request_attach_tty4sendEP20transport_layer_base__ZNK26client_request_get_version13check_versionEv__ZZNK26client_request_get_version13check_versionEvE19__PRETTY_FUNCTION____ZN14client_request8header_tC2ENS_14request_code_tEj__ZZN14client_request8header_tC1ENS_14request_code_tEjE19__PRETTY_FUNCTION____ZN14client_request8header_tC1ENS_14request_code_tEj__ZN14client_requestC2ENS_14request_code_tEPvj__ZZN14client_requestC1ENS_14request_code_tEPvjE19__PRETTY_FUNCTION____ZN14client_requestC1ENS_14request_code_tEPvj__ZN25client_request_attach_ttyC2EmPvS0_.rdata$_ZTV25client_request_attach_tty__ZZN25client_request_attach_ttyC1EmPvS0_E19__PRETTY_FUNCTION____ZN25client_request_attach_ttyC1EmPvS0___ZN26client_request_get_versionC2Ev.rdata$_ZTV26client_request_get_version__ZN26client_request_get_versionC1Ev__Z14cygserver_initv__ZZ14cygserver_initvE19__PRETTY_FUNCTION____ZN14client_request12make_requestEv__ZZN14client_request12make_requestEvE19__PRETTY_FUNCTION____Z25check_cygserver_availablev__ZZ25check_cygserver_availablevE19__PRETTY_FUNCTION____ZN20transport_layer_baseD2Ev.rdata$_ZTV20transport_layer_base__ZN20transport_layer_baseD1Ev__ZN20transport_layer_baseD0Ev__Z23create_server_transportv__ZN21transport_layer_pipes7connectEv__ZZN21transport_layer_pipes7connectEvE16assume_cygserver__ZZN21transport_layer_pipes7connectEvE19__PRETTY_FUNCTION____ZN21transport_layer_pipes4readEPvj__ZZN21transport_layer_pipes4readEPvjE19__PRETTY_FUNCTION____ZZ11__set_errnoPKciiE19__PRETTY_FUNCTION____ZN21transport_layer_pipes5closeEv__ZZN21transport_layer_pipes5closeEvE19__PRETTY_FUNCTION____ZN21transport_layer_pipesD2Ev.rdata$_ZTV21transport_layer_pipes__ZN21transport_layer_pipesD1Ev__ZN21transport_layer_pipesD0Ev__ZN21transport_layer_pipes5writeEPvj__ZZN21transport_layer_pipes5writeEPvjE19__PRETTY_FUNCTION____ZN21transport_layer_pipesC2Ev__ZN21transport_layer_pipesC1Ev___fpclassifyd___fpclassifyf___isinfd___isinff___isnand___isnanf___signbitf___signbitd_copysign_copysignf__f_llrint__f_llrintf__f_llrintl__f_lrint__f_lrintf__f_lrintl__f_rintf__f_rintl_gammaf_r_infinity_infinityf_lgamma_r_lgammaf_r_nextafter_nextafterf_remainder_remainderf_llroundf_nearbyint_nearbyintf_scalblnf_significand_significandf___ieee754_acos___ieee754_acosf___ieee754_acosh___ieee754_acoshf___ieee754_asin___ieee754_asinf___ieee754_sqrt___ieee754_log___ieee754_sqrtf___ieee754_logf___ieee754_atan2___ieee754_atan2f___ieee754_atanh___ieee754_atanhf___ieee754_rem_pio2_two_over_pi_npio2_hw___kernel_cos___kernel_sin___ieee754_rem_pio2f_two_over_pi_npio2_hw___kernel_cosf___kernel_sinf___ieee754_cosh___ieee754_coshf___ieee754_exp___ieee754_expf___ieee754_fmod___ieee754_fmodf___ieee754_gamma_r___ieee754_gammaf_r___ieee754_hypot___ieee754_hypotf___ieee754_j0___ieee754_y0___ieee754_j0f___ieee754_y0f___ieee754_j1___ieee754_y1___ieee754_j1f___ieee754_y1f___ieee754_jn___ieee754_yn___ieee754_jnf___ieee754_ynf___ieee754_lgamma_r___ieee754_lgammaf_r___ieee754_log10___ieee754_log10f___ieee754_pow___ieee754_powf___ieee754_remainder___ieee754_remainderf___ieee754_scalb___ieee754_scalbf___ieee754_sinh___ieee754_sinhf___kernel_tan___kernel_tanf__redupif___kernel_standard___kernel_rem_pio2___kernel_rem_pio2f_argz_count_argz_extract_argz_next_argz_stringify_envz_entry_envz_get___get_locale_env_categories_loadlocale_current_categories_new_categories_lc_message_charset_lc_ctype_charset_lc_ctype_cjk_lang_currentlocale_current_locale_string__setlocale_r_saved_categories___locale_charset___locale_mb_cur_max___locale_msgcharset___locale_cjk_lang__localeconv_r_localeconv___signgam_difftime__drand48_r__erand48_r_impure_data_isxdigit__jrand48_r__lcong48_r__lrand48_r_mbstowcs__nrand48_r__seed48_r_sseed.1821__srand48_r_strcasecmp_strncasecmp_critical_factorization_two_way_long_needle___strtok_r_strtok_r__strtol_r__strtoul_r_strtoull_wcstombs__atoll_r_cleanup_glue__reclaim_reent__wrapup_reent_getsubopt_iswalnum_iswalpha_iswblank_iswcntrl_iswctype_iswdigit_iswgraph_iswlower_iswprint_iswpunct_iswspace_iswupper_iswxdigit_R64_ARRAY__mbrtowc_r__mbsnrtowcs_r_mbsnrtowcs__mbsrtowcs_r_mbsrtowcs_critical_factorization_two_way_long_needle__mrand48_r_critical_factorization_two_way_long_needle_strcasestr_strchrnul_trecurse_tdestroy__towctrans_r_towctrans_towlower_CSWTCH.2_towupper_CSWTCH.2_trecurse__wcrtomb_r_wcscasecmp__wcsdup_r_wcsncasecmp__wcsnrtombs_r_wcsnrtombs__wcsrtombs_r_wcsrtombs__wcstod_r_initial.2486__wcstof_r__wcstol_r__wcstoul_r_wcstoull_wcswidth__wctrans_r__wctype_r_bisearch___wcwidth_ambiguous.1433_combining.1434_wmemmove_wordfree__fprintf_r__vfprintf_r_blanks.5098_zeroes.5099_vfprintf__fputc_r___micro_atoi___iso_8859_index___cp_index___utf8_mbtowc__mbtowc_r___ascii_mbtowc___iso_mbtowc___cp_mbtowc___utf8_wctomb__wctomb_r___ascii_wctomb___iso_wctomb___cp_wctomb__fwrite_r___cxa_atexit__cleanup_r___fp_unlock___fp_lock___sfmoreglue__cleanup___sfp_lock_acquire___sfp_lock___sfp_lock_release___sinit_lock_acquire___sinit_lock___sinit_lock_release___fp_lock_all___fp_unlock_all_xdr_set_vprintf_xdr_vprintf_xdr_vwarnx_xdr_warnx___cxa_finalize__sprintf_r___sflush_r__fflush_r__sscanf_r__snprintf_r_snprintf___gettzinfo_asctime_r_mon_name.2296_day_name.2295__fopen_r__fgets_r__fclose_r__fseek_r__ftell_r__fputs_r__vsnprintf_r_vsnprintf__perror_r___eprintf__fpurge_r___fpurge___getdelim___getline___srget_r___swbuf_r_flush_out_xdrrec_putint32_xdrrec_putlong_get_input_bytes_set_input_fragment_xdrrec_getbytes_xdrrec_getint32_xdrrec_getlong_xdrrec_putbytes_xdrrec_inline___FUNCTION__.2594_xdrrec_destroy_xdrrec_getpos_xdrrec_setpos_xdrrec_create_xdrrec_ops___FUNCTION__.2527_xdrrec_eof_xdrrec_endofrecord___xdrrec_getrec_xdrrec_skiprecord___xdrrec_setnonblock__asprintf_r_asprintf__fcloseall_r_fcloseall__fscanf_r__scanf_r_eiremain_emovo.clone.1_e64toe.clone.2__ldtoa_r__ldcheck__strtold__vasprintf_r_vasprintf___svfscanf_r_basefix.4985__vfscanf_r___svfscanf__vscanf_r__vsscanf_r_argz_add_argz_add_sep_argz_append_argz_create_argz_create_sep_argz_delete_argz_insert_argz_replace__asnprintf_r_asnprintf_clearerr__dprintf_r_envz_add_envz_merge_envz_remove_envz_strip__fdopen_r__fdopen64_r_fdopen64__fgetc_r__fgetpos_r__fgetpos64_r_fgetpos64__fgetwc_r__fgetws_r__fiprintf_r_fiprintf_fmemseeker_fmemseeker64_fmemcloser_fmemwriter_fmemreader__fmemopen_r_fmemopen__fopen64_r_fcseeker64_fcseeker_fcwriter_fcreader_fccloser__fopencookie_r_fopencookie__fputwc_r__fputws_r_crlf_r.clone.0__fread_r__freopen_r__freopen64_r_freopen64__fseeko_r__fseeko64_r_fseeko64__fsetpos_r__fsetpos64_r_fsetpos64__ftello_r__ftello64_r_ftello64_funseeker64_funseeker_funwriter_funreader_funcloser__funopen_r__fwide_r__fwprintf_r_fwprintf__fwscanf_r__getc_unlocked_r_getc_unlocked__getchar_r__getchar_unlocked_r_getchar_unlocked__getwc_r__getwchar_r_getwchar_hdestroy_hcreate_r_hdestroy_r_hsearch_r__iprintf_r_nl_langinfo_csym.2361_memseeker_memseeker64_internal_open_memstream_r_memcloser_memwriter__open_memstream_r__open_wmemstream_r_open_memstream_open_wmemstream__printf_r__putc_unlocked_r_putc_unlocked__putchar_r__putchar_unlocked_r_putchar_unlocked__putwc_r__putwchar_r_putwchar__rewind_r_setbuffer_setlinebuf__siprintf_r_siprintf_iso_year_adjust_conv_to_alt_digits.clone.0___strftime_strftime__strtod_r_fpi.2467_tinytens_fpinan.2503__swprintf_r_swprintf__swscanf_r__tmpnam_r__tempnam_r__tmpfile_r__tmpfile64_r_tmpfile64___submore__ungetc_r__ungetwc_r__vasnprintf_r_vasnprintf__vdprintf_r_vdprintf___sprint_r__vfiprintf_r_blanks.5076_zeroes.5077_vfiprintf__vfwprintf_r_blanks.4953_zeroes.4954_vfwprintf___svfwscanf_r_basefix.4814__vfwscanf_r___svfwscanf_vfwscanf__vprintf_r__vsprintf_r_vsprintf__vswprintf_r_vswprintf__vswscanf_r_vswscanf_vwprintf__vwprintf_r__vwscanf_r_iso_year_adjust_conv_to_alt_digits.clone.0___strftime_wcsftime__wprintf_r__wscanf_r_xdr_array_xdr_vector_xdr_free_xdr_void_xdr_long_xdr_u_long_xdr_u_int_xdr_int32_t_xdr_u_int32_t_xdr_uint32_t_xdr_short_xdr_u_short_xdr_int16_t_xdr_u_int16_t_xdr_uint16_t_xdr_int8_t_xdr_u_int8_t_xdr_uint8_t_xdr_char_xdr_u_char_xdr_bool_xdr_enum_xdr_opaque_xdr_zero_crud.2165_xdr_bytes_xdr_netobj_xdr_union_xdr_string_xdr_wrapstring_xdr_int64_t_xdr_u_int64_t_xdr_uint64_t_xdr_hyper_xdr_u_hyper_xdr_longlong_t_xdr_u_longlong_t_xdr_float_xdr_double_xdr_reference_xdr_pointer_x_putlong_x_putbytes_x_getpostn_x_setpostn_harmless_x_putint32_x_destroy_x_inline_xdr_sizeof_xdrmem_destroy_xdrmem_getlong_aligned_xdrmem_putlong_aligned_xdrmem_getpos_xdrmem_setpos_xdrmem_inline_aligned_xdrmem_inline_unaligned_xdrmem_getint32_aligned_xdrmem_putint32_aligned_xdrmem_putint32_unaligned_xdrmem_getint32_unaligned_xdrmem_putbytes_xdrmem_getbytes_xdrmem_putlong_unaligned_xdrmem_getlong_unaligned_xdrmem_create_xdrmem_ops_aligned_xdrmem_ops_unaligned_xdrstdio_inline_xdrstdio_putint32_xdrstdio_putbytes_xdrstdio_putlong_xdrstdio_getint32_xdrstdio_getbytes_xdrstdio_getlong_xdrstdio_destroy_xdrstdio_setpos_xdrstdio_getpos_xdrstdio_create_xdrstdio_ops___get_current_time_locale__time_using_locale__time_locale__C_time_locale___time_load_locale_time_locale_buf__fwalk_reent__buf_findstr___messages_load_locale__messages_using_locale__messages_locale_buf__messages_locale__C_messages_locale___get_current_messages_locale___numeric_load_locale__numeric_using_locale__numeric_locale_buf__numeric_locale__C_numeric_locale___get_current_numeric_locale_numempty___monetary_load_locale__monetary_using_locale__monetary_locale_buf__monetary_locale__C_monetary_locale___get_current_monetary_locale_numempty___ctype_load_locale__ctype_using_locale__ctype_locale_buf__ctype_locale__C_ctype_locale___get_current_ctype_locale___dorand48__mbstowcs_r__strtoll_r__strtoull_r__wcstombs_r__wcstoll_r__wcstoull_r___ssprint_r__svfiprintf_r_blanks.5062_zeroes.5063___swsetup_r___call_exitprocs___sfvwrite_r___register_exitproc___seofread___swrite___sclose___stextmode___sseek64___swrite64__svfprintf_r_blanks.5083_zeroes.5084___ssvfscanf_r_basefix.4969___sflags___srefill_r___smakebuf_r__fcntl_r___multadd___hi0bits___lo0bits___multiply___pow5mult_p05.2526___lshift__mprec_log10___copybits___any_on__times_r__open64_r__isatty_r__sniprintf_r_sniprintf___tz_lock___tz_lock_object___tz_unlock__strndup_r___hexdig_init___gethex___hexnan__svfwprintf_r_blanks.4938_zeroes.4939__sfgetwc_r__sungetwc_r___ssvfwscanf_r_basefix.4811__close_r__write_r__lseek_r__lseek64_r__sungetc_r___ssrefill_r__sfread_r___ssvfiscanf_r_basefix.4587___divdi3.eh_frame___udivdi3.eh_frame___umoddi3.eh_frame___moddi3.eh_frame___muldc3___mulsc3_WaitCommEvent@12_NtOpenFile@24_SetEvent@4_SetThreadPriority@8_FindNextVolumeW@12_GetMailslotInfo@20_TlsAlloc@0_NtQueryDirectoryFile@44_GetCommState@8_LoadLibraryExW@12_NtQueryFullAttributesFile@8_NtClose@4_FindNextVolumeMountPointW@12_NtQuerySystemInformation@16_ExitProcess@4_GetExitCodeThread@8_NtOpenSection@12_GetStartupInfoW@4_ExitThread@4_RtlEqualSid@8_GetThreadPriority@4_IsBadStringPtrA@8_RtlSetGroupSecurityDescriptor@12_UnmapViewOfFile@4_NtUnlockVirtualMemory@16_EraseTape@12_ClearCommBreak@4_GetSystemTimeAsFileTime@4___ljfault_GetConsoleCP@0_LoadLibraryExA@12_RtlCreateSecurityDescriptor@8_WriteConsoleOutputW@20_DuplicateHandle@28_WideCharToMultiByte@32_GlobalLock@4_SetCommBreak@4_GetProcessTimes@20_NtOpenKey@12_IsDebuggerPresent@0_NtQueryInformationProcess@20_NtLoadKey@8_NtCreateEvent@20_NtCreateTimer@16_RtlCompareUnicodeString@12_WaitForSingleObject@8_RtlCopySid@12_FreeConsole@0_NtWriteFile@36_NtPrivilegeCheck@12_NtFlushBuffersFile@8_OpenThread@12_RtlAddAccessDeniedAceEx@20_RtlLengthSid@4_AllocConsole@0_GetCurrentProcess@0_EnterCriticalSection@4_GetSystemDirectoryW@8_RtlAddAce@20_RtlCheckRegistryKey@8_GetTickCount@0_ResumeThread@4_GetLogicalDriveStringsA@8_NtQueryAttributesFile@8_GetStartupInfoA@4_NtSetSecurityObject@12_GetHandleInformation@8_VirtualFree@12_ReadFile@20_NtQueryValueKey@24_GetFileType@4_FillConsoleOutputCharacterA@20_GetProcAddress@8_NtAdjustPrivilegesToken@24_RtlGetOwnerSecurityDescriptor@12_SetThreadContext@8_GetSystemInfo@4_GetEnvironmentVariableA@12_GetThreadContext@8_GetComputerNameA@8_GetVolumeNameForVolumeMountPointW@12_RtlAcquirePebLock@0_SetCommTimeouts@8_WaitNamedPipeW@8_PrepareTape@12_NtOpenDirectoryObject@12_CancelIo@4_QueryPerformanceCounter@4_RtlNtStatusToDosError@4_NtLockVirtualMemory@16_WriteTapemark@16_GlobalMemoryStatusEx@4_NtUnmapViewOfSection@8_RtlFirstFreeAce@8_CreateFileW@28_TlsFree@4_TerminateThread@8_RtlIdentifierAuthoritySid@4_RtlPrefixUnicodeString@12_RtlAddAccessAllowedAce@16__ZN7_cygtls3popEv_NtDuplicateToken@24_NtCreateToken@52_GetFileSizeEx@8_GetProcessWorkingSetSize@12_PurgeComm@8_TlsSetValue@8_RtlCreateQueryDebugBuffer@8_TransmitCommChar@8_PeekConsoleInputW@16_RtlQueryProcessDebugInformation@12_VirtualProtect@16_DisconnectNamedPipe@4_GetLastError@0_GetStdHandle@4_SetPriorityClass@8_GetCommandLineW@0_NtCreateFile@44_RtlCreateAcl@12_NtReadFile@36_GlobalAlloc@8_NtFsControlFile@40_QueueUserAPC@12__ZN7_cygtls4lockEv_VirtualQueryEx@16_RtlSubAuthoritySid@8_NtNotifyChangeDirectoryFile@36_GetCurrentThread@0_RtlConvertToAutoInheritSecurityObject@24_FreeEnvironmentStringsW@4_IsProcessorFeaturePresent@4_TerminateProcess@8_GetModuleHandleW@4_FlushFileBuffers@4_NtSetTimerResolution@12_NtQueryEvent@20_NtQueryTimerResolution@12_NtQuerySystemTime@4_GetTapeParameters@16_GetTapePosition@20_RtlAddAccessAllowedAceEx@20_NtCreateDirectoryObject@12_SetErrorMode@4_SuspendThread@4_NtCancelTimer@8_NtQueryVolumeInformationFile@20_SetLastError@4_GetCurrentThreadId@0_NtQueryTimer@20_FlushViewOfFile@8_GetEnvironmentStringsW@0_WriteFile@20_SetConsoleTextAttribute@8_GetLogicalDrives@0_QueryDosDeviceW@12_QueryInformationJobObject@20_SetTapeParameters@12_NtCreateSection@28_GetExitCodeProcess@8_GetLocaleInfoW@16_RtlCopyUnicodeString@8_GetModuleHandleA@4_MessageBoxW@16_SetConsoleTitleW@4_RtlConvertSidToUnicodeString@12_CreateThread@24_RtlUpcaseUnicodeChar@4_SwitchToThread@0_RtlGetDaclSecurityDescriptor@16_GetModuleFileNameW@12_ReadConsoleOutputW@20_RtlInitializeSid@12_NtSetInformationThread@16_GetPriorityClass@4_SetEnvironmentVariableW@8_ExpandEnvironmentStringsW@12_GetCPInfo@8_VirtualProtectEx@20_GetBinaryTypeW@8_NtAccessCheck@32_RtlGetControlSecurityDescriptor@12_GetConsoleWindow@0_ScrollConsoleScreenBufferA@20_MapViewOfFile@20_RtlSubAuthorityCountSid@4_ReadConsoleInputA@16_RtlAppendUnicodeStringToString@8_RtlSetDaclSecurityDescriptor@16_GetCommModemStatus@8_NtQueryDirectoryObject@28_LeaveCriticalSection@4_GetLocaleInfoA@16_RtlFreeHeap@12_GlobalUnlock@4_GetLogicalDriveStringsW@8_RtlGetGroupSecurityDescriptor@12_RtlUpcaseUnicodeString@12_NtQuerySecurityObject@20_RtlLeaveCriticalSection@4_DebugBreak@0_NtCreateSemaphore@20_NtOpenSymbolicLinkObject@12_SetSystemTime@4_CreatePipe@16_MultiByteToWideChar@24_FillConsoleOutputAttribute@20_ReadProcessMemory@20_MapViewOfFileEx@24_RtlDestroyQueryDebugBuffer@4_NtQueryEaFile@36_CallNamedPipeA@28_FreeLibrary@4_NtSetEvent@8_NtQuerySymbolicLinkObject@12_RtlFreeUnicodeString@4_NtQueryInformationThread@20_RtlCreateUnicodeStringFromAsciiz@8_SleepEx@8_RtlSetOwnerSecurityDescriptor@12_ClearCommError@12_CompareFileTime@8_OpenProcess@12_RtlReleasePebLock@0_CreateNamedPipeA@32_ReleaseMutex@4_NtQueryInformationToken@20_ReleaseSemaphore@12_OutputDebugStringA@4_ReadConsoleInputW@16_RtlInitUnicodeString@8_CreateRemoteThread@28_RtlDowncaseUnicodeString@12_LocalFree@4_LoadLibraryW@4_FindVolumeMountPointClose@4_PeekNamedPipe@24_RtlGetAce@12_GetFileSize@8_RtlAllocateHeap@12_RtlAppendUnicodeToString@8_CreateFileA@28_CompareStringW@24_GetNumberOfConsoleInputEvents@8_SetConsoleCursorPosition@8_SetStdHandle@8_NtSetInformationFile@20_ConnectNamedPipe@8_NtSetValueKey@24_GetComputerNameW@8_GetModuleFileNameA@12_GetConsoleScreenBufferInfo@8_GetCurrentProcessId@0_FindFirstVolumeW@8___sjfault_RtlQueryRegistryValues@20_RtlEqualPrefixSid@8_FlushConsoleInputBuffer@4_VirtualQuery@12_SetHandleInformation@12_NtQueryInformationFile@20_GetEnvironmentVariableW@12_RtlSetControlSecurityDescriptor@12_SetCommMask@8_InitializeCriticalSection@4_NtSetInformationToken@16_NtOpenThreadToken@16_LCMapStringW@24_DeviceIoControl@32_PeekConsoleInputA@16_GetTapeStatus@4_ResetEvent@4_NtCreateMutant@16_CloseHandle@4_SetEnvironmentVariableA@8_DeleteCriticalSection@4_CreateProcessW@40_RtlEqualUnicodeString@12_FindVolumeClose@4_NtOpenMutant@12_RtlAbsoluteToSelfRelativeSD@12_NtCreateKey@28_NtOpenEvent@12_RtlSetCurrentDirectory_U@4_SetProcessWorkingSetSize@12_NtQueryVirtualMemory@24_GetConsoleMode@8_NtSetTimer@28_GetOverlappedResult@16_RtlEnterCriticalSection@4_GetVersionExA@4_QueryPerformanceFrequency@4_SetCommState@8_WriteProcessMemory@20_RtlDeleteSecurityObject@4_SetTapePosition@24_SetFilePointer@16_GetFileAttributesA@4_RtlLengthSecurityDescriptor@4_SetConsoleMode@8_SetConsoleCtrlHandler@8_NtOpenProcessToken@12_GlobalSize@4_FindFirstVolumeMountPointW@12_VirtualAlloc@16_CreateTapePartition@16_NtSetEaFile@16_SetNamedPipeHandleState@16_GetTimeZoneInformation@4_NtOpenSemaphore@12_NtAllocateLocallyUniqueId@4_NtQueryObject@20__ZN7_cygtls6unlockEv_GetSystemWindowsDirectoryW@8_SetThreadAffinityMask@8_TlsGetValue@4_WriteConsoleW@20_WaitForMultipleObjects@16_NtMapViewOfSection@40_NtCreateMailslotFile@32_EscapeCommFunction@8_sigdelayed__sys_errlist__sigfe_gethostbyname2__sigfe_system__cygwin_testing__sigfe_asprintf_win32_waveOutReset@4__imp__GetTickCount@0__sigfe_execvpe__sigfe_hcreate__imp__NtSetInformationFile@20_win32_GetIpAddrTable@12__sigfe_sighold__ZN8cwdstuff8cwd_lockE__sigfe_lseek64__sigfe_getpgid_win32_WSASocketW@24_win32_LookupAccountNameW@28__ZTV15fhandler_socket__sigfe_xdr_u_long_well_known_authenticated_users_sid_cygwin_user_h__sigfe_gettimeofday__imp__RtlLeaveCriticalSection@4__sigfe_cygwin_setmode__imp__LoadLibraryExW@12__sigfe_pthread_attr_getguardsize__imp__RtlSetCurrentDirectory_U@4__ZTV19fhandler_pty_common__imp__SetFilePointer@16__imp__DebugBreak@0_hMainThread__imp__TerminateThread@8_win32_waveInUnprepareHeader@12__sigfe_syslog__imp__RtlCreateUnicodeStringFromAsciiz@8__sigfe_pthread_attr_destroy__imp__NtSetTimerResolution@12__sigfe_pthread_attr_init__sigfe_xdr_u_hyper_cygwin_shared__sigfe_fdopen64__sigfe_malloc_win32_waveInPrepareHeader@12__sigfe_lchown32_waveOutWrite@12__sigfe_dup2_DnsQuery_A@24__imp__MapViewOfFileEx@24_win32_gethostname@8__sigfe_dup3__sigfe_fputc_win32_PostQuitMessage@4_cygserver_running_waveInPrepareHeader@12__sigfe___res_ninit__imp__ExitThread@4__sigfe_ttyname_r__imp__GetBinaryTypeW@8_waveOutGetVolume@8__imp__NtQueryInformationProcess@20_LsaEnumerateAccountRights@16___fdlib_version__sigfe_ioctl__sigfe_setenv_win32_waveInReset@4_PeekMessageW@20__sigfe_fchmodat_NetApiBufferFree@4__sigfe_setpgrp_WSAEnumNetworkEvents@12__sigfe_ungetwc_dev_cygdrive_storage__sigfe_endusershell_well_known_batch_sid__sigfe_cygwin_bindresvport_CryptReleaseContext@8_win32_WSASetLastError@4__ZN3etc15change_possibleE_win32_SetThreadDesktop@4__imp__RtlAppendUnicodeStringToString@8_WSAAsyncSelect@16__sigfe_pthread_rwlockattr_destroy__sigfe_cygwin_getprotoent__sigfe_cygwin_select__imp__MultiByteToWideChar@24__sig_tls_win32_GetWindowThreadProcessId@8__sigfe_sigaction__imp__RtlUnwind@16__sigfe_pthread_key_create__sigfe_clock_win32_socket@12__imp__RtlGetControlSecurityDescriptor@12__sigfe_argz_delete__imp__GetLogicalDriveStringsW@8__imp__ExpandEnvironmentStringsW@12_mandatory_high_integrity_sid_win32_CoTaskMemFree@4__sigfe_killpg__sigfe_errx__sigfe_pipe__sigfe_xdr_reference__sigfe_chdir__imp__PeekNamedPipe@24__sigfe_mkdirat__sigfe_get_nprocs_win32_RegCreateKeyExW@36__imp__NtQueryInformationFile@20__sigfe_execlp__sigfe_getgrnam__imp__NtCreateSection@28__sigfe_getmode__sigfe_sem_unlink_dev_udp_storage_win32_GetMessageW@16__imp__CreateTapePartition@16__imp__ReadConsoleOutputW@20_win32_CloseClipboard@0_win32_getservbyport@8__sigfe_swscanf__sigfe_posix_memalign__sigfe___xpg_strerror_r__sigfe_fsetpos__sigfe_ftello64__imp__RtlFirstFreeAce@8__sigfe_pthread_exit__imp__NtSetInformationToken@16__sigfe_setsid_console_dev__ZTV22fhandler_dev_clipboard__imp__NtQueryAttributesFile@8__imp__GetModuleHandleW@4__ZTV18pthread_rwlockattr__sigfe_rename_win32_PeekMessageW@20__sigfe_utmpname_NetUseGetInfo@16__ZTV14cygheap_fdenum_well_known_creator_owner_sid__sigfe_xdr_long__imp__GetLastError@0__sigfe_fstatat_gethostname@8_LsaQueryInformationPolicy@12_win32_RegEnumKeyExW@32_user_shared__sigfe_aclfromtext32__imp__NtCreateMutant@16_WSASetLastError@4__sigfe_pthread_spin_trylock__sigfe_sem_destroy__sigfe_cfsetospeed__ZTV19fhandler_dev_random_in6addr_loopback__sigfe_acltopbits__sigfe_fsync__sigfe___dn_skipname_gethostbyaddr@12_socket@12__sigfe_cygwin_setprotoent__sigfe_mq_open__imp__GetConsoleScreenBufferInfo@8__sigfe_fseek_well_known_this_org_sid__sigfe_tcsetattr__sigfe_error_CloseDesktop@4__sigfe_vfwprintf__sigfe_strsignal__imp__GetEnvironmentVariableA@12__sigfe_utime__ZTV16fhandler_console__sigfe_pthread_attr_setstackaddr_win32_CreateWindowExW@48_LogonUserW@24_ro_u_ncfsd__imp__ResetEvent@4__ZN8tty_list5mutexE__imp__CallNamedPipeA@28__imp__NtLoadKey@8_GetNamedPipeClientProcessId@8__imp__InitializeCriticalSection@4__sigfe_pthread_spin_init_well_known_builtin_sid__sigfe_munlock_win32_GetModuleHandleExW@12_dev_netdrive_storage__sigfe_lremovexattr__sigfe_pthread_spin_unlock__imp__RtlLengthSecurityDescriptor@4__imp__NtSetValueKey@24__sigfe___dn_expand__imp__NtOpenSection@12__sigfe_setdtablesize_GetMessageW@16__sigfe_ftime__sigfe_tmpfile_LsaDeregisterLogonProcess@4__imp__RtlDestroyQueryDebugBuffer@4___mprec_tinytens__sigfe__vscanf_r_RegisterClassW@4__ZTV16pthread_condattr__sigfe_access__sigfe_msgctl__sigfe_strptime_listen@8_win32_LocaleNameToLCID@8__imp__GetProcessWorkingSetSize@12__ZN16fhandler_console15MAX_WRITE_CHARSE__sigfe_sigdelset__sigfe_xdr_short__sigfe_setxattr_NtRollbackTransaction@8__PathLocale__sigfe_getutid_waveInStart@4__sigfe_malloc_stats__imp__FreeLibrary@4_error_one_per_line__imp__ReadConsoleInputA@16__imp__RtlEqualUnicodeString@12_win32_WSAGetLastError@0__sigfe___xdrrec_getrec__imp__NtUnmapViewOfSection@8__sigfe_envz_add_win32_WSASendMsg@24_win32_LsaLookupAuthenticationPackage@12_GetThreadDesktop@4__ZN13pthread_mutex16_destroyed_mutexE__sigfe_alarm_dev_tcp_storage__sigfe_setbuffer__imp__NtQuerySecurityObject@20__imp__TlsAlloc@0__imp__PurgeComm@8__sigfe_pthread_mutexattr_setprotocol_ro_u_proc__imp__SetEnvironmentVariableW@8__sigfe___res_querydomain__sigfe_getwd__sigfe___res_search_LsaLogonUser@56___ctype_iso__ZN10mount_info8root_idxE_entropy_source_CloseClipboard@0__sigfe_warn__fe_dfl_env__sigfe_cygwin_inet_aton__imp__GetVolumeNameForVolumeMountPointW@12__sigfe_fwrite_hProcToken__major_os_version____sigfe_cygwin_conv_to_full_posix_path__sigfe_asnprintf__sigfe_socketpair__sigfe___res_nsend__imp__NtOpenSymbolicLinkObject@12__imp__NtSetEaFile@16__sigfe_pthread_attr_setschedparam__ZN24fhandler_base_overlapped18asio_close_counterE_WSARecvFrom@36__sigfe_accept4__ZN10mount_info11got_usr_binE__sigfe_sleep_cygwin_finished_initializing__sigfe_fseeko64__imp__SetConsoleCtrlHandler@8__sigfe_isatty_win32_LsaRegisterLogonProcess@12__ZTV16fhandler_dev_dsp__sigfe_getpwuid_r32__sigfe_getutline_well_known_admins_sid__sigfe_setegid32__sigfe___getline__sigfe_getgrent__sigfe_getgrgid__ZTV13fhandler_pipe__sigfe_readlinkat__imp__RtlQueryRegistryValues@20_ro_u_csc__sigfe_pthread_detach__sigfe_fgetws__imp__FindFirstVolumeMountPointW@12__imp__WriteProcessMemory@20__f_atan2__imp__NtAdjustPrivilegesToken@24__sigfe_fchownat__sigfe_xdr_array__ZTV17fhandler_dev_tape__sigfe_sigsuspend__ZN3etc2fnE__sigfe_argz_replace__sigfe_cygwin_rcmd__sigfe_getwc_win32_waveInOpen@24__sigfe_spawnvpe__imp__GetExitCodeThread@8_WSAIoctl@36__sigfe_futimes__sigfe_xdr_union__sigfe_verrx__loader_flags____sigfe_vdprintf__size_of_heap_commit____sigfe_flock__sigfe_spawnv_program_invocation_short_name__libntdll_a_iname__imp__RtlSetOwnerSecurityDescriptor@12__ZTV18fhandler_disk_file__sigfe_mq_getattr__sigfe_gethostid_almost_null__sigfe_sigpause__sigfe_glob__sigfe_tsearch__sigfe_pthread_equal_win32_DsGetDcNameW@24___ImageBase__sigfe_ptsname__libkernel32_a_iname__sigfe_ctime_r__imp__GetSystemInfo@4__sigfe_ftello__sigfe_clock_nanosleep__sigfe_revoke__sigfe_pthread_attr_setschedpolicy__ZTV14client_request__sigfe_fseeko_suboptarg__sigfe_sigprocmask__sigfe_rewind__sigfe_symlink__imp__VirtualQuery@12_wincap_2000__sigfe_poll__sigfe_clock_getres___ctype_ptr____sigfe_mktemp__imp__FindVolumeClose@4__sigfe_login__sigfe_setgroups__sigfe_pthread_rwlock_trywrlock__imp__FillConsoleOutputCharacterA@20__sigfe_pclose_WNetGetProviderNameA@12__sigfe_strndup__sigfe_tcsendbreak__imp__AllocConsole@0_WNetOpenEnumA@20__sigfe_stat_SetClipboardData@8__imp__CreateRemoteThread@28_win32_LsaDeregisterLogonProcess@4__imp__LoadLibraryW@4__sigfe_mallopt__imp__SetConsoleTitleW@4_win32_GetIfEntry@4__sigfe_getgrnam32__imp__SetHandleInformation@12_urandom_dev__imp__CreateProcessW@40__sigfe_login_tty_windows_system_directory_length_win32_gethostbyname@4__sigfe_regexec_win32_GetUserObjectInformationW@20__sigfe_pthread_cancel__imp__RtlConvertSidToUnicodeString@12__sigfe_scandir__sigfe_sexecve_is_bad__sigfe__asprintf_r_ro_u_udf__imp__RtlAddAccessAllowedAceEx@20__sigfe_pathconf__imp__GlobalMemoryStatusEx@4__sigfe_feraiseexcept__sigfe_sprintf__sigfe_pthread_mutexattr_destroy__sigfe_strtof_ro_u_exe_well_known_console_logon_sid__sigfe_xdr_longlong_t_win32_getpeername@12_waveOutUnprepareHeader@12__sigfe_strtod__sigfe_updwtmp_well_known_creator_group_sid__sigfe_wprintf__sigfe_xdr_u_int8_t_case_folded_upper_win32_CryptAcquireContextW@20_ch_spawn__sigfe_pthread_cond_destroy__sigfe_pthread_rwlock_init__sigfe_wcsftime__imp__QueryPerformanceFrequency@4__imp__WaitNamedPipeW@8_win32_RegOpenKeyExW@20__imp__SetLastError@4_win32_RegEnumValueW@32__sigfe_setreuid__ZN14pthread_rwlock7rwlocksE__imp__RtlCreateSecurityDescriptor@8__ZTV17fhandler_registry__imp__OpenThread@12__ZN16fhandler_console19shared_console_infoE__sigfe_xdr_u_short_win32_DefWindowProcW@16__timezone_win32_RegCloseKey@4__sigfe_sigpending_win32_DispatchMessageW@4___progname__sigfe_fdopendir__sigfe_pthread_sigmask__sigfe_linkat__imp__FlushViewOfFile@8___atexit_lock__imp__RtlSetDaclSecurityDescriptor@16_NtCommitTransaction@8_nfs_type_mapping__imp__NtFsControlFile@40__sigfe_pthread_rwlockattr_setpshared_sigreturn__imp__SetThreadAffinityMask@8_win32_RegisterClipboardFormatW@4_stat_suffixes__sigfe_xdr_bool__ZTV12pthread_attr_ro_u_scr__sigfe_getc_unlocked__sigfe_pthread_mutexattr_gettype_windows_system_directory_wincap_xpsp2__sigfe_fcloseall__sigfe_spawnvp__imp__NtQueryValueKey@24__imp__NtQueryDirectoryFile@44__sigfe_mlock__sigfe_spawnle__imp__SetCommState@8_wincap_8__sigfe_daemon__imp__NtQuerySystemTime@4_win32_DnsRecordListFree@8_ro_u_lnk__imp__SetTapePosition@24_myself_nowait_dummy__imp__LCMapStringW@24__sigfe_ftok_well_known_interactive_sid__imp__GetTapePosition@20_wincap_7__sigfe___opendir_with_d_ino__sigfe_fchown__sigfe_tdelete__sigfe_cygwin_connect__imp__GetSystemDirectoryW@8__sigfe_getgrouplist__sigfe_getgrgid_r__imp__RtlAllocateHeap@12__sigfe_argz_insert__sigfe_ctermid__ZTV12pthread_null__ZTV15cygheap_fdmanip_win32_gethostbyaddr@12_well_known_null_sid_error_message_count__sigfe_cygwin_shutdown__sigfe_pthread_setspecific_closesocket@4__ZTV13fhandler_proc__imp__RtlAppendUnicodeToString@8__imp__GetProcessTimes@20__ZTV17fhandler_netdrive_fs_names_ReportEventW@36__sigfe_fgetwc__sigfe_unlinkat__imp__RtlEnterCriticalSection@4__sigfe_fchown32__sigfe_lutimes__sigfe_ftrylockfile__imp__NtQueryTimer@20__sigfe_sem_wait__sigfe_getpagesize__sigfe_cygwin_inet_ntop__sigfe_pthread_testcancel__sigfe_ferror_system_wow64_directory__ZN12lock_process6lockerE__sigfe_malloc_usable_size__ZTV13fhandler_fifo___check_rhosts_file_wincap_xpsp1__sigfe_spawnve__sigfe_readv__sigfe_fgetpos64_win32_LookupAccountSidW@28__sigfe_open_well_known_users_sid__sigfe_spawnlp__sigfe_vwarnx__sigfe_lockf__ZTV7pthread_sec_none_nih__imp__SetProcessWorkingSetSize@12__sigfe_seteuid_win32_getprotobyname@4_waveOutGetNumDevs@0__sigfe_pthread_cond_broadcast_ro_u_dll__imp__RtlCreateAcl@12___chclass__sigfe_mkfifoat_ro_u_nfs__sigfe_getutent__sigfe_pthread_mutexattr_setprioceiling__sigfe_ftell__imp__QueueUserAPC@12_ptys_dev_win32_waveOutGetVolume@8__imp__GetSystemWindowsDirectoryW@8___default_locale_perfile_table__sigfe_logout__sigfe_sem_close_waveOutOpen@24_sigExeced__sigfe_pthread_attr_setinheritsched__sigfe_envz_strip__sigfe___res_send__sigfe_xdrstdio_create__sigfe_vscanf__ZTV20fhandler_procsysvipc__sigfe_remove__sigfe_mq_timedsend_win32_CreateProcessAsUserW@44__imp__SuspendThread@4__sigfe_on_exit__ZTV13cygheap_fdnew__sigfe_fsetpos64_SetProcessWindowStation@4__sigfe_if_nameindex__sigfe_cygwin_rcmd_af__sigfe_pthread_rwlock_unlock__sigfe_setbuf__ZZN15fhandler_socket13recv_internalEP7_WSAMSGE10WSARecvMsg__sigfe_argz_create_sep_ro_u_com__imp__Sleep@4__sigfe_write__sigfe_strerror_r__sigfe_clock_getcpuclockid__sigfe_xdr_free_win32_RegOpenUserClassesRoot@16__imp__RtlGetGroupSecurityDescriptor@12__sigfe_psiginfo__sigfe_mq_notify__imp__RtlAddAccessAllowedAce@16__sigfe_telldir64__sigfe_reallocf__sigfe_pthread_create__imp__NtDuplicateToken@24___infinityld_win32_GetIpForwardTable@12_win32_CloseWindowStation@4__sigfe_cygwin_winpid_to_pid_win32_getsockname@12__sigfe_vsprintf__sigfe_perror__imp__GetConsoleCP@0__sigfe_hcreate_r_win32_connect@12_dynamically_loaded__imp__NtOpenEvent@12_LocaleNameToLCID@8__sigfe_ctime__imp__SetErrorMode@4__sigfe_utimensat_win32_LsaFreeMemory@4__sigfe_flockfile___argc_safedll_func_load_accept@12__sigfe_dlclose_system_wow64_directory_length__sigfe_setuid__imp__RtlAcquirePebLock@0__sigfe_xdr_int16_t_win32_WNetOpenEnumA@20__imp__CancelIo@4__imp__QueryInformationJobObject@20__imp__RtlPrefixUnicodeString@12__sigfe_valloc__sigfe__strtold__sigfe_gmtime_r__imp__NtQuerySystemInformation@16__imp__LocalFree@4__sigfe_sem_open__ZTV16fhandler_dev_mem__sigfe_xdr_uint64_t__sigfe_cygwin_internal__ZTV12fhandler_dev_win32_waveOutSetVolume@8__sigfe_fsetxattr_child_proc_info__sigfe_endutent_AttachConsole@4_win32_GetSystemWow64DirectoryW@8__sigfe_xdr_sizeof_nfs_aol_ffei__imp__RtlAddAce@20__sigfe_acltomode32__sigfe_getpt__sigfe_mknod32_getpeername@12__sigfe_argz_create__imp__RtlCheckRegistryKey@8_CreateProcessAsUserW@44__sigfe_llistxattr__ZTV17verifyable_object__ZZN16fhandler_console22write_replacement_charEvE16replacement_char__sigfe_wait__sigfe_getsid__sigfe_fchmod__sigfe__pthread_cleanup_push__sigfe_posix_fadvise__sigfe_cygwin_endprotoent_ptym_dev__ZN6tmpbuf4lockE__sigfe_get_current_dir_name__cygheap_end__sigfe_cygwin_getprotobyname__sigfe_semctl__sigfe_telldir__sigfe_setregid__sigfe_ptsname_r__ZN12pthread_cond24cond_initialization_lockE__sigfe_cygwin_getpeername_WSAWaitForMultipleEvents@20__imp__NtFlushBuffersFile@8__image_base___signal_arrived__sigfe_putc_unlocked_default_cygwin_cxx_malloc__imp__PrepareTape@12__sigfe_regcomp__sigfe_pthread_mutex_lock__sigfe_fclose__sigfe_cygwin_set_impersonation_token_my_wr_proc_pipe__imp__GetExitCodeProcess@8__sigfe_globfree__imp__CompareStringW@24_well_known_dialup_sid__sigfe_verr_win32_accept@12__ZN10child_info11retry_countE__sigfe_pthread_spin_lock__sigfe_lseek__imp__RtlCreateQueryDebugBuffer@8__ctype_b__sigfe_sigignore_RegGetKeySecurity@16_win32_waveInClose@4_WNetCloseEnum@4_dev_proc_storage_dev_piper_storage__imp__OpenProcess@12__sigfe_freopen64_win32_waveOutPrepareHeader@12__ZN6tmpbuf3bufE__sigfe_uname__imp__NtNotifyChangeDirectoryFile@36__ZTV13fhandler_base__sigfe_get_phys_pages__sigfe_sem_post__sigfe_mallinfo_win32_SetParent@8__imp__RtlGetDaclSecurityDescriptor@16__sigfe_opendir__sigfe_getitimer__sigfe_hsearch_r__sigfe_utmpxname_wincap_vista_collate_charset__ZTV12pthread_cond_win32_OpenClipboard@4__imp__GetCurrentProcessId@0__sigfe_putchar__sigfe_shmget__imp__GetMailslotInfo@20__ZTV21transport_layer_pipes__imp__DuplicateHandle@28_RegisterClipboardFormatW@4__imp__NtOpenProcessToken@12__sigfe_statvfs_in6addr_any__imp__RtlConvertToAutoInheritSecurityObject@24__sigfe_sigqueue__sigfe_cygwin_getprotobynumber__imp__SetCommMask@8__sigfe_unsetenv__sigfe_getmntent__sigfe_openlog_well_known_local_sid__imp__RtlAddAccessDeniedAceEx@20__sigfe_pthread_condattr_destroy___infinity_win32_RegQueryValueExW@24__sigfe_tcflow__sigfe_sigrelse__sigfe_acl__imp__RtlDowncaseUnicodeString@12_win32_WSARecv@28__imp__GetCommModemStatus@8__sigfe___res_state__sigfe_timer_settime__sigfe_memalign__sigfe_settimeofday__sigfe__fcloseall_r__sigfe_xdr_wrapstring__sigfe_iprintf__ZN12pthread_cond5condsE__sigfe_cygwin_endservent__imp__GetTapeParameters@16__head_libkernel32_a___DTOR_LIST___win32_WSASendTo@36__sigfe_pthread_rwlockattr_getpshared_waveOutClose@4___ctype_cp_GetClipboardData@4__sigfe_pthread_mutexattr_getprioceiling_exit_state_GetUserObjectInformationW@20__sigfe_xdr_u_char_debugger_command__ZN6pwdgrp6pglockE__sigfe_fdopen__sigfe_getgroups__sigfe__open64__sigfe_spawnlpe__sigfe_sysinfo__sigfe_xdr_int8_t__sigfe_timelocal_ro_u_sunwnfs_ro_u_mvfs__ZTV17fhandler_cygdrive_RegisterEventSourceW@8_waveInUnprepareHeader@12__sigfe_freopen__sigfe_munmap_win32_CreateDesktopW@24__sigfe_execle__sigfe_fcvt__imp__RtlNtStatusToDosError@4__imp__TlsSetValue@8__sigfe_getchar__sigfe_ftw__fe_nomask_env__sigfe_vsscanf__imp__GetEnvironmentStringsW@0__ZN7pthread7threadsE_GetNetworkParams@8_win32_listen@8__sigfe_pthread_condattr_setpshared_dev_kmsg__sigfe_cygwin_logon_user__sigfe_mkdir__imp__SleepEx@8__sigfe_sigismember__imp__GetLogicalDriveStringsA@8__imp__NtSetTimer@28__sigfe_read__sigfe_cygwin_stackdump_well_known_network_sid__sigfe_psignal_detect_bloda__imp__NtCreateTimer@16__sigfe_msgsnd_GetAdaptersAddresses@20_getsockname@12_LsaRetrievePrivateData@12_pipe_byte__sigfe_time__sigfe_setvbuf__imp__GetVersionExA@4__imp__SetConsoleMode@8__ZN18lock_timer_tracker7protectE__imp__RtlLengthSid@4__sigfe_fputwc__sigfe___swbuf_r__sigfe_cygwin_bind__sigfe_pthread_condattr_init_GetPriorityClipboardFormat@8__sigfe_tcgetpgrp__imp__SetNamedPipeHandleState@16_win32_PostMessageW@16__sigfe_symlinkat__sigfe_fts_open__imp__NtCreateKey@28__sigfe__scanf_r__sigfe_pread__sigfe_getgrnam_r__imp__CloseHandle@4_win32_WSAWaitForMultipleEvents@20__sigfe_shm_open_win32_RegOpenCurrentUser@8__sigfe_ungetc__sigfe_cygwin_getsockname__sigfe_clock_gettime_win32_WNetGetProviderNameA@12__imp__GetFileType@4__sigfe_mkfifo__sigfe_pthread_setconcurrency__sigfe_localtime_r__sigfe_pthread_mutexattr_getprotocol_myself_initial__sigfe_fputws__imp__RtlUpcaseUnicodeString@12__sigfe_fcntl___mbtowc_win32_getsockopt@20__sigfe_usleep__sigfe_fgetpos__imp__IsDebuggerPresent@0_win32_WNetEnumResourceA@16_LookupAccountNameW@28_win32_WSAEventSelect@12_WSAEventSelect@12_win32_RegisterEventSourceW@8__daylight__sigfe___res_nquerydomain__imp__RtlSetControlSecurityDescriptor@12__sigfe_hdestroy_ro_u_pmem__imp__SetConsoleCursorPosition@8__sigfe_raise_sec_none__sigfe_setuid32__sigfe_strfmon__sigfe_lacl__imp__EraseTape@12__imp__NtOpenKey@12_LsaRegisterLogonProcess@12__imp__IsBadStringPtrA@8__sigfe_error_at_line__sigfe_fts_read__sigfe_pthread_rwlock_tryrdlock__sigfe_pthread_key_delete__sigfe_initgroups_waveOutPrepareHeader@12__imp__LeaveCriticalSection@4_win32_WSARecvFrom@36_win32_EmptyClipboard@0__sigfe_cygwin_accept_win32_SendNotifyMessageW@16__imp__NtReadFile@36__sigfe_xdr_u_longlong_t__sigfe_sched_setparam___mb_cur_max__ZN13pthread_mutex7mutexesE__sigfe_mkstemps_win32_WNetCloseEnum@4__imp__EscapeCommFunction@8__ZN10mount_info11got_usr_libE__sigfe_fopencookie__sigfe_cygwin_inet_ntoa__sigfe_cygwin_listen___action_table__minor_subsystem_version____sigfe_fstat__sigfe_putwchar__sigfe_cygwin_herror__sigfe_mktime__ZN11pthread_key4keysE__sigfe_getgrgid32__sigfe_pthread_rwlock_destroy__sigfe_getutxid__size_of_heap_reserve____ZTV18client_request_shm__imp__GetLogicalDrives@0__imp__NtSetSecurityObject@12__sigfe_getusershell_CloseWindowStation@4__sigfe_cygwin_inet_pton__imp__GetFileAttributesA@4__sigfe_gmtime__sigfe_acl32__head_libntdll_a__sigfe_pthread_setschedparam__imp__NtQueryTimerResolution@12_win32_waveInAddBuffer@12_win32_GetNetworkParams@8__sigfe_pthread_attr_setstack___infinityf__sigfe_setmntent__sigfe_cygwin_win32_to_posix_path_list_buf_size_ignore_case_with_glob__sigfe_pthread_attr_getschedparam__sigfe_iruserok_sa__sigfe_cygwin_create_path__sigfe_tzset__sigfe_pthread_getspecific__sigfe_pthread_getconcurrency__sigfe_hsearch__sigfe_getrusage_isalpha_array_connect@12__sigfe_getchar_unlocked__sigfe_if_indextoname__sigfe_pthread_mutex_destroy__sigfe_gcvt_win32_ReportEventW@36___cygwin_user_data_win32_CryptGenRandom@12__sigfe_fwscanf__ZTV16fhandler_virtual_GetIpForwardTable@12__imp__FindNextVolumeW@12__sigfe_nftw__sigfe_getgroups32_waveInAddBuffer@12__sigfe_xdr_uint32_t__sigfe_cygwin_rresvport__sigfe_getmntent_r__sigfe_setreuid32_SendNotifyMessageW@16__imp__SetEvent@4__sigfe_shmctl__sigfe_pthread_rwlock_rdlock_win32_DnsQuery_A@24_dev_dgram_storage__sigfe_scanf__sigfe_getpwnam__sigfe_xdr_netobj_setsockopt@20__sigfe_funopen_RtlGetCurrentTransaction@0__sigfe_dprintf__ZN7_cygtls6lockedEv__sigfe_fscanf__sigfe_setgid__imp__NtCreateMailslotFile@32__sigfe___res_close_ro_u_globalroot__sigfe_atoff_win32_setsockopt@20__imp__WaitCommEvent@12__sigfe_ecvt__sigfe_mount__sigfe_xdr_u_int32_t_cygwin_version_strings__sigfe_getpwuid32_ro_u_dev__imp__ResumeThread@4__ZN9cygthread14main_thread_idE__imp__VirtualProtect@16__sigfe_xdr_int32_t__sigfe_shm_unlink__imp__ConnectNamedPipe@8_waveOutSetVolume@8__sigfe_cygwin_inet_network__sigfe_fcvtf__imp__DisconnectNamedPipe@4__imp__RtlCopyUnicodeString@8__sigfe_argz_add__sigfe_getopt_long__ZTV11pthread_key__check_for_executable__sigfe__pthread_cleanup_pop__imp__GetStartupInfoW@4__imp__TlsGetValue@4__sigfe_timezone__sigfe_getpwuid_r__sigfe_getxattr__sigfe_truncate__imp__RtlGetAce@12_GetWindowThreadProcessId@8__sigfe_pthread_setcanceltype_win32_LsaLogonUser@56__size_of_stack_reserve___well_known_world_sid__sigfe_aclsort32__sigfe_if_freenameindex__imp__NtQueryInformationToken@20__ZTV19fhandler_dev_floppy__sigfe_aclfrommode32__imp__SetPriorityClass@8__sigfe_cygwin_gethostbyname__sigfe_fmemopen_win32_AttachConsole@4__imp__VirtualProtectEx@20__imp__RtlInitializeSid@12__imp__CreateFileW@28__imp__FlushConsoleInputBuffer@4__sigfe_lstat_waveOutReset@4__sigfe_pthread_setcancelstate__sigfe_semop__sigfe_getutxline__ZTV16fhandler_procnet__sigfe_execve__sigfe_vfprintf__sigfe___res_nmkquery__sigfe_getpwuid__sigfe_vfwscanf__sigfe_argz_append__imp__RtlInitUnicodeString@8__sigfe_updwtmpx__sigfe_close__sigfe_xdrrec_endofrecord__imp__PeekConsoleInputW@16_win32_GetClipboardData@4_GetSystemWow64DirectoryW@8__sigfe_vsnprintf___api_fatal_exit_val__sigfe_stat64__sigfe_sem_getvalue__sigfe_gcvtf_CryptAcquireContextW@20__sigfe_euidaccess__sys_nerr__sigfe_envz_remove_win32_LsaRetrievePrivateData@12__sigfe_pthread_attr_getinheritsched_win32_WSADuplicateSocketW@12__imp__NtCreateFile@44__sigfe_cygwin_socket__sigfe_kill__sigfe_timer_delete_WNetEnumResourceA@16_win32_SetClipboardData@8__sigfe_chown32__sigfe_vfork_cygwin_version__sigfe_pthread_getsequence_np_reset_com__imp__RtlFreeHeap@12__sigfe_msgget_win32_ioctlsocket@12_win32_SetProcessWindowStation@4__sigfe_lsetxattr__sigfe_sched_get_priority_min__imp__FreeEnvironmentStringsW@4__sigfe_fork__sigfe_sched_get_priority_max__sigfe_posix_openpt__sigfe_tcdrain__sigfe_fopen__sigfe_sched_yield_win32_GetForegroundWindow@0__sigfe_mknod_collate_lcid__imp__GetProcAddress@8__imp__GetCommState@8__sigfe_pthread_mutexattr_init_ro_u_nwfs_win32_getservbyname@8__sigfe_futimesat__sigfe_truncate64__sigfe_pthread_attr_getdetachstate__imp__NtQueryDirectoryObject@28__sigfe_vasnprintf__sigfe_cygwin_sendto__sigfe_pthread_spin_destroy_win32_GetKeyboardLayout@4__sigfe_cfsetispeed__sigfe_ecvtbuf__sigfe_xdr_uint16_t_win32_GetAdaptersAddresses@20__sigfe_cwait__sigfe_freeifaddrs__ZTV17fhandler_mailslot_win32_waveOutClose@4__sigfe_fdatasync__sigfe_sscanf_wincap_2000sp4__imp__RtlSubAuthorityCountSid@4__subsystem___ro_u_uncp__imp__ReadConsoleInputW@16__sigfe___res_init_GetIpAddrTable@12__sigfe_shmat__f_frexpf__sigfe_creat_SHGetDesktopFolder@4__sigfe_cygwin_freeaddrinfo__f_atan2f_dev_pipew_storage__ZN6sentry4lockE__sigfe_timer_create__sigfe_cygwin_bindresvport_sa__sigfe_setgroups32__sigfe_fremovexattr__sigfe_sigaddset__sigfe_xdr_uint8_t__sigfe_xdrmem_create_win32_NtCommitTransaction@8_LsaFreeMemory@4___mlocale_changed__sigfe_wscanf_ro_u_fat__sigfe_cygwin_recv__imp__SetCommBreak@4__sigfe_feenableexcept__imp__RtlDeleteSecurityObject@4__sigfe_pthread_condattr_getclock__imp__ExitProcess@4__sigfe_getifaddrs___wctomb__sigfe_tcgetattr__sigfe_getc__sigfe_atof__sigfe_strerror__sigfe_xdr_u_int16_t__imp__RtlUpcaseUnicodeChar@4_win32_WNetGetResourceInformationA@16__sigfe_regerror_well_known_system_sid_win32_CloseDesktop@4__imp__NtSetInformationThread@16__imp__ClearCommBreak@4__ZTV20transport_layer_base__sigfe_aclfrommode_cons_dev__imp__ScrollConsoleScreenBufferA@20__sigfe___getdelim_ro_u_natp_DispatchMessageW@4__sigfe_vasprintf_getservbyport@8__sigfe__exit__sigfe_getpwent_win32_CreateWindowStationW@16__sigfe_cygwin_conv_to_win32_path_win32_GetUdpTable@12__sigfe_ruserok__imp__NtOpenFile@24__sigfe_warnx__sigfe_pthread_kill__ZN13pthread_mutex25mutex_initialization_lockE__imp__NtOpenThreadToken@16__sigfe_cygwin_getservent__sigfe_pthread_setschedprio_allow_glob__sigfe_ppoll__sigfe_glob_pattern_p_dev_stream_storage__imp__WriteConsoleW@20__imp__GetTimeZoneInformation@4__imp__GetModuleHandleA@4_hProcImpToken__f_ldexp__imp__GetConsoleWindow@0__ZN9semaphore10semaphoresE_cygwin_shared_h__sigfe_utimes__sigfe_ecvtf_PostQuitMessage@4__major_subsystem_version____cygwin_exit_return__sigfe_gets___state_table__f_log10__sigfe_getw__imp__NtSetEvent@8__ZTV18client_request_msg__sigfe_sem_timedwait__ZN13pthread_mutex10_new_mutexE__sigfe_lchown__sigfe_xdr_u_int__sigfe_mkostemps__sigfe_cygwin_posix_to_win32_path_list__sigfe_hdestroy_r__ZTV16fhandler_dev_raw__sigfe_mkostemp__imp__NtCreateDirectoryObject@12__sigfe_pthread_attr_getscope__sigfe_sched_rr_get_interval__sigfe_setrlimitdll_chain__sigfe_get_avphys_pages__imp__GetThreadPriority@4_NetUserGetGroups@28__sigfe_xdrrec_eof_cygwin_props_threadfunc_ix__sigfe_mmap64__sigfe_pthread_join__sigfe_printf__sigfe_vwscanf__sigfe_get_osfhandle__imp__GetFileSize@8__sigfe_fgetxattr__imp__GetFileSizeEx@8__imp__GetCurrentThreadId@0_win32_waveOutWrite@12__sigfe_vwprintf_EmptyClipboard@0__imp__ReadFile@20_win32_LsaStorePrivateData@12__sigfe_fiprintf__sigfe_getrlimit__sigfe_execv__sigfe_ualarm__sigfe_xdr_pointer__sigfe_regfree__sigfe_vfscanf_RtlSetCurrentTransaction@4_win32_RegQueryInfoKeyW@48__imp__ReleaseMutex@4_RegEnumKeyExW@32__imp__RtlFreeUnicodeString@4_dos_file_warning__ZN3etc13last_modifiedE__sigfe_cygwin_getaddrinfo__imp__WaitForMultipleObjects@16__sigfe_seekdir64__ZTV17fhandler_dev_null__sigfe_tcsetpgrp_dev_fs_storage__ZN9cygthread7exitingE__sigfe_acltopbits32_optreset__sigfe_setpriority_NtCreateTransaction@40__f_frexp__sigfe_openat__sigfe_umount__imp__RtlEqualSid@8_CreateWindowStationW@16__sigfe_facl32__imp__OutputDebugStringA@4_case_folded_lower__sigfe_feof__sigfe_vswscanf__imp__CompareFileTime@8__sigfe__sscanf_r__imp__DeleteCriticalSection@4__sigfe_msgrcv_gethostbyname@4__sigfe_cygwin_posix_to_win32_path_list_buf_size_WSASendMsg@24_win32_LsaQueryInformationPolicy@12_EnumWindows@8_GetKeyboardLayout@4_win32_CryptReleaseContext@8_mandatory_system_integrity_sid_win32_GetNamedPipeClientProcessId@8__sigfe_free.weak._free.___call_exitprocs__sigfe_setitimer_CreateWindowExW@48__sigfe_getpass__imp__GetTapeStatus@4__major_image_version____imp__WaitForSingleObject@8__section_alignment____sigfe_acltotext__global_impure_ptr__sigfe_cygwin_getnameinfo__sigfe_putenv_win32_GetProcessWindowStation@0__sigfe___eprintf_win32_NetUserGetInfo@16_win32_RegGetKeySecurity@16_win32_closesocket@4__sigfe_feupdateenv__sigfe_closelog__sigfe_mmap_win32_DeregisterEventSource@4__imp__GlobalUnlock@4_win32_LsaClose@4__imp__GlobalSize@4__imp__NtCreateToken@52__sigfe_pthread_cond_init__sigfe_waitpid_RegQueryValueExW@24__sigfe_xdr_u_int64_t__ZTV16pthread_spinlock___cygwin_environ_wsock_started__sigfe_setutent__ZTV17fhandler_nodevice__sigfe__vasprintf_r__sigfe_calloc__imp__SwitchToThread@0__sigfe_pthread_mutex_getprioceiling__sigfe_seteuid32__sigfe_getopt_long_only__imp__RtlAbsoluteToSelfRelativeSD@12_win32_waveInGetNumDevs@0_RegQueryInfoKeyW@48__sigfe_tmpfile64__imp__SetThreadPriority@8__DTOR_LIST____ZN24fhandler_base_overlapped9asio_doneE__sigfe_envz_merge__imp__GetComputerNameA@8__sigfe___srget_LsaStorePrivateData@12__sigfe_aclfromtext__ZN13fs_info_cache8fsi_lockE__sigfe_xdr_enum_waveInGetNumDevs@0_WSADuplicateSocketW@12__sigfe_semget__sigfe_xdr_float__imp__NtQuerySymbolicLinkObject@12__sigfe_listxattr__sigfe_closedir__sigfe_sync__sigfe_pututline__sigfe_fcvtbuf___rcmd_errstr__sigfe_cygwin_conv_to_full_win32_path_SetThreadDesktop@4__sigfe_acltomode__sigfe___dn_comp_in_forkee__bss_start____sigfe_lstat64__sigfe_pthread_attr_getstackaddr__sigfe_wait4_DeregisterEventSource@4__sigfe_faccessat__imp__FindVolumeMountPointClose@4__sigfe_xdrrec_create__sigfe_mprotect__sigfe_pthread_mutexattr_setpshared__sigfe_wait3_win32_NtCreateTransaction@40__ZTV19fhandler_pty_master_win32_getprotobynumber@4_win32_MessageBoxW@16_RegEnumValueW@32__sigfe_setegid__sigfe_vwarn_win32_LogonUserW@24_proc_len__sigfe_clock_setres__sigfe_chown__sigfe_clearerr_win32_WSAEnumNetworkEvents@12__ZTV26client_request_get_version__imp__NtQueryVirtualMemory@24__imp__GetModuleFileNameW@12_global_sigs__sigfe_cygwin_getservbyport__ZTV9semaphore__sigfe_pthread_getcpuclockid__sigfe_pthread_suspend__minor_image_version____imp__LoadLibraryExA@12__sigfe_vswprintf__sigfe_link__sigfe_cygwin_conv_path_list_win32_GetPriorityClipboardFormat@8__ZTV16fhandler_procsys__imp__FillConsoleOutputAttribute@20__sigfe_siprintf__sigfe_siginterrupt__imp__SetStdHandle@8_ro_u_ntfs__sigfe_xdr_void__sigfe_localtime_ro_u_empty__ZTV13pthread_mutex__imp__QueryDosDeviceW@12__sigfe_posix_fallocate__sigfe_xdr_bytes__imp__QueryPerformanceCounter@4__sigfe___fpurge__ZTV15fhandler_serial__sigfe_fpathconf__sigfe_realpath__sigfe_setgid32__sigfe_fopen64_dev_storage_end__sigfe_pututxline___cp_conv__sigfe_openpty_DefWindowProcW@16_win32_SHGetDesktopFolder@4__sigfe_iruserok__imp__SetEnvironmentVariableA@8__sigfe_aclsort__sigfe_realloc__imp__GetSystemTimeAsFileTime@4__sigfe_spawnl__sigfe_cygwin_sendmsg__imp__GetStdHandle@4_WSARecv@28_SetParent@8__sigfe_pthread_attr_setstacksize__sigfe_pthread_self__sigfe_times___default_hash__imp__FindFirstVolumeW@8__sigfe_tcflush_program_invocation_name__sigfe_sem_trywait__sigfe_getgrent32__imp__RtlGetOwnerSecurityDescriptor@12__sigfe___srget_r_shutdown@8__sigfe_forkpty.weak._malloc.___register_exitproc__sigfe_vprintf__sigfe_fchdir__sigfe_funlockfile_MessageBeep@4_LsaLookupAuthenticationPackage@12__sigfe_dlsym__sigfe_readdir__sigfe_pthread_attr_getschedpolicy__sigfe_xdr_opaque_CryptGenRandom@12__sigfe_getpeereid__imp__RtlQueryProcessDebugInformation@12__sigfe_pthread_mutex_unlock_well_known_samba_unix_user_fake_sid__sigfe_mq_receive__sigfe_dup_win32_NetUserGetGroups@28__sigfe_readdir_r__sigfe_xdrrec_skiprecord__ZN12pthread_null9_instanceE__f_log10f__sigfe_fstatvfs__sigfe_fcntl64__imp__FlushFileBuffers@4__ZTV17fhandler_dev_zero__sigfe__fscanf_r__sigfe_putwc__imp__IsProcessorFeaturePresent@4_ro_u_unixfs__imp__NtAllocateLocallyUniqueId@4__imp__GetCPInfo@8__sigfe_pthread_cond_wait_ro_u_pipedir__sigfe_pthread_continue_CoTaskMemFree@4__sigfe_puts__sigfe_putc__imp__NtQueryFullAttributesFile@8__sigfe_acltotext32__CTOR_LIST____sigfe_mq_unlink__sigfe_xdr_double__sigfe_scandirat_RegCloseKey@4__sigfe_pipe2_WSASocketW@24_win32_LsaEnumerateAccountRights@16_RegOpenCurrentUser@8__data_start___procsys_len__sigfe_sem_init__sigfe_cygwin_getsockopt_wincap_xp__sigfe_pthread_condattr_setclock__sigfe_cygwin_setsockopt__sigfe_cygwin_rresvport_af__imp__CreateNamedPipeA@32__sigfe_posix_madvise__sigfe_swprintf__sigfe_rewinddir__sigfe_dirfd___mprec_tens__sigfe_cygwin_recvfrom__sigfe_pthread_mutexattr_settype__sigfe_setpgid_win32_EnumWindows@8__imp__PeekConsoleInputA@16_win32_bind@12_NetUserGetInfo@16_ro_u_mtx__sigfe_setlinebuf__sigfe_sysconf__ZTV21client_request_setpwd__sigfe_fwprintf__sigfe_fflush__sigfe___res_nquery__sigfe_sched_setscheduler__sigfe_getpgrp__sigfe_strdup__imp__GlobalLock@4__ZN13pthread_mutex15_unlocked_mutexE_GetIfEntry@4_RtlUnwind@16__imp__ReadProcessMemory@20__sigfe_pthread_cond_timedwait__sigfe_renameat__imp__ReleaseSemaphore@12__sigfe_rmdir_getprotobyname@4__sigfe_getwchar__sigfe_pthread_once_dev_storage__data_end____imp__NtOpenMutant@12__sigfe_pthread_mutex_setprioceiling__imp__GetEnvironmentVariableW@12_well_known_service_sid__imp__NtQueryVolumeInformationFile@20___CTOR_LIST____imp__WriteTapemark@16__imp__RtlSetGroupSecurityDescriptor@12__sigfe_readlink_OpenClipboard@4___nlocale_changed__sigfe_getdomainname_WSASendTo@36_GetForegroundWindow@0__sigfe_pselect__sigfe_cygwin_recvmsg__sigfe_sigset__sigfe_fpurge__sigfe_nanosleep__sigfe_removexattr_LsaOpenPolicy@16__ZTV13cygheap_fdget__sigfe_putw__sigfe_snprintf__sigfe_argz_add_sep__ZN16fhandler_console17invisible_consoleE__minor_os_version___win32_GetThreadDesktop@4__sigfe_sigwaitinfo__imp__NtQueryEaFile@36__imp__NtCreateEvent@20__sigfe_flistxattr__sigfe_malloc_trim__imp__RtlSubAuthoritySid@8__sigfe_chmod_win32_RtlGetCurrentTransaction@0_getprotobynumber@4__imp__GetLocaleInfoW@16__imp__NtOpenSemaphore@12__sigfe_xdr_int__sigfe_cygwin_gethostname__sigfe_get_nprocs_conf__imp__ClearCommError@12__sigfe_pthread_sigqueue__sigfe_tempnam__imp__GetCurrentThread@0__sigfe_fread__sigfe_mq_setattr__sigfe_feholdexcept__sigfe_fstat64_allow_winsymlinks__sigfe_xdr_char__sigfe_vsyslog__sigfe_tmpnam__imp__CreatePipe@16__sigfe_pthread_attr_setguardsize__sigfe_canonicalize_file_name_DsGetDcNameW@24_sys_siglist__imp__GetStartupInfoA@4__sigfe_mkstemp__sigfe_futimens__sigfe_cygwin_gethostbyaddr__sigfe_ftruncate_well_known_dlls__sigfe_dlopen__sigfe_pthread_mutexattr_getpshared__sigfe_vfiprintf__sigfe_execl__sigfe_shmdt__sigfe_setutxent__imp__TransmitCommChar@8_win32_MessageBeep@4__sigfe_xdr_vector_GetUdpTable@12__ZN3etc7curr_ixE_win32_waveInStart@4__sigfe_writev___chkstk__ZTV16fhandler_windows__sigfe_cygwin_exit__sigfe_setregid32__imp__GetCommandLineW@0__sigfe_cygwin_win32_to_posix_path_list__imp__TlsFree@4__sigfe_sched_getparam__sigfe_lgetxattr__sigfe_putchar_unlocked__sigfe_signal__imp__SetTapeParameters@12__imp__SetConsoleTextAttribute@8_error_print_progname__sigfe_execvp__imp__NtQueryInformationThread@20__sigfe_fexecve__sigfe__vsscanf_r__sigfe_cygwin_inet_addr__main_tls_GetVolumePathNamesForVolumeNameW@16__sigfe_getopt_ro_u_volume__sigfe_seekdir_waveInReset@4__imp__MapViewOfFile@20__sigfe___res_mkquery__sigfe_sigwait__sigfe_pthread_mutex_trylock__imp__NtAccessCheck@32__imp__UnmapViewOfFile@4__sigfe_pthread_getschedparam___mprec_bigtens__sigfe_open_wmemstream_win32_GetVolumePathNamesForVolumeNameW@16_win32_waveOutOpen@24_NetUserGetLocalGroups@32__sigfe_getcwd__ZN7wininfo5_lockE__sigfe_chroot__imp__RtlCopySid@12_wincap_2003__sigfe_cygwin_conv_path__ZTV25client_request_attach_tty__ZN6dtable22initial_archetype_sizeE__bss_end____imp__GetLocaleInfoA@16_WSAGetLastError@0__imp__SetCommTimeouts@8__imp__NtUnlockVirtualMemory@16__sigfe_cygwin_atexit__sigfe_setusershell_LsaFreeReturnBuffer@4__imp__DeviceIoControl@32__sigfe_xdr_hyper__sigfe__vfscanf_r__ZTV14pthread_rwlock_jit_debug__sigfe_cygwin_umount__imp__NtPrivilegeCheck@12__imp__GetConsoleMode@8_RegOpenKeyExW@20__imp__NtClose@4__imp__RtlIdentifierAuthoritySid@4__imp__GetNumberOfConsoleInputEvents@8__sigfe_ftruncate64__sigfe_statfs__sigfe_pthread_attr_setdetachstate__sigfe_open_memstream___collate_load_error__sigfe_clock_settime_reent_data__sigfe_pthread_mutex_init__sigfe_fgets_win32_RegisterClassW@4__imp__NtQueryObject@20__sigfe_pthread_rwlockattr_init__sigfe_nice__imp__FindNextVolumeMountPointW@12__sigfe___xdrrec_setnonblock__sigfe_timer_gettime__sigfe_maybe_cygwin_detach_dll__f_ldexpf__sigfe_xdr_string__ZTV17pthread_mutexattr__sigfe_fileno_win32_WSAIoctl@36__sigfe_pthread_rwlock_wrlock__sigfe_logwtmp_win32_LsaOpenPolicy@16__imp__GetHandleInformation@8__file_alignment___waveInClose@4__sigfe_vhangup__imp__VirtualAlloc@16__imp__GetComputerNameW@8__sigfe_mknodat__sigfe_xdr_int64_t__sigfe_fts_close__sigfe_facl__imp__NtCancelTimer@8__sigfe___res_nclose__ZN14pthread_rwlock26rwlock_initialization_lockE__imp__RtlCompareUnicodeString@12_DnsRecordListFree@8_win32_WSAAsyncSelect@16_fake_logon_sid_sec_all_nih__imp__GetCurrentProcess@0__ZTV18fhandler_pty_slave__imp__RtlEqualPrefixSid@8__sigfe_mq_close__sigfe_pthread_atfork__imp__GetPriorityClass@4_cygwin_hmodule__sigfe_fputs__sigfe_nl_langinfo__sigfe_fgetc__sigfe_asctime__ZTV18client_request_sem__sigfe_if_nametoindex__ZN8dll_list7protectE_win32_waveOutUnprepareHeader@12__imp__RtlReleasePebLock@0__sigfe_pause_win32_NetUseGetInfo@16__sigfe_cygwin_conv_to_posix_path_getservbyname@8_getsockopt@20__sigfe_pthread_attr_getstacksize__sigfe_ttyname_mandatory_medium_integrity_sid_wow64_needs_stack_adjustment_win32_MsgWaitForMultipleObjectsEx@20_win32_NetApiBufferFree@4_WNetGetResourceInformationA@16__imp__FreeConsole@0__sigfe_mkdtemp__sigfe_getpriority__sigfe_cygwin_getservbyname_MsgWaitForMultipleObjectsEx@20_ro_u_sys__sigfe_endutxent__sigfe___swbuf__sigfe_aclfrompbits__sigfe_fprintf__imp__GetModuleFileNameA@12_passwd_buf__imp__TerminateProcess@8__ZTV16fhandler_termios__imp__CreateFileA@28__sigfe_pthread_attr_setscope_PostMessageW@16_waveInOpen@24__sigfe_strftime_win32_NetUserGetLocalGroups@32__sigfe_cygwin_setservent__imp__WriteFile@20__sigfe_cygwin_rexec__sigfe_getpwnam_r__imp__WriteConsoleOutputW@20__sigfe_msync_win32_RtlSetCurrentTransaction@4_LookupAccountSidW@28__sigfe_pthread_cond_signal__sigfe_fwide__size_of_stack_commit____sigfe_aclfrompbits32__imp__WideCharToMultiByte@32_CreateDesktopW@24_ioctlsocket@12__imp__NtMapViewOfSection@40__sigfe_asctime_r__sigfe_popen__sigfe_fstatfs__sigfe_getutxent_win32_shutdown@8_win32_waveOutGetNumDevs@0__dll_characteristics____sigfe_fesetexceptflag__imp__GetThreadContext@8__imp__GlobalAlloc@8__sigfe_initgroups32__sigfe___res_nsearch__sigfe___res_query_win32_NtRollbackTransaction@8__imp__NtLockVirtualMemory@16__sigfe_pthread_condattr_getpshared__cygheap_start__impure_ptr_GetProcessWindowStation@0__ZTV24fhandler_base_overlapped___hexdig_win32_LsaFreeReturnBuffer@4__imp__VirtualQueryEx@16__sigfe_mq_timedreceive__imp__NtQueryEvent@20__sigfe_cygwin_attach_handle_to_fd__sigfe_pwrite__sigfe_pthread_attr_getstack__sigfe_cygwin_send__imp__EnterCriticalSection@4_ro_u_refs__sigfe__Exit__sigfe_fesetenv_GetModuleHandleExW@12__sigfe_tcgetsid_LsaClose@4_cygheap_max__imp__CreateThread@24__sigfe_fts_children__sigfe_sbrk__imp__SetSystemTime@4_sys_sigabbrev__sigfe_mq_send__imp__GetOverlappedResult@16__imp__NtWriteFile@36__sigfe__pipe__imp__NtOpenDirectoryObject@12__imp__VirtualFree@12__sigfe_unlink__imp__SetThreadContext@8__ZTV16fhandler_process___iso_8859_conv_RegCreateKeyExW@36__imp__NtCreateSemaphore@20_RegOpenUserClassesRoot@16__sigfe_pthread_getattr_np_main_environ__sigfe_err__ZN13cygheap_fdget7releaseEv__ZN15cygheap_fdmanip7releaseEv__ZN15cygheap_fdmanipD0Ev__ZN15cygheap_fdmanipD1Ev__ZN13cygheap_fdgetD1Ev__ZN13cygheap_fdgetD0Ev__ZN13cygheap_fdget7releaseEv__ZN15cygheap_fdmanip7releaseEv__ZN13cygheap_fdgetD1Ev__ZN15cygheap_fdmanipD1Ev__ZN15cygheap_fdmanipD0Ev__ZN13cygheap_fdgetD0Ev__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__Z11__set_errnoPKcii__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZN15cygheap_fdmanip7releaseEv__ZN15cygheap_fdmanipD0Ev__ZN15cygheap_fdmanipD1Ev__ZN13cygheap_fdnewD1Ev__ZN13cygheap_fdnewD0Ev__Z11__set_errnoPKcii__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZNK18fhandler_disk_file8isdeviceEv__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZN15cygheap_fdmanip7releaseEv__ZN15cygheap_fdmanipD0Ev__ZN15cygheap_fdmanipD1Ev__ZN13cygheap_fdnewD1Ev__ZN13cygheap_fdnewD0Ev__Z11__set_errnoPKcii__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__Z11__set_errnoPKcii__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base5cloneE13cygheap_types__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZN13fhandler_base6copytoEPS___ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__Z11__set_errnoPKcii__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__Z11__set_errnoPKcii__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base8set_nameEPKc__ZN15cygheap_fdmanip7releaseEv__ZN15cygheap_fdmanipD1Ev__ZN13cygheap_fdnewD1Ev__ZN15cygheap_fdmanipD0Ev__ZN13cygheap_fdnewD0Ev__Z11__set_errnoPKcii__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN16fhandler_termios12accept_inputEv__ZN16fhandler_termios17get_output_handleEv__ZNK16fhandler_termios6is_ttyEv__ZN16fhandler_termios22__acquire_output_mutexEPKcim__ZN16fhandler_termios22__release_output_mutexEPKci__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN16fhandler_termios6doechoEPKvm__ZN16fhandler_termios12accept_inputEv__ZN16fhandler_termios17get_output_handleEv__ZNK16fhandler_termios6is_ttyEv__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__Z11__set_errnoPKcii__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZN15cygheap_fdmanip7releaseEv__ZN13cygheap_fdnewD1Ev__ZN15cygheap_fdmanipD1Ev__ZN15cygheap_fdmanipD0Ev__ZN13cygheap_fdnewD0Ev__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__Z11__set_errnoPKcii__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZN13cygheap_fdget7releaseEv__ZN15cygheap_fdmanip7releaseEv__ZN15cygheap_fdmanipD0Ev__ZN15cygheap_fdmanipD1Ev__ZN13cygheap_fdgetD1Ev__ZN13cygheap_fdgetD0Ev__Z11__set_errnoPKcii__ZN13cygheap_fdget7releaseEv__ZN15cygheap_fdmanip7releaseEv__ZN15cygheap_fdmanipD0Ev__ZN15cygheap_fdmanipD1Ev__ZN13cygheap_fdgetD1Ev__ZN13cygheap_fdgetD0Ev__ZN13cygheap_fdget7releaseEv__ZN15cygheap_fdmanip7releaseEv__ZN15cygheap_fdmanipD1Ev__ZN13cygheap_fdgetD1Ev__ZN15cygheap_fdmanipD0Ev__ZN13cygheap_fdgetD0Ev__Z11__set_errnoPKcii__Z11__set_errnoPKcii__ZN13cygheap_fdget7releaseEv__ZN15cygheap_fdmanip7releaseEv__ZN15cygheap_fdmanipD1Ev__ZN13cygheap_fdgetD1Ev__ZN13cygheap_fdnewD1Ev__ZN15cygheap_fdmanipD0Ev__ZN13cygheap_fdgetD0Ev__ZN13cygheap_fdnewD0Ev__ZN13cygheap_fdget7releaseEv__ZN15cygheap_fdmanip7releaseEv__ZN15cygheap_fdmanipD1Ev__ZN13cygheap_fdgetD1Ev__ZN15cygheap_fdmanipD0Ev__ZN13cygheap_fdgetD0Ev__ZN13cygheap_fdget7releaseEv__ZN15cygheap_fdmanip7releaseEv__ZN15cygheap_fdmanipD0Ev__ZN15cygheap_fdmanipD1Ev__ZN13cygheap_fdgetD1Ev__ZN13cygheap_fdgetD0Ev__Z11__set_errnoPKcii__ZN15cygheap_fdmanip7releaseEv__ZN13cygheap_fdget7releaseEv__ZN15cygheap_fdmanipD0Ev__ZN15cygheap_fdmanipD1Ev__ZN14cygheap_fdenumD1Ev__ZN13cygheap_fdgetD1Ev__ZN14cygheap_fdenumD0Ev__ZN13cygheap_fdgetD0Ev__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__ZN15cygheap_fdmanip7releaseEv__ZN15cygheap_fdmanipD1Ev__ZN13cygheap_fdnewD1Ev__ZN14cygheap_fdenumD1Ev__ZN15cygheap_fdmanipD0Ev__ZN14cygheap_fdenumD0Ev__ZN13cygheap_fdnewD0Ev__Z11__set_errnoPKcii__ZN13cygheap_fdget7releaseEv__ZN15cygheap_fdmanip7releaseEv__ZN15cygheap_fdmanipD0Ev__ZN15cygheap_fdmanipD1Ev__ZN13cygheap_fdgetD1Ev__ZN13cygheap_fdgetD0Ev__Z11__set_errnoPKcii__Z11__set_errnoPKcii__ZNK7cygpsideqEPv__ZNK13fhandler_base13use_archetypeEv__ZN13fhandler_base8get_unitEv__ZN13fhandler_base22fixup_before_fork_execEm__ZNK13fhandler_base17need_fixup_beforeEv__ZN13fhandler_base10open_setupEi__ZN13fhandler_base7cleanupEv__ZN13fhandler_base7ttynameEv__ZNK13fhandler_base6is_ttyEv__ZNK13fhandler_base6ispipeEv__ZNK13fhandler_base13get_popen_pidEv__ZNK13fhandler_base8isdeviceEv__ZNK13fhandler_base6isfifoEv__ZN13fhandler_base9is_socketEv__ZN13fhandler_base10is_consoleEv__ZN13fhandler_base10is_windowsEv__ZN13fhandler_base10get_handleEv__ZN13fhandler_base13get_io_handleEv__ZN13fhandler_base17get_output_handleEv__ZN13fhandler_base15get_stat_handleEv__ZN13fhandler_base7hit_eofEv__ZN13fhandler_base15get_native_nameEv__ZN13fhandler_base8bg_checkEi__ZN13fhandler_base7set_eofEv__ZN13fhandler_base14has_ongoing_ioEv@4__ZN13fhandler_base6hcloseEPv__ZN13fhandler_base8set_nameEPKc__Z11__set_errnoPKcii__ZN13cygheap_fdget7releaseEv__ZN15cygheap_fdmanip7releaseEv__ZN15cygheap_fdmanipD0Ev__ZN15cygheap_fdmanipD1Ev__ZN13cygheap_fdgetD1Ev__ZN13cygheap_fdgetD0Ev__Z11__set_errnoPKcii__ZN13cygheap_fdget7releaseEv__ZN15cygheap_fdmanip7releaseEv__ZN15cygheap_fdmanipD1Ev__ZN13cygheap_fdgetD1Ev__ZN13cygheap_fdnewD1Ev__ZN15cygheap_fdmanipD0Ev__ZN13cygheap_fdnewD0Ev__ZN13cygheap_fdgetD0Ev__Z11__set_errnoPKcii_RtlSplitUnicodePath@12_RtlEqualUnicodePathSuffix@12__ZN13cygheap_fdget7releaseEv__ZN15cygheap_fdmanip7releaseEv__ZN15cygheap_fdmanipD1Ev__ZN13cygheap_fdgetD1Ev__ZN15cygheap_fdmanipD0Ev__ZN13cygheap_fdgetD0Ev__ZN13cygheap_fdget7releaseEv__ZN15cygheap_fdmanip7releaseEv__ZN15cygheap_fdmanipD0Ev__ZN15cygheap_fdmanipD1Ev__ZN13cygheap_fdgetD1Ev__ZN14cygheap_fdenumD1Ev__ZN14cygheap_fdenumD0Ev__ZN13cygheap_fdgetD0Ev__Z11__set_errnoPKcii__ZN13cygheap_fdget7releaseEv__ZN15cygheap_fdmanip7releaseEv__ZN15cygheap_fdmanipD1Ev__ZN13cygheap_fdgetD1Ev__ZN15cygheap_fdmanipD0Ev__ZN13cygheap_fdgetD0Ev___real__ZdlPv___real__Znwj___real__ZdaPv___real__Znajipfw3-2012/binary64/000755 000423 000000 00000000000 12011754122 014357 5ustar00luigiwheel000000 000000 ipfw3-2012/binary64/ipfw.sys000755 000423 000000 00000460000 12011754122 016067 0ustar00luigiwheel000000 000000 MZ@ !L!This program cannot be run in DOS mode. $sjojijjujmRichPEd'P"  ::p;Pp<PB@H.textQ*, h.rdata@0@H.dataP8@.pdata<p>@HINIT N .reloc\@BHL$HD$HHT$HL$HD$HHT$HL$H(H %HL @AH #HL P[AH !HL 2[AֱH HL ZA贱H HL DA蒱H HL CApH HL CANH 'HL $VA,H(HT$HL$HHD$ $<$($ $HD$(@#t D$D$D$HHL$HHD$ $<$( $%t D$D$D$ḦT$HL$HD$(ЈD$(HD$ @%L$(#t30HD$ @%$ $D$(#$;t3HHT$HL$HHD$4HD$PHHD$(HD$P$HHD$ L$0D$ +D$ HcL$0HD$(HHD$(|$ HD$(D$8|$8u|$8u D$0"HD$(@D$0|$0~ D$ 9D$0~3rD$8D$<|$<t7|$H$$.$H$H$$9A}wH$$9A|H$H$H$ܲHDŽ$H$H$H$@H$HH$u;$H$HAH$3>H$@fD$TH$f$H$@H$@ AF,$H $H$$9A}wH$$9A|H$H$H$ڱHDŽ$H$H$H$@H$HH$u:$H$HAH$3>H$f$H$@fD$TA $H$H$$9A}wH$$9A|H$H$H$HDŽ$H$H$H$@H$HH$u)9$H$HAH$3>H$@fD$TH$f$V $H$H$$9A}wH$$9A|H$H$H$HDŽ$H$H$H$@H$HH$u>8$H$HAH$3>$f$H$H$D$H$D$XHDŽ$C $H$ H$$ 9A}wH$$ 9A|H$H$H$HDŽ$H$H$H$@H$HH$u+7$H$HAH$3>H$@$$t $t,$@f$B$ f$+H$PH &=4t 6$f$H$H$D$H$D$XHDŽ$ $H$H$$9A}wH$$9A|H$H$H$_HDŽ$H$H$H$@H$HH$u5$H$HAH$3>$f$$H$H$D$XH$@%f$H$H$ f$$u$H =3t 4QH$HH$@HlHDŽ$($H$H$$9A}wH$$9A|H$H$H$֫HDŽ$H$H$H$@H$HH$u4$H$HAH$3>$ f$H$H$D$H$D$XHDŽ$$H$H$$9A}wH$$9A|H$H$H$êHDŽ$H$H$H$@H$HH$u2$H$HAH$3>$f$H$H$D$H$D$XHDŽ$$H$H$$9A}wH$$9A|H$H$H$谩HDŽ$H$H$H$@H$HH$u1$H$HAH$3>$f$(H$H$$H$ H$$ 9A}wH$$ 9A|H$H$H$HDŽ$H$H$H$@H$HH$u0$H$HAH$3>L$H$$H$$$9A}wH$$$9A|H$H$H$HDŽ$H$H$H$@H$HH$u40$H$HAH$3>$H$(H$$(9A}wH$$(9A|H$H$H$3HDŽ$H$H$H$@H$HH$um/$H$HAH$3>H$$t @/H$$t !/}$H($,H$$,9A}wH$$,9A|H$H$H$+HDŽ$H$H$H$@H$HH$ue.$H$HAH$3>$H$0H$$09A}wH$$09A|H$H$H$dHDŽ$H$H$H$@H$HH$u-$H$HAH$3>D$T$XH FG=+t a-$H$4H$$49A}wH$$49A|H$H$H$pHDŽ$H$H$H$@H$HH$u,$H$HAH$3>H$H@H$H$H$H$H$HH$@H$HXH$pH$HH$@H$pHHH$@@<H$@@8H$H$@HhJHc$H8H$@Hx0t$=H$$D$PH$$$H$@@GH$@ D$XH$@ $H$@D$\H$@f%f$H$@ffD$|D$|;$}D$|$ $$ $ $$D$X$$$$ $$t$$$H$8H$$89A}wH$$89A|H$H$(H$}HDŽ$(H$(H$H$@H$HH$u)$H$HAH$3>H$@fD$TH$f$H$@H$@ AF$H$<H$$<9A}wH$$<9A|H$H$0H${HDŽ$0H$0H$H$@H$HH$u($H$HAH$3>H$@fD$TH$f$$H$@H$$@9A}wH$$@9A|H$H$8H$萟HDŽ$8H$8H$H$@H$HH$u'$H$HAH$3>H$H@H$$H$@H#$t/#D$Xt D$XuoT$XH$@HHD$HHD$hHD$@H$HD$8$fD$0$D$(D$TfD$ DL$\L$H$H$h"H$HH$HI@$h"H$HH$$ha"H$tH$H$HH$H@@H$HH$HH$Ha$h"H$@Hx0H$HHH$xH$HHH$pH$@H@0H$H$H$p #H$x9uWH$H$p@I#H$x9Hu2H$H$p@I#H$x9Hu DŽ$P DŽ$P$P$h)!H$@Hx0H$HHH$$d$%$$H$HH$$hud$~Z$H$;|%$H$@; DŽ$T DŽ$T$T$hmW $t DŽ$X DŽ$X$X$h H$u DŽ$\ DŽ$\$\$hH$@Hx0t DŽ$` DŽ$`$`$hH$@@($$%0= uL$%t DŽ$d DŽ$dH$H@#$dt DŽ$h DŽ$h$h$h!L$XH$H@;u DŽ$l DŽ$l$l$h|$Pt!H$H$9Au DŽ$p DŽ$p$p$h|$PH$HH$HuH$@f$H$@ff$$duCH$HH$;u DŽ$ DŽ$$$hKH$HHH$$d$%$$H$HH$$hud$~Z$H$;|%$H$@; DŽ$ DŽ$$$hm|$Pt.H$HHH$@%;u DŽ$ DŽ$$$h9|$Pt*H$PH$Ht DŽ$ DŽ$$$hD$Xa$QH$H$T$|H$$H$@ $+f$$duCH$HH$;u DŽ$ DŽ$$$h5H$HHH$$d$%$$H$HH$$hud$~Z$H$;|%$H$@; DŽ$ DŽ$$$hmvD$Xu6$u*H$P H$Ht DŽ$ DŽ$$$hD$Xu2$u&H$HH$t DŽ$ DŽ$$$hD$Xu1$u%H$HH$@9Au DŽ$ DŽ$$$heD$Xu1$u%H$HH$@9Au DŽ$ DŽ$$$h D$Xu5$u)H$HHH$@;u DŽ$ DŽ$$$hD$Xu-$u!H$@ t DŽ$ DŽ$$$hZH$HH$DŽ$hHDŽ$H$tH$x tHDŽ$H$uH$H$@A |$PtH$@ H$@H$H$HH$HD$8$XD$0$fD$(H$HD$ L$L$@$H$PJoDŽ$hDEvH$H;Ps DŽ$ DŽ$$$hH$uEH$Hx@t6H$@D@DH$HR@$u DŽ$ DŽ$$$h$v7H$uH$@D@D3ҋ$=t DŽ$ DŽ$$$h8H$uO$vE|$Pt>$st.H$@D@DH$HR@$$h DŽ$hD$P$hH$H@=u$X$H$H@$$$E3D$rDH$H$ H$H@%t-H$ tH$ H$DŽ$hXH$ uMAE3$rDH$ H$ tH$ H$DŽ$h H$@HDH$H@;u DŽ$h H$H@=u$X$H$H@$$$($duME3D$(rDH$Ht DŽ$ DŽ$$$h H$H$0H$0H$H$0H$0$hH$0x rDtH$HHH$8$d$@%$@$@H$8HH$8$hul$@~bH$0HH$8;|)H$0HH$8@; DŽ$ DŽ$$$he D$XL$@H$HH$P TtD$xDŽ$`DŽ$DŽ$hc $=D$XuH$H$ HDŽ$H$@H8L$H$NH$H$H$HIHH$HHHc$H$HH H$HH H$H@H$PH$PPH$PD@H$VD$`H$PHH$PHD4H$HH$PPH$PH+$`yCDŽ$dDŽ$h H$H,u DŽ$`DŽ$h D$xDŽ$`DŽ$ L$T$`H$@H$HB=u$X$H$H@$H$@$A(H$H2uH$@H(H$@H(=tH$@H(@H$@H(D$xDŽ$`DŽ$H$@Hx0tDŽ$`DŽ$H$H4u DŽ$ DŽ$$D$xL$T$`H$@UH$HB=u$X$H$H@$H$@$A(2H$PHI HH$PHH Hc$H$PHH(H$PHH(g{H$PP0DŽ$`H$PHI HH$PHH Hc$H$PHH(H$PHH( {H$PP0H$H@=t/H$PH$PH9uH$P@D$`H$H@=u$X$ H$H@$ $ $DH$P@9$DH$P@$DE3$DH$D$`H$H@=t*HcL$`H$PHHH$PH$PH D$`D$`H$@9D$`}0HcL$`H$H@ HHȋb#tHcL$`H$H@ HH$PH$P@$`H$PH4H$HDŽ$hDŽ$dDŽ$\}$|$P$uyD$XuH$t^H$@uLD$\%=t:DD$|H$HPL$H$@(H$@HH$D$xDŽ$`DŽ$H$@Hx0tH$t$H$HHH$HH$HxuRH$@HǰH$H󤋌$XH$@H$@HH$@HHH$@H$HHAD$xDŽ$`DŽ$$L$T$`H$@H$HB=u$X$H$H@$H$@$A(=.tH$@H(@H$@H(H$HLu DŽ$ DŽ$$D$xDŽ$`DŽ$PH$PHI HH$PHH Hc$H$PHH(H$PHH(vH$PP0H$@H$H@ADDŽ$`H=yu D$xL$T$`H$@H$HH@H$XH$XH$H@=u$X$H$H@$$$PH$H($PaH$XH$Xu#D$xDŽ$`DŽ$H$H@=tH$HH$XHAL$H$XH$@VD$xDŽ$`DŽ$H$PHI HH$PHH Hc$H$PHH(H$PHH(DŽ$`H$@f$`$`%?u3uH$~eH$H$@H$HH$u D$xH$H@H$H$$$d3u3H$fH Hc$dHuH$dH$fP "$dH$ɓH$fP D$xL$T$`H$@DŽ$H$HH qH$H@%t0$hu DŽ$ DŽ$$$h$ht H$H@@t DŽ$\H$H@@u2$t$tmHcL$`H$H@ HH$hH$hHI HH$hHH Hc$H$hHH(H$hHH(trH$hP0D$xH H$H0H$8D$x=t H سH(_^N(vc'(a $#|%|"%X&'x)   _269:#;+<9n<#;<<63455533X3y3:>>>@N@>>22+DdBCCuC=BECFwJ J JU0EEwJKPPMNLLLLPo2RIT G?7?7F2D*6@UUUUUUUUUUQQGU!GUHR)HH8D$ ?P=ttHOHD$( HQHD$(LL$(LPHIH RC="uH .)=uH H ZD$ H8H(3ZOH ʰH(HL$HHHD$0H HD$(pdHD$(@HD$(@8llLHD$(LX HD$(Hx tHD$(HGlHD$0H|$0u3HD$(Hx t3HL$(HI 5H .HL$(]VD$ |$ t H 6l3HD$0fHHD$0fHHD$0fHHD$0@HD$0@5=t D$8-D$8.HL$0D$8A4HL$(HI HD$0HHL$(HD$0HAHL$(HD$0HHD$0@HD$(ǀPHL$(H0HL$(H@ 3uN_ Hp#H HH  D$ D$ HHHL$HHH HD$03 H H| HL$0H@jDHD$0DHHL$0H@HD$0HLHL$0H@*DHD$0DHHL$0H0DHD$0D8HL$0H0HD$08HL$0H0DHD$0D83yMHL$0SHD$ D$( D$(D$(HD$0@9D$(}0HcL$(HD$0H@ HHD$8HL$8HD$ HHD$8HD$ HD$0Hx t3HL$0HI NHL$0H0HD$08 HL$0H@HD$0HH|$ t HL$ 3uL3HHLD$T$HL$H$D$(D$|$t|$t|$t|$t $-$HHT$HL$HL$HD$H@PHHL$HD$HAP3uDL$ DD$T$L$WH0HcD$PHD$ L$ gHD$(H|$(t6HcL$ H|$(3HT$(D$HfBHL$(D$PfA HL$(D$@A HD$(H0_LL$ DD$T$HL$H8HL$@HD$ H|$ u3(HL$ D$H9A uHD$ @;D$Pt3HD$ H8DL$ LD$HT$HL$VWHHHH3H$0H$hHH@$u3u$xu DŽ$ DŽ$$$xH|$03E3E3 HcD$0HtQ)HcD$0Ht<pNH=nu :>H=u "&H=u  HcD$0HtHcD$0Ht|$(tHD$ H rD$(D$09D$,tHD$ H rPHD$ D$8|$8Br#|$8Kv |$8OtH h詎+\HD$ H }莎A|$(uH o"3HD$ DD$0H KHH {yz(y2z${z<{yy{f{{x{{zQ{{y=y?|   LD$HT$HL$VWHhH$HD$0H$HD$0HHD$HHc"HD$8D$( D$(D$(H$@9D$(aHcL$(H$H@ HHD$P=^HD$P@HH,D$@HcL$@HD$0HDH;D$HwqHcL$@HH|$0Ht$PHL$0 D$X|$Xt3HL$0|AHD$0x(tHD$0H(HL$8HD$0H(HcL$@HD$0HHD$0HD$P@HH4D$@HcL$@HD$0HH;D$HvH y`HD$0HD$ HcL$@H|$ Ht$PHT$ BHD$ x0tHD$ H0HL$8HD$ H0HcL$@HD$0HHD$0HT$HHL$0,H$HD$0H+Hh_^HL$HH$HI .:D$8|$8t D$8" H$xntH$8u L$4#%)HL$PH@HD$PH+D$8D$0H$Hxt.AAHT$0H$6D$8|$8tH$xsu DŽ$ DŽ$D$T$0HL$PcD$8NA A HT$hH$<6D$8|$8t D$lD$ DL$rDD$hT$pHL$P:(D$8A A HT$xH$5D$8|$8tD$DD$x$HL$Ps)D$8AAH$H$5D$8|$8tmHL$PH0DHD$PD8$HL$P*D$8HL$PH0HD$P8[AAH$H$4D$8|$8tHL$PH0DHD$PD8L$$HL$P,D$8HL$PH0HD$P8Ȼ|$8txAH$H$3D$8TH$Hx s D$88H$H@HD$@L$@Z@H$A LD$@H$H$4D$8|$8t3H$/HD$@H 3ҹ HHH$HL$PH0غDHD$PD8H$HL$P,D$8HL$PH0HD$P8|$8t3H$DLD$@H$H$2D$83H$jH=tH$D$8HH D$8H=gtH$7D$8HZH ԂD$8H=)tH$D$8HH 薂D$8ZH=tH$6D$8HH j[D$8H$PH i:D$8D$8HĸÖF҅ňňňňň4 } ӇOHL$VWHXHD$pHD$ D$DD$@=HD$8H|$8u H|$8Ht$pHT$ HD$8@BHL$ HD$8@AHL$ HD$8@fAHL$ HD$8@fAHL$ HD$8@fAHL$ HD$8H@HAHL$ HD$8HHHL$ HD$8@fAHL$ HD$8H@ HAHL$ HD$8H@(HA HL$ HD$8@0A(HD$8@D$DHD$8H4HD$(HD$ H,HD$04L$@D$D+D$DHcL$@HD$(HHD$(HcL$@HD$0HHD$0|$D~xHD$(@?D$@HD$(@?HcHH|$0Ht$(HD$08~HD$0HD$0D$D9D$@~HD$(H M3HL$83HX_^HL$VWHXHD$pHD$ D$DD$@;HD$8H|$8u H|$8Ht$ HD$8@D$DHD$8H,HD$(HD$pH4HD$04L$@D$D+D$DHcL$@HD$(HHD$(HcL$@HD$0HHD$0|$D~{HD$(@?D$@HD$(@?HcHH|$0Ht$(HD$08~HD$0HD$0D$D9D$@~HD$(H \}~JHL$pHD$8@AHL$pHD$8@AHL$pHD$8@fAHL$pHD$8@fAHL$pHD$8@fAHL$pHD$8H@HAHL$pHD$8HHHL$pHD$8@fAHD$p@HL$pHD$8H@HA HL$pHD$8H@ HA(HL$pHD$8@(A03HL$83HX_^LL$ LD$T$HL$H(H`H9D$@uMHD$0u=HL$0H@E3HH,HL$0H@T$P L\$0AǃHL$0H@LD$HHHD$8i'HcHD$0HLD$0I@HT$0HHL$03H(HL$H8HL$@lD$ D$ tHL$@SD$ LD$@HH [|3H8fT$L$H898HD$ H|$ uHD$ HL$ HXHD$ HHHD$ H8H(-H H(H(H uHL A:3H sHL A3H HL A2H HL A2H }HL A2H HL lA2H HL bAn2H HL AL2H HL A*2H ÅHL A2H хHL A1H(HL$HHL$ HD$ @3HD$ @3HD$ H 3$ }$#$$HHT$HL$HXD$@D$0H=:t =u H|$ht79u7D$ D$ D$ 9D$ HD$(HcL$ HHHD$8H|$8xHD$hH9D$8uKH|$`tHD$8H@H9D$`t.HD$8@t)u@D$0|$@u H|$hu"HD$8@vtHD$8PvH Ax$H|$ht6DHD$8@`A+Å~HD$8@t)uHD$8@vHD$8HD$HHD$8@t(uHD$8H@HvfHD$8H@fHvH|$(tHD$8HHD$8HL$(HD$8H"HD$8HHD$8HcT$ H HD$8HыaX3HL$HHD$8HD$(HD$8HHD$8|>T$@L$0D$@D$@;}HXHL$H(H r3HL$0H \H(LD$HT$HL$HhD$8HD$0H=u\HL$pD$ HD$(HcL$ HjHHD$0H|$0HD$0@t)uHD$0@vt4DHD$0@`A+ÅHD$0HD$@HD$0@t(uHD$0H@HvfHD$0H@fHvH|$(tHD$0HHD$0HL$(HD$0H"HD$0HHD$0HcT$ H HD$0Hы{3HL$@HD$pH HD$0@5;HD$0@t)HD$p@HT$0HHHL$pH AuuZHT$0H8HL$pHAuu9HD$pH HD$0@2;u#HD$pHHD$0@0;u D$8NHT$0H8HL$pH AGuuZHT$0HHHL$pHA&uu9HD$pH HD$0@0;u#HD$pHHD$0@2;u D$8HL$pHD$0@,9AuGHL$pHD$0@(9u6HD$pH HD$0@2;u HD$pHHD$0@0;u D$8uHL$pHD$0@(9AuGHL$pHD$0@,9u6HD$pH HD$0@0;u HD$pHHD$0@2;u D$8HD$0HD$(HD$0HHD$0H|$0u8H|$(t=HL$(HD$0HHHcT$ HL$0H@HHHcT$ H -HD$0HHD$p@ HD$p@D$H|$8u D$HD$P D$HD$PHL$0D$PIh HD$0HhHD$0@hD$T|$Tt5|$T|$Tv7|$Tt-|$T11 UHD$0H`H$twH$@ȉD$L|$8u2HD$0xltHD$0HlD$L+|HL$0D$LAl-HD$0xptHD$0HpD$L+|HL$0D$LAp}0 HD$0H`f9ra0 HD$0H`2i9_r[N-0 AHD$0H`:HD$p@ u0 8HD$0H`/ HD$0H`H|$xt HL$xD$8HD$0HhLD$HT$HL$H8H XLD$PHT$HHL$@HD$ H|$ ujH [-HD$ H8H(=Zv N H?#tS-i%?H=?t3H 4Ƨ H,HH=u =w3ҋH(LD$T$HL$VWHxH=t=u$9utH=u3wH$D$ 6+HD$(H|$(uH {o3;$(u\H$HD$0HD$0@t)t H z{+HD$0HvfHD$0fHvHL$(HD$0HAHD$0H@H$H|$8H$8H|$(Ht$8H(8b- HD$(H`HL$(H$HA$HD$(fHtHD$(H@ HD$(H@3HD$(fHvHL$(D$ AdHcT$ HL$(H>HHHcT$ H +HD$(HыHD$(Hx_^HT$HL$HHH=nHD$P@u D$4D$4D$4D$0HL$PD$ HcL$ HHHD$( HD$(HHD$(H|$(HD$(@t)HD$(H@H9D$XHD$PH HD$(@5;HD$PH HD$(@2;HD$PHHD$(@0;|$0tBHT$(HHHL$PH Amu!HT$(H8HL$PHAemt*|$0u?HL$PHD$(@,9Au-HL$PHD$(@(9uB+ jHD$(H`HD$(LD$X)HL$PHHDL$ LD$HT$HL$VWHHH3H$D$`D$HH H$0H8E33.HD$XH|$XtF*9t*H2xH Kx,lgH X*39{r 3!k9arI*9<t*/HwH xkH H$($$'t$(t%H$0H8L$ 'H$(@f$H$(@=u$8$H$(@$$$3f$$f$$D$|D$|D$xH$0@E$H$0@G$Ƅ$H$0@G$t2H$H$0HXH$H$$t2H$H$0HHH$H$<$tH$0@HkxH$$HHT$HL$VWHXHD$(H=uuHD$pHHD$8H fD$0 D$0D$0ũ9D$0HcL$0HHHD$ HD$ HHD$ H|$ HD$8HxH;D$xHD$8HD$@H|$@Ht$ xHD$ H@HL$@@fAHD$ H@HL$@@A HL$@HD$@HHD$@HD$(HD$@@`+… D$HHD$@@`+‰D$HHL$@D$HA`HD$8HxHD$8#{H l>H|$(tH|$(3HL$pHD$8HHX_^DL$ DD$fT$HL$HHD$X=| NL$XHD$PHD0HD$(HD$ H|$ u HL$ D$pHD$ @pHD$ @`D$htD$h +ȸЉD$8D$8L$8HD$ HtHD$ @tL$`#HD$ HdHL$PH0DHD$PD8HT$ HpHL$ H`LL$ LD$(HD$(PHD$0H|$0u2HL$PH0HD$P83HL$ Ó HL$PH0HD$P83HHDL$ DD$fT$HL$HxH1H3HD$`$=| "$H$HD0HD$@D$0D$0D$H$t!$ +ȸЉD$XD$XD$XȉD$4L$4$#D$LH$H0DH$D8LD$@HT$0HL$HHD$@P(HD$ H|$ u+H$H0H$8P3H$H0H$8%3HL$ (3HL$`H3ZHxHT$HL$H8HD$HHD$(LD$(HT$@HR HL$@HIHD$(P(HD$ H|$ t 3HL$ 3H8fT$HL$H8D$H=|IL$HHD$@HD0HD$ H|$ u H \g3uLD$ HEHL$ HD$ PP3H8HL$H83fD$ D$ ffD$ D$ =}0T$ HL$@ED\$ HD$@JD0HD$(HL$(f6H8HL$H8D$ D$ D$ |$ }YHcL$ HD$@HL0 o4u:3fD$$D$$ffD$$D$$;D$ }T$$HL$@ָ 3H8LL$ DD$fT$HL$HXHўH3HD$HD$h=|3]L$hHD$`HD0HD$(D$8D$pD$ZH$XH$ DHEH$HD$ LZZHL$p"$hHc$hH=sHc$hH+H$ HDŽ$Hc$hHLpL$PLYH$H$H@f$H$H@f$$%?$% tHYH$HYH$$8H$H$$+H$H@fDH$HD$0T$(L$ LDY HL$H܀H$tH$@$ DŽ$HD$HHD$ LL$pL$$H YI$tFH$tH$@$ DŽ$D$$H XeIH$H3HHOyc'SwϺlϸ   HT$HL$HHD$(HD$HD$ H$HD$@|BHD$PHD$HcHH$ #tHD$H@(HD$HD$H@ HD$HD$HLD$HT$HL$H(HD$0H$HD$@HD$HD$8HD$HD$@|eHD$PHD$HcHHD$ #t2HD$PHD$HcHH$ #tHD$H@(HD$HD$H@ HD$HD$H(HT$HL$HHHD$PHD$(HD$XHD$HD$HD$HH$H$HD$HD$HD$(+D$HD$(HHD$(HD$HHD$D$ |$~HcL$H$H+H$H$H9D$s[HD$HD$(ы#t3HD$(HD$HD$(HHD$(HD$HHD$;tD$ HD$H9D$s HD$HD$HHD$t3nԃ|$ tH|$}AHcL$HD$(H+HD$HD$H9D$(s#HD$(HD$(HHD$(tу|$ u D$0D$0D$0HHLD$HT$HL$H8HD$(H|$Ht:HD$PHD@HL$H1 HD$ H|$ u3_HD$ H@HD$(HT$PHL$@HD$ H|$ t0H|$(t(H|$ t HL$ HD$(H9A tHD$ H@(HD$ HD$ H8DD$HT$HL$H8HD$@HD$HD$HH@HD$HD$HH@ H$HD$HD$;}HD$D$( HD$D$(D$(D$H<$u HH$*H$9D$} D$D$, H$D$,D$,D$HcL$HD$HHD$ HcL$PH$HH$HcL$PHD$HHD$HcL$PHD$HHD$(HD$HHD$HD$HHD$H$HH$HD$ H9D$s'HD$HD$3H$#t3른H8HT$HL$HH$HD$ H$HHD$pHD$ HD$0HD$pHD$PHD$p@D$DHD$0D$`HD$p@|CHD$pPHD$pHcHHD$0 #tHD$pH@(HD$pHD$pH@ HD$pHD$pHx tHD$pH@ D$`HcL$DHD$0HHD$0HcD$DHL$pHAHD$XHcL$`HD$ HHD$hHD$0HHD$0HD$XHHD$XHD$hH9D$0sHD$0HD$X;t*HD$p@tHD$pH@(HD$pHD$pBHD$0HD$X3%D$LD$HD$LD$L|$L~ D$HD$HHL$ HD$0H+D$@L$HD$@D$H+D$HD$xHD$pHD$(HD$(Hx uHD$pH@(HD$pHD$pH@(HD$pH|$ptOHD$p@tHD$p@9D$x HD$pm"DD$@HT$pHL$ Nt HD$pIHD$(HD$pHD$pH@HD$pHD$pHH$H$H$@t'H$9D$xH$H@HL$pD$@9A}HD$p@$ D$@$$D$DL$M@HT$pHL$ ]HD$8H|$8t'HL$8H$H@H9A tHD$8H@(HD$8H|$8tDD$DHT$8HL$ -tHD$8+H$H@H$HD$PH9D$p3HĘLD$T$HL$HHD$0H$H$H0HD$HL$D$(fAL$(HD$HHL$H$HA L$(HD$HH$fHH $HD$ HAH $HD$HAHD$@H$@HD$HH$HHD$HLL$ LD$HT$HL$HH$HD$ H$HHD$8HD$8@D$0HD$ D$PHT$8H$HD$HHcL$0HD$ HHD$(HcD$0HL$HHAHD$XHcL$PHD$ HHD$`HD$`H9D$(s4HD$(HD$XHD$(HHD$(HD$XHHD$X;tH$HD$HH$HD$(PHD$XH3%D$THL$ HD$(H+HD$4 D$4D$4|$Tt D$TD$THD$8HD$pHD$ HD$(HD$pHD$hHD$pHcHHD$(HD$pH#tHD$pH@(HD$pHD$pH@ HD$pHD$p@9D$4wL$T$4H$QHD$HHD$HH@ HD$@HD$hHcHHD$(HD$hH#uHL$hHD$HHA HL$hHD$HHA(HL$pHD$HHAHL$HHD$hHAHD$HHcHHD$(HD$HH#uHL$HHD$pHA(HL$HHD$@HA(HL$HHD$pHA HD$@HĈDD$T$HL$VWHxH$HD$@D$8HD$@D$d9D$d~ D$d$u DŽ$$9D$dHTHha$~%$HcH5HH=rHD$dD$ $9D$ ~4$D$d+HcHc$Ht$@HHc$H=(HHcL$dHHHD$(HH9D$(vHD$(@uHD$(HHD$(H ݅HD$(H+D$d$9D$d&9D$ | D$dHWHhd|9D$ }"L$ l+HcHcD$ H=wH3D$dJH _<HHH EHD$0LcD$dHT$0HRH &:t HD$0H|$0u $t HD$0HcH`^HD$0HD$0HD$HH|$Hu3HD$0H`HD$(HD$(HD$@HcL$dH|$(H5LL$0LD$TH<HL$(HD$0|$Tt#H wI93HL$HpHD$0HcL$dHD$@HHD$XD$PHc$HD$@HHD$(HD$XH9D$(sHD$(=uHD$(HHD$(HD$XH9D$(tgD$` D$`D$`HD$(D$`#t D$8D$8HD$(HcL$8H;uHD$XHH9D$(tD$PHD$@HL$(H+HcD$8HȉD$8+L$8HD$0fH|$PtHD$0HHD$0HHD$0Hx_^HT$HL$H(HD$0HD$HD$8HD$HD$HD$;~nHD$HD$;uXHD$HD$HH$H$H9D$s9HD$HD$HD$HHD$HD$HHD$;~3H(HT$HL$WH0H=tHHD$ HD$ H@H˂ HD$ H|$ uH KG|73H|$ 3 HT$ HD$@@fHL$ HD$@@AHD$@@tHL$ HD$@HAHL$ HD$@H@ HAHL$ HD$HHAHL$@HD$ HHD$ H0_LL$ LD$HT$HL$HH$HD$ H$HD$`HD$0H$HHD$X3fD$P3fD$8H|$`tZHD$XD@3HL$`HD$0H|$0u3HD$0@fD$8HD$0H+fD$PHD$0H@HD$`L$LD$hH$HL$ HD$pHD$pHD$(|$hHD$pHD$xHD$pHD$xHD$pH@(HD$pH|$ptrHL$pHD$`H9A u3H|$`tLHD$pHx tBL$8HD$p@;|.HT$pHR HL$`uHT$pHR HL$`tnHD$(H9D$pHD$0H$H$HD$pHL$pHD$xHA(HL$pHD$x@AHD$xH@HD$0HL$pHD$0HAHL$xHD$pHAHL$0HD$xH9A uHL$0HD$pHA HL$0HD$pHA(HD$pHD$(H$HD$0YH$HD$pHL$pHD$xH@(HA(HL$xHD$pHA(HL$pHD$xHAHD$pHx(tHL$pHI(HD$pHAHL$pHD$ HAHD$pfHHD$p@H|$`t?HL$pHD$`HA HL$pHD$0@fAHD$0PHD$pH HD$pHHD$(H@HD$x|$ht]HD$xH+fD$8HL$xHD$(H9A(uHD$xH@ HD$0HD$xH@(HD$0HD$0@HD$xHD$@HD$0H@(HD$0H|$0tnHD$0Hx t]HD$0HD$8;|KHD$0H8u@3HL$07H$HL$@H$HH$tH$HHD$@|wHD$0H8tlHD$0HD$@H$HHD$@HD$@HH$H$tH$D$8;|HL$xH$HHD$@HH|$`tL$PHD$x@;~ HD$pHD$p@fD$8HD$xHD$0HD$xH@HD$xL$PHD$x@; HD$XH9D$0uHD$0HD$@H$HHD$@HD$@HH$H$H$D$8;}H$D$8;~H$@t=H$H@H@ HD$HHD$p@tH 3AD1HD$pH$H@HD$HHD$`H9D$Hu0H$HH$HHL$pH$HHD$pOHT$HHL$`FuHT$HHL$`3tHT$@HHL$pLHD$@LHD$pHĘLD$HT$HL$VWHH$ HD$(H$(HD$`H$0HHD$@HT$@HL$(_HD$xHD$@@D$0HD$($HD$xHD$8HD$@HD$hH|$xt4L$0$+LcHcT$0HD$xHPHcD$0HL$(H/t3-H|$`teDD$0HL$`HD$@H|$@u3HD$@H@HD$`HL$xHD$`H9A tHD$xH@(HD$xH|$xu3HD$xHx t%HD$xHH$H$HD$XH|$XuHD$x@t6H$HD$xH9AuH$x~H >.3FTH$HD$xH@ H9AtH >.VH$HH$HH$x|*HD$xH+D$PHD$8H@H$H$@9D$P~H$HD$@H$H@H$H$@9D$P HD$hH9D$@uHD$@HD$HH$HHD$HHD$HHH$H$tIHD$XH9$u8HL$HH$H@HH$HxHAH$HxH$u#H =n-HT$xBt3HD$x@t3HD$xH@H$HD$8H@(HD$pH|$pHD$8H9D$xuWHD$pHD$@HL$@H$HAH$HD$xH9A uH$HD$@HA H$HD$@HA(HD$8HD$ HD$ HD$@H|$ t HL$ HD$xH9A(tHD$ H@(HD$ H|$ t2HL$ HD$xH@(HA(HD$xHx(tHL$xHI(HD$ HA H <0,HD$xH0H$H$@HD$@H0HD$@H$H$0H$H|$@0H$H@HD$ HL$ H$H9A uHL$ HD$@HA HL$ HD$@HA(HL$@HI HD$@HAHL$@HI(HD$@HAH$HD$xH9A uH$H@(HD$@H$H@ HD$@H$H@HD$ HL$ H$H9A(uHL$ HD$@HA(HL$ HD$@HA HL$@HD$ HAH$H8OHD$@@|PHD$@HD$HHD$HHH$H$tH$HHD$HHL$HH$HHH$HH$HD$@H@(HD$@H$H|$@HD$@HH9$uyH$H@H$HD$@HH$HH$HH$x}"H$HtHAH$HtH$H$GH$tLD$@H$H :|)HD$xH0HD$@HD$@H9$H$Ht$@0H$H$0H$HI H$HAH$HI(H$HAHD$@H@HD$ HL$ HD$@H9A uHL$ H$HA HL$ H$HA(HD$xHHD$xHHD$xHCHD$xHCHD$xH_^LL$ LD$HT$HL$HxH$HD$@H$HD$8HD$(D$ H$HHD$XHD$X@|rHD$XHD$(HD$XPHD$XHcHHD$8 #uCHD$XPHD$XHcHHD$@ #tHD$XH@(HD$XHD$XH@ HD$XHD$(HD$XHD$X@D$`HD$X@|HD$XH@ HD$X|$ (HD$XHD$0HL$XHIHD$XH9A(u7HD$X@u'HD$XH@HD$XHD$X@;D$`D$ HD$XH@@tD$ HD$XH@H@(HD$XHD$X@|HD$XH@ HD$XHD$XHD$PHD$0HD$XH|$XtEHD$XH@(HD$0HD$X@u%H$HL$X$D$H|$HtD$H+HD$PHD$XHD$X@tD$ 3HxLD$HT$HL$HHHD$PHHD$8HD$8@|HD$8H@ HD$8HD$8HD$ HL$8HIHD$8H9A(u HD$8@uHD$8H@HD$8HD$8H@H@(HD$8HD$8@|HD$8H@ HD$8HD$8HD$0HD$ HD$8H|$8t?HD$8H@(HD$ HD$8@uHT$`HL$8T$XD$(|$(tD$(%HD$0HD$8HD$8@t3HH̉T$HL$VWHxH$H8t eHD$(H|$(u3GHL$(H)H$HD$(HLD$(Ih$H oNHD$8HD$(HHD$ HL$8HD$ HA(HL$8HD$8HAHD$8H@ HD$0HD$8@HD$0@+$HD$0fHH|$@Ht$00Ht$@H|$ 0HT$ HoHBHL$(HHAHL$(H*HA(HL$(HHA8HL$(HHA@HL$(HZHAPHL$(HHAXHL$(HD$8HHx_^HL$H8H|$@t HD$@H8uH3H 3q3uHD$@HHD$ 3HL$ ZL\$@IH8̉L$WH0D$@ n=nuH 3" mkHmH=mu H 3mkHcH=m3HcmHmHHD$ HD$ HwmHc mHimHHD$(HD$(HlHD$(H9D$ sHD$ HD$ HHD$ 3H 8m u H 03;H0_̉T$HL$HXD$4D$8D$( HD$`HHD$`H|$`@|$h5HD$`xuHD$`H@HD$ |$8uEHD$ D$1L$0D$4D$4HD$ HHD$ HD$`@D$8D$hD$h HD$`@D$8D$89D$h}D$hD$8L$8D$h+D$hHD$ HH|$8~yD$4D$,D$,L$.D$4|$4~D$4-D$4D$4D$<D$4D$HT$PHt/HD$PHH@`HxhtHD$PHH@`HL$PPhHD$PHǀD$Xt,H|$P33HL$Pb;__%HL$PH_HHD$PH_3uH@_̉T$HL$H8D$ 3uHD$@HHD$(H|$(t8HD$@HHL$@HH3uD$ D$ T$HHL$(3uH8̉T$L$H8D$(|$HuH n_P:j_HcT$@E3A@H ^HD$ H ^}u3H ^|H^3uH|$ tHL$ D$(D$(|$Hu^H ^9D$(H8LL$ DD$HT$HL$H(HD$0HD$D$@u HD$8HD$ HD$8@HD$D$$HL$$9Au D$D$D$H(LD$T$HL$VWHH$HD$0HD$0HH@HD$@L$@HD$8H|$8u3HL$8HhA 蠂Ht$0HvH|$H\Ht$HH|$8\HT$8HD$8@BpHD$8Hǀ3uHL$8HD$0HHA`HD$8ǀHD$8@tcHHD$(HHD$ L A`HD$8P 3xHHD$8HHD$8Hu3HL$873!HD$8H@`7\.\HD$8Hĸ_^HT$HL$WH0HD$@HD$ H|$Ht D$(D$(HL$ HT$(hHT$ Bt0E3HOHL$ H3HL$ H z"HD$ Ht3HL$ HHD$ Ht$3HL$ H6HT$ HǂHD$ HǀHD$ H@`HxHtHD$ H@`HL$ PHH|$ 33HL$@6ZZH0_̉L$H8HcT$@E3A@H Z{HD$ H Zyu3H ZxHZ3uH|$ u%L$@gHL$ (3H8LL$ LD$HT$HL$VWHxH$HD$HH$H H$H+D$@HD$H9D$@|HD$Ht HD$H@uNHD$HHD$HD@L$0D$@D$($D$ L$HPH Y 3uHD$HH$H?H$HD$H@u;H$HHD$PCHcHD$PH@HHHHD$PHHHD$H@uxH$HD$`H$HHD$XHD$`@tHL$`HwD$h)HD$`Ht D$lD$lD$lD$hHL$XD$hAHD$HH$HH$H3Hx_^LL$ LD$HT$HL$VWHXH$HD$HHL$pH HD$xH+D$@D$D`D$D9D$@|HD$HtHD$H@tGHD$HD@D$DD$0D$@D$($D$ L$HH /D3uHcL$DH|$pH?H$HL$pH D$DfHcL$DHD$pHHD$pH3HX_^HT$HL$HXHD$`HD$8HD$hHD$0HD$0HHHD$@D$ L OLD$8HT$0HRHL$0H t*HD$@@HL$@HE33DHD$@DX3HXDD$HT$HL$H(HD$8Hu3FHD$8@ tLD$0HHL$8H^zHT$0HL$8H3H(HT$HL$VWH8HL$PH HD$PH H@H+D$ D$$8H|$Xu3uD$$9D$ }$DL$$DD$ H& H / PGHcL$$H|$PH?H?Ht$XHL$PH H D$$fHD$PHHcL$$HHD$PHH3H8_^DD$HT$HL$HHHD$PHHHD$0H|$Xu33uHD$X@D$ L LD$XHT$PHRHL$PH tvHD$X@ tHL$XHsD$8)HD$XHt D$<D$<D$3Hh̉L$H(HcT$0E3E3H NoH(HL$HhHL$pHD$p@hHL$pHD$p@tHZH cHD$pH@tD$ |$  D$P8Mi|$ D$PHcD$PHD$0HT$0HkHD$pHcHHHHD$HHc MHD$HHHHHD$pHD$puHD$pǀHL$p+HHD$(HD$(HD$8HD$pD$@ D$@D$@|$@~HD$(HD$8HHD$(HL$pD$(HD$pHpHD$pHD$pHlHD$pHL$pHD$p@pIl+HD$pHD$pHD$pPpHD$pHD$pHD$p@ @tEHL$p+HL$pylHD$pHD$p+HD$pHD$pHt$3HL$pH'L\$pIǃ=Ku=H CL\$pAK HD$pH HD$pH HD$pH aHL$pKHD$pHfLHD$pLHD$pHu=H 2L\$pAK HD$pH HD$pH HD$pH HD$p+HD$pHD$  D$ D$ HD$p9D$ s>D$ HcHL$pHHD$pHcL$ HD$pH릃=J} JHL$pJ =J} ~JHL$psJHH 3$3HhHL$H8HD$@HHD$ HD$ HHD$ H|$ t#H|$ tHD$ @ t HL$ H8HT$HL$VWHh3uH$H9CJuH:JHH,J3uTHJHD$ HL$ H$H9tHD$ HHD$ HD$ HHL$ HH3tH$H$HH$H$HHH$H$H3uH$H@`Hx`tH$H@`H$P`H|$(H$H8H$Ht$(Hǀ8H$H@t'H$H€H$HH$OH$Ht>H$DHH$D@HH H$HǂH$HtH$H H$H H$H H$H H$@ t H$4Hh_^HL$HHHGHD$8 HD$0HD$8H|$8tnHD$8HHD$03tVHL$PHD$8@T9At3HD$P@D$ HD$8DHTHD$8D@H(H 1HT$PHL$8 HHHT$HL$H8HD$@H t&HD$@DHH ^HD$@@D$ |$ ~ |$ | HD$@@D1HD$@H,1HHL$@HIHHD$@HHH F!F D$ D$ |$ L$ \HD$(H|$(u6FH F!DD$ HH HyHD$(Ht$3HL$(Hn!L\$(IǃHL$@H HD$(HHhHL$(D$ ApHL$(HD$@@AxHL$(HD$@@ 9AttHL$(HD$@@ AtHL$(HL$(HD$@H@HHL$(^DDEH E 3H8DD$HT$HL$VWHH$Hxt&H$DH4H =>3H$@D$@|$@~ |$@|33uH$@ t.H$HHD$ D DA@V,H$HHD$ D CA2(H$@ t2H$HHHD$ D CACH$@$ uH TD6PDH=Cu9HHD$(HkHD$ L Ax3C3_HCH$xTt DŽ$ DŽ$$D$P.CD$`HcT$@E3DD$PH NC1dHD$HH|$HuDD$@HhH rH$xTuH$HD$H@TATD$d D$dD$dHcD$dHs5HcL$dH$|XuHc|$dHcT$dH$HD$HDXDXAxH$HL$H u 3u'DB9D$`tAAH$HTOHD$X=A~OHD$XHD$0H$@TD$(HD$HHHD$ HD$HDHTHD$HD@H>H H3uHD$HHtDH|$Xt DŽ$ DŽ$$D$hD$hD$hT$hHL$HH|$pH$xHt$pH|$HxH|$XtHT$XHL$H 3$ uAH AHD$HH_^HT$HL$VWHHF+H3H$HDŽ$D$4D$0DŽ$ H$0HD$`HD$`H\t&HD$`DHH HD$`@$$~ $| HD$`@t-HL$`H HTHD$ D ?A?H|$83 HD$`@%$HD$`HHD$`H$tDH$Ht$`H$8H|$pH$8HD$`@ D$4HD$`@D$0H @@H=?u9HHD$(H!HD$ L A>3[H[?>>HT$`HHD$`HuHD$XH|$Xt,Hc$LL$XAH ?_H$HD$`@HD$`@Hc$LL$XE3H >_H$H$t"H$H@`HD$X$tI$t1H|$`H$38HD$`@ HD$`HHD$`HHD$`@6LL$`IHD$`D@HH -^DŽ$HL$`HD$XAH|$`H3HL$`HAHT$XHR詨H$u D$HH |$@H$Ht$8Hh H$tH$D$@9A(tH$HǀH$HHc@4H8H$$hHH$HH$HuHH V'H$HH$H$D$@H$Hx`u8=1<~$LL$XMID$HSH 3uH$HD$XH9A`u A\H$HL$`=;~9L$MI`HD$XH@HD$ MID$HH =3u=~;~GHD$`PHD$`HH$DHH$D@T$(L$ H}H 3uH$xpuD$HNH H$H$Hh H|$8H$ H$HtFH$u8lH$H$tH$HH$8Hc$E3A@H :[H$\\3=B:~$LL$XMID$HdH 3uH$PHt$`\H$PH$\H$HD$XHB`H$H$8HH$H@`@ H$HHc$E3E3H 9ZHH$HH$HuqH$3xAxH$^$$$$$A3H$"HH$HH$Hu2H$D$HH WH$H@`Hx@tH$H@`H$P@H$$$$$t/H|$`Ht$pH$8HT$`D$4B HL$`D$0A.Hc$LL$XE3H a8X3HD$(D$@HD$(HHD$ (3H 3 |$@uD$ D$@dHD$HD@HH *D$@=HD$(H8r"HD$(H8s3HD$($D$`D$`D$`D$@H 2t 22H s2e HD$PHD$HHD$0pHT$0HL$HD$@[HT$0HL$HD$@FHT$0HL$HD$@1E3HT$0HL$HbHu D$dD$dD$dD$@H|$Pt HD$0|$@tD$@Hx45544334^3<3     HT$HL$H8D$ D$(D$$8HD$@@D$,|$,t'|$,|$,t`|$,D$ Hc/HcL$$HxH3ҹHHHcD$(HD$(Hc /HcD$(HD$(^Hc/HcL$$HxH3ҹHHHcD$(HD$(Hc /HcD$(HD$(D$ D$  8D$(HL$HD$ AD$ tHHc1/Hk\3ҹHHHcD$(HD$(Hc /H3ҹHHHcD$(HD$(D$ tHc .HkxHcD$(HD$(D$ t$Hc.Hk 3ҹHHHcD$(HD$(D$ tHc .Hk`HcD$(HD$(D$ tHc o.Hk`HcD$(HD$(D$(H8HT$HL$WHHD$`D$pH|$(3 H|$x30H$H@HD$PHD$xHD$ H$AA0HT$ H$)D$\H$HD$PHA|$\t}HD$ D$pHD$ @=uH$HcD$pH0v]L$pHD$ H|$ u ^LcL$pLcD$pHT$ H$蓁D$\H$HD$PHA|$\t:D$\HD$ @HD$ fHD$ @HH \HD$ HD$@HD$ HHD$ HH$HD$ HHD$ fH$H$@HD$ @u6H$H$H$HH$HD$XD$H D$HD$H|$H H ,,HT$(HL$ $HcD$pHvHD$PH$$}!_,H P,BD$\rHc$H$HL$ $A$9D$X|v ,H +H|$`t 3HL$`HD$`Hc$H;D$Pv3$D$XL$X襋HD$`H|$`u D$\ H|$`uEH$tH$HD$\AHT$ H$~D$\~3uH$HD$PHAHD$ @D$hDHD$ D;X}HD$ @ tHD$XPHHL$PtHD$ @ tHL$PHD$ @9ATvHL$PHD$ @9APrHL$PH`HT$XL\$PA{Pu)HD$0xPuHD$PHPHD$PHPHD$PHTHL$(HD$PHTHD$0HPHD$0HPHD$0HTHL$(HD$0HT3ID;HD$PHXHD$PHXHD$0HXHD$0HXHT$XyHHLD$HT$HL$H8HD$ HD$H@HD$HH@HD$(H|$(tJHL$( HD$ HD$ HL$PH@H+H~#HL$HHD$(H@HAHT$(HL$@-H|$(t#HD$H@LD$HHT$ HRH (H8HT$HL$HHHD$XHHD$(H|$(t HD$(x4u3veHL$(y4T$ HcL$ HD$(HcT8HD$XHcHtHHHHHD$0HD$(@,9D$ |#HL$PHD$8H|$8t HD$8@HD$0HHLD$HT$HL$SWHH$HHD$ HD$HH$Hxxu D$`D$`D$`D$@H$uHD$(H$H$HHD$ @tD$D$HL$HD$ H@@HA`HL$HD$ H@HHAhHL$HD$ @XApg9HcD$4H;tHcD$4H;uHH 3贐,HD$p@D$P|$Px|$Pytb|$Pzt,|$P|HD$pPH fD$0A AHL$(XT$(HL$(YL$4+LHD$ LcL$4LcD$4HT$ HL$p?D$0|$0t"HL$ D$03HL$ L$4KHD$ LcL$4LcD$4HT$ HL$p?D$0|$0tHL$ ,D$03HL$ HD$p@D$8HT$HHL$p苼D$@|$@t3HD$p@D$D$@|$@tHH կH|$Ht 3HL$HD$0Hh̉T$HL$VWH8HL$PD$X9r3L$XD$X D$XL$XD$X D$XL$XD$X D$XL$XD$X D$XL$XD$X D$XD$XHk:JHD$ H|$ uDD$XH!H * RHD$P8~-HD$PHcHkHt$PH|$ Hv3HL$PHIHL$PHD$ HAHL$PD$X3H8_^DD$T$HL$H(T$8HL$0tHD$0@HL$0D$@A3H(LD$HT$HL$VWHhH$@D$ H$u$D$ H$@D$ H$9D$ u)H$PH$t HcT$ HkH$HIH$HDHcT$ HkH$HIH$H H$HH$H|$ BD$ +D$8Hc|$8HkH$HRHcD$ HkH$HIH H:H+H}HcL$ HkH$H@H|$PH4H|$(Ht$PHcL$8HkH$H@H|$@H4HcL$ HkH$H@Ht$@H<HcL$8HkH$H@Ht$(H<H$x~-Hc|$ HkH$HIH$HcPHL9D$  3uD$8D$ H$x~-Hc|$ HkH$HIH$HcPHL9D$  3u3Hh_^HT$HL$VWHXHD$p@D$(|$(}LD$pHΫH ׫舊 H|$xu D$$nHD$pxLD$pHH FHD$pHcHHD$xD$$|$$|HD$p@9D$$|!HD$pDHDD$$HIH ]FHD$px~'Hc|$$HkHT$pHRHD$pHcHHD:3uȋL$$D$$DD$ D$(9D$ D$(9D$ tDD$ HcHkHT$pHRHcD$ HkHL$pHIH H:H+H} D$ D$ HcL$ HkHD$pH@H|$@H4HcL$$HkHD$pH@Ht$@H<HD$px~'Hc|$$HkHL$pHIHD$pHcPHL9D$$ 3uȋD$ D$$ HD$pHHD$pHD$(9D$$tVHcL$(HkHD$pH@H|$0H4HcL$$HkHD$pH@Ht$0H<HcT$$E3HL$pHX_^HL$WH HD$08~3HL$0HISH|$03H _LL$ DD$T$HL$H8H|$XtH|$`uH 3|$H| |$H~3D$HD$$L$HD$H D$HL$HD$H D$HL$HD$H D$HL$HD$H D$HL$HD$H D$HD$HD$ D$HD$,D$,i ;D$$} D$ D$HD$,D$HH|$@tUHD$@9D$H HL$@D$H;HL$@H0HD$@H9H(t3HL$@HI(3HL$@HD$@H|$@u#D$HHH0D$(L$(BHD$@H|$@tSHL$@H0HD$@HH(HL$@D$HHL$@D$PAHL$@HD$XHAHL$@HD$`HAHL$@HD$hHA HD$@H8HT$HL$̉T$HL$H(H|$0u_D$8@tE3HHL$0Z>HD$0Hx(t%HL$0H0HD$0H9H(t3HL$0HI(ϼ3HL$0¼H(HL$HH|$ t HD$ @$$$HLL$ LD$HT$HL$HxD$(H$D$8HcL$8H$H@(HHD$HHD$HHD$@H$HcHHD$@HHD$ H$HcHHD$ HHD$0H$HL$ $D$PD$PuHD$ HD$@D$(D$(H$HH$HHD$ H9D$@tH$HcPHL$@HD$0HHD$HH9D$ u;HD$ H9D$@t HD$@HD$X HD$XHcT$8H$HI(HD$XHыD$PtMHcL$8H$H@(H<u HD$` HD$@HD$`HcT$8H$HI(HD$`HыD$(+HD$HH9D$ H$H$D$(HxLL$ DD$HT$HL$HhH|$pu3HD$p8u D$@'L$$HL$xHD$pPHL$p#D$@D$@D$,HcL$,HD$pH@(HHD$8HD$8HD$0H|$8DHD$pHcHHD$0HHD$ $t(HD$ H9D$xu D$DD$DD$DD$H&L$D$HT$xHL$ HD$pPD$HD$HD$(|$(u$@HD$pHHD$pHHD$0H9D$ t$HD$pLc@HD$pHcPHL$0HD$ JHHD$8H9D$ u8HD$ H9D$0t HD$0HD$P HD$PHcT$,HL$pHI(HD$PHHD$ HD$ HD$0HD$8H9D$0$u3HD$pHx t#L$$HL$xHD$pP HD$X HD$xHD$XHD$XHD$ H|$ HD$pHHD$pHH|$8u0HD$pHcPHL$ HD$ HHcT$,HL$pHI(HD$ H;HD$pLc@HD$pHcPHL$ HD$8JHHD$pHcPHL$8HD$ HHD$ HhLD$HT$HL$H8D$ H|$@tH|$Hu3~D$( D$(D$(HD$@9D$(XHcL$(HD$@H@(H<uыD$(D$$LL$PLD$HHT$$HL$@D؋D$ AÉD$ D$(9D$$uD$ 됋D$ H8LL$ LD$HT$HL$H(H|$0tH|$@u3mHL$8HD$09 HD$88} HD$8HD$8HcHD$0H@(H<uHD$8HD$83LL$HLD$@HT$8HL$0H(DD$T$HL$HL$D$AHL$D$fHD$@LD$HT$HL$H(HL$0HE3HT$@$H(HL$H(HL$0HH(HL$H8HD$@HHD$ AHL$ "L\$ HD$@ICpHD$@HHL$ HH3H8HL$WH0HD$@HHD$ HL$ HI`H|$ 33H0_HL$HHD$ H@`H$H<$u3HL$ H$H@HA`HD$ HPHD$ HPHL$ H$@HIT+HD$ HTHD$ xPu"HL$ HHHD$ HxptTHD$ H@pHD$HD$HPHD$HPHL$H$@HIT+HD$HTHD$xPuH$HDD$T$HL$HHHD$PH0HD$ L$XD$XD$XHD$ x|$`u!HD$ H@HL$PHIHHH+HHD$ H@H@HD$0HD$0HD$(3HL$ JHL$(HHHD$(HHD$0HHL$P@XIT+HD$PHTHD$PxTv3ҸHL$PqTHD$PHP$HHLD$HT$HL$HXHD$hHHD$0HD$`HHD$8HD$pHc@HHD$(HD$hH@`H9D$pt7E3HT$pHL$ht HD$hH@`H9D$pt3HD$hHD$ HD$ HL$ HHH+H}HHL$ HD$8H@HHHD$8HTHD$0HXHD$8HT3ҸHL$8qTHD$8HPbHL$8H0HT$hHD$8HL$ HH@HH+H~HD$8H@HHD$@HD$ HHD$@HL$ HD$@HHD$ HL$(HHD$ HHD$ HHD$8xuWHD$8xuLHD$8HL$ HH@HH+H~HD$8H@HHD$HHD$ HHD$HHL$8HD$HHAHHD$8HL$ HH@HH+H}?HD$8xuHvH pyHL$8HLD$hHT$ H LD$hHT$ HHL$83HXHL$HhHD$pHHD$@HD$@HD$(HD$@HHD$ HD$(xu@HD$ xu5AHL$@$L\$@ICHHD$@@T3:E3HL$@HD$HHD$(xuWHD$ x~LHD$ H@HL$@HIHHH+H~HD$ H@HHD$XHD$@H@HHD$XHL$@HD$XHAHHD$ x~bHD$ H@HL$@HIHHH+HEHD$ H@H@HD$8HD$8HD$03HL$ LD$8HT$0HHL$(|H|$Ht>HD$(H@H@HD$8HD$8HD$0HL$8HD$H3HL$(L\$HIcKHHD$@@PHHD$@HHHHD$@HHHHL$0HD$0HHHD$8Hx`u$HL$@H0LD$8HT$0HHD$8H@`Hc@HHD$PHD$0HL$PHHD$0HHD$0HHD$0HL$@HIHHH+HLD$8HT$0HHL$(QLD$8HT$0HHL$ 4HD$HHhHL$H8HD$@HHD$ D$(HL$ H0DD$(u4DD$(HL$ ouHL$ HDD$(St-HL$ HHL$ wHL$ H0i 3H8HL$H8HD$@HHD$ HL$ -HL$ HHL$ H03H8HL$H8HL$@HXHHD$ AdAY3H8HL$H8HD$@HD$ HD$@@HD$ HǀHL$ HHHD$ HHL$@H3ҸqXHD$ HD$@Hx`tLD$@M@`HT$@HL$@HIp3H8̉T$HL$H8HD$@HD$ HD$@H@pHHD$(HL$ HHHD$ H9r3|$Ht HD$@HHL$(@XIT+HD$(HTHD$(xTv3ҸHL$(qTHD$(HPHD$@Hx`uHL$(H0HT$@AHD$(HL$ HH@HH+H}HL$(HHT$@HT$@HL$(3H8HT$HL$HD$ǀHL$HD$HD$H8uHL$HD$HHL$HIHD$HHL$HD$HAHL$HD$HHHL$HD$H8uoHD$HǀHL$HD$H@H9uHD$H@HD$H/HD$HHL$HHHL$HIHD$HHHT$HL$H8HD$@tHD$HHH9D$@uHL$H6HD$HHHD$ HD$ HHD$ H|$ t^HL$ HD$@H9tHL$ HD$@HHHD$HH@H9D$@uHL$HHD$ HAHD$@ǀH8HL$HD$H8u0HD$HHL$HHHD$H@HL$HHALD$HT$HL$H8HD$HH@`H9D$Pt1E3HT$PHL$HKtQHD$HH@`H9D$Pt3=HD$@HHD$(HD$HHD$ HD$ u3HT$(HL$ 13H8HL$HHHD$PHHD$0HD$0HHD$ H|$ HD$ H@`HD$8H|$8u HL$0^HD$8Hc@HHD$(HD$ HcH9D$(v-HD$ HD$ HD$ HL$0p(HD$ HcH+L$(HD$ HL$ J3HHHL$HHD$ HH$3uH$@H$@H$@3HHL$HHD$ HH$3uH$H@H$H3HHL$3u3HL$HHHD$PHHHD$0HL$PHXHHD$ AASHL$PH\HՐHD$ HD$0DHHD$0DHD$0PR3HHHL$H8HD$@HD$ HD$@@HL$@HHD$@HIXH\HD$ 3uHL$ HD$ HD$ ǀHD$@Hx`tHT$@HRpH¸HL$ Y3H8̉T$HL$H8HD$@HD$ 3u|$Ht HD$ 3HD$ u#HD$@H@pHHD$(HT$(HL$ 3H8̉L$H$$D$ D$ $$|$ v$H̉L$H(L$0H(HT$HL$HHL$(HD$ H+H~ $$$H̉T$HL$L$HHHHHD$H#̉T$HL$H8L$H(D$ HcL$ Hi HD$@HD H8̉T$L$HHD$XL$PHHD$ D$(HD$ HD$,|$,u^L$,D$(L$(HHHD$ H+Hu D$0D$0L$0D$(+D$(|$(}D$(3uD$(HHHL$HHHD$PH@pHHD$(HD$PHD$0HD$PH@XD$ HD$PHHL$0@\|$ t |$ vD$ HLH Uj3Ҹ@t$ HD$03Ҹ@HL$0D$ HD$(@D$ =vWHD$0HD$0mD$$HcL$$Hi HD$(HL HD$0HHD$(HL$ HD$(H3HH̉T$HL$HHD$ H@pHH$HD$ HD$HD$t53Ҹ@HL$DH$HA+H$HHD$ǀ3H̉T$L$L$ȃыD$#HT$HL$HHHT$PHHL$XH D$0HD$XPHD$PH D$ |$ t9T$ HL$PHD$(HT$(HRHL$XHIOt D$0D$0D$0HHDL$ DD$T$HL$LcD$ HcT$HL$D$L #HD$BT HcL$ HD$T HcT$L$HD$T #HcL$HD$T LD$T$HL$H8T$HHD$@H D$ |$ t,T$ HL$@HD$(HT$PHL$(HIYuCL$HD$ E3AT$ HL$@AAT$ HL$@H8HT$HL$H8HD$@HHD$$HD$HHD$(D$(9D$$tPD$(L$$3ȸD$ E3AT$ HL$@eAAT$ HL$@KH8LD$HT$HL$HHD$ HHT$0H+HD$ @HHHD$HD$ @HD$3ҹ H$$HL$(HD$ HD H$HL$ HD$(HD HD$HD$ H HD$ HHHL$HHD$ HHD$ HD H$H$HH $HHH$H8uHD$ HHD$ HHHL$H83uHD$@xu3bHD$@Hu"D$ |$ ~5HD$@@D$ 3ҹ HD$@PL$ HD$@@HD$@HHD$@HHD$@HD H8LD$HT$HL$HHT$(HD$0HH+HD$(@HH$ $HD$(@HD$(HHD$( $@+3ҹ HD$(PHHT$HL$H8HT$@HD$@HB D$ |$ tVHD$@x uHcL$Hi HD$HD H$H $D$A+D$)+H$H3H(LD$HT$HL$H8HD$@HHD$(HD$HH@XD$ L$ HD$(#u4D$ HD$( HD$(HcT$ HL$(HD$HHDHcL$ HD$(HDHD$HE3HT$PHL$H6t3H8HL$HHHD$PHHD$0HD$08u3zHD$0D$ HcL$ HD$0HDHD$(HL$(HD$8HD$(Hx`u3HcL$ HD$0HDD$ HD$0#HD$0HD$8HHHL$WHHD$ HH$H<$H3H$3H_HL$H8HL$@HXH}HD$ AE33>3H8HL$H(HD$0H@pHHD$HD$0H@X$HD$0@HD$0Hx`u3 $HD$#u5$HD$ HD$Hc$HL$HD$0HDHc $HD$HDHD$HD$0H9D$HL$HIhHD$0H@`HAHL$HD$0H@hHAhHD$HPHD$0HPHD$HPHD$0@PHD$HTHD$0HTHD$HTHD$0@THD$0H@`HD$0H@h3H(̉T$HL$HHD$ H@X$HD$ H@pHHD$Hc$HL$HD$ H9Du1Hc $HD$HD$HD$#HD$3HLL$ LD$T$HL$VWHXHD$pHD$ D$xD$(H$HD$0H$HD$8H$HD$@LD$pHb{H k{WH s0 Hk(HHt$ H<(cZ3HX_^HXD5H{H {WD$0 D$0D$09D$0L$0Hk(H^HHD$8HD$8HxtHD$8H@HHD$@ HzHD$@HD$8@D$(HD$8H@HD$ LL$@LD$8MT$0H zVL\$8I{t/HD$8H@HxtLD$8M@HD$8H@M@33PHD$8HxtHD$8PHXHXD$0 D$0D$0|$0HcL$0Hk(HWHHD$8HD$8HxtHD$8H@HHD$@ HyHD$@HD$8@D$(HD$8H@HD$ LL$@LD$8MT$0H yUL\$8I{t2HD$8H@Hxt"LD$8M@HD$8H@M@3PHD$8Hx tHD$8P HXDL$ DD$T$HL$WH@D$ H|$P3HT$PD$XBHL$PD$`HcL$hHD$PHHHL$PHD$pHAH|$(3HT$PHD$(HB H=t&|$Xmt|$Xlt|$Xx}HL$PѯD$ 'H=t|$Xmt|$Xx|HL$PD$ D$ H@_DL$ LD$HT$HL$H(HD$0Hx8t3uHT$03"HaxH jx;THT$03H(DL$ LD$T$HL$HhH$HD$ D$AT$xHL$0`HhLL$ LD$T$HL$HhH$HD$ H$DE3T$xHL$0D$XH$D$HD$XHhHHD$4@j0HD$ E3LGH kwLGL\$ L +E3H TwL(L\$ L E3H =whHD$ E3LH )wDHD$ E3LAH w HD$ E3LmH wHD$ E3LH vHD$ E3LřH vHD$ E3L H vKD$0T$0H vQD$4HHH( 33eHvH vQH(̉T$L$HLL$ DD$HT$HL$3̉T$HL$3HT$HL$3DL$ DD$T$HL$HL$3HL$HD$̉L$LD$HT$HL$VWHHD$0H@H$H$H9D$@sHD$@H$HL$0H$HAH|$0HHt$8H $3H_^LL$ LD$HT$HL$VWHHD$0H@H$HD$HH9$s7HD$@H9$vHD$@H$HL$0H$HAHt$0H|$8HvH $3H_^HL$H(HL$0} H(HT$L$HD$̉L$H(HL$0H(H8=͜uHHHD$ D$ H %H8DD$HT$HL$HH|$(tH|$ u HD$($ $HD$(HHD$(tZHD$ D$HD$ HHD$ D$uRD$*u3DD$.t L$$;u뎸$HD$ t HD$ *u3HHL$VWH8HD$PH@HD$HcHD$(HcL$(HD$PH9Hs HL$D$(AHD$PH@3WHD$HHD$$ $$29$Hc$Hk H*HL$Hc$Hk HHL$DAHc$Hk HHL$DAHc$Hk HۚHL$D A HD$HHD$Hc $Hk HL HD$HHD$ Hc $Hk HL Hc$Hk H5H|$HtHc $Hk HdLHc$Hk H5QH|$ HtHc $Hk H6 HD$HHD$HcL$(HD$PHH3H8_^̉T$HL$VWHHD$ HD$`HHD$0HD$0HHD$(HD$0H HD$(HHD$8D$ D$ D$ 9D$ 1HcD$ Hk HHTHL$8H+: u Hu3tLD$8HpH pKHcT$ Hk H/HL$0D 9A t;HcL$ Hk HDL HD$0D@ HpH p6KHcL$ Hk H֘Du/HcD$ Hk LMDH>pH pJNHcL$ Hk HL HcD$ Hk H=wH|Ht$(3HoH tpJ3HH_^HL$HD$HHD$HD$t$HD$.tHD$_uHD$.@VWHHD$0D$ D$ D$ 9D$ } HcL$ Hk HLD$0D$0ɋL$0HH=u HmHD$(D$ D$ D$ E9D$ }zHcL$ Hk H?LHcD$ Hk H5+H|$(HtHL$(HcT$ Hk H HD$(HDHcL$ Hk HLHD$(HHD$(o3HH_^H82MNȈD$ |$ t H nHDyoH nHH8@WH H=Jt3H ?H=*3 H _LL$ DD$T$HL$WH =d|H n9H3HH|$0HHHHHc Hk HTHcHk H HD$0HDHcHk H D$8DHcmHk H rHD$HHDHcQHk H VD$@D Hc 7Hk H<THc !Hk H&D HTHHc Hk HHc Hk H ݔՔ˔”H _HL$H8HD$@HCHD$@@B;~'E3A[HmH mY}D$ D$ HD$@HH8e%LL$ LD$HT$HL$HXH|$xtHD$xH$H $HD$`H@HH$uH|$pu H|$hHD$`@(HD$`H@HD$ D$ D$D$H|$ HD$ @,D$HD$ @(D$L$D$ D$ HD$ x(u D$@KHD$ P(H HD$ @,HL$ HI HHHD$ @(H% HHD$@L$@D$D$D$D$HD$ HHD$ CHL$`D$A HL$`D$ AHL$`D$HD$`@(H|$htHD$hHD$(HL$(HD$`H|$ptHD$pHD$0HL$0HD$`@ H$tH$HD$8HL$8HD$`@HXHL$H8HD$@H@PHD$ H|$ t*HD$@H@PHL$@HHAP3u3HL$ a{3HL$@R{H8DL$ LD$T$HL$3̉L$WH0HcT$@Aipfw3zHD$ H|$ tHcL$@H|$ 3HD$ H0_HL$HT$LD$LL$ H(HT$0H lR}CH(̉L$H|$ u3.$$$D$ D$ D$ tދ$HHL$HHH=Ou9HHH9H :wH5HHD$(HHHD$(H wHD$ HH9D$(u^HD$0HD$8H ٜHD$ H+HD$8HD$8HiHD$8HD$8HH=HD$0HL$0HD$(HHD$(HD$(HxHD$ H|HD$(H HHD$(HD$(H@BHHHD$PHD$(H@BHHD$PPHHHHHH$H$H@BHD$D$HLD$T$HL$VWHD$@D$HHD$PHD$hHD$83f$D$DD$xHD$HHD$ LL$PLD$@3H$D$HHXH$H$uZH$HXHD$8L$HH$HHH$H$@HA$uHH$ HDŽ$H$H$HA@HL$8HH$HHH$$A H$H$HA(H$H$HA0H$H$HA8D$DDŽ$ D$DD$DD$@9D$DH$HtaHD$P@ tHD$PH@H$.D$(D$ E3A3HL$P'vH$H$H$HD$P@($$$H|$8HH$󤋔$$‰$HD$PHHD$hHD$hHD$PHD$8@ f$$ff$$=t3H$uGH$HD$0$uHD$0H@H$HD$0H@ H$H$HD$pH$@HD$ LL$8LD$pHT$`HL$Xt|$XtHD$`HH$H@H$H$H@H$H$H@H$@(HD$`H$H$H8uH$HH$H$HxuH$H$HAH$H$H@HH$HD$`HAH$@($u'HD$ AE3H$33D$x)HD$ AL7H$3D$xH$teH$H@H$@(H$H$HAH$H$HAHL$`ZsH$&|$xu 3H$"r3H_^HT$L$HH$HXHD$HH$H@(HD$@H$H@0HD$h$}HL$@H8sDHD$@D@H$x uLHD$@L~yHT$ H BhHHH8H=qtHqHL$ pLHqH n>H rBH8̉T$HL$H8HD$@HD$ H 2>DD$HHT$ H LBHL$ D$HA(HL$ H0LH8̉T$HL$H(E3AHH#AH AMH(DD$HT$HL$HHHD$PHD$ HD$ @xD$(HD$ 0t'E3AmH@H ALD$,D$,HD$ ƀ0HD$X@ D$0|$0t|$0_|$(u'E3A{HN@H A9LD$4D$4|$(u|$`uHT$`HL$ HL$ HHD$X@<HL$ HHD$X@@|$(u,|$`u%=orHD$XH@0HD$XH@0HD$ H@T$`HL$ HI|$(u'E3AHr?H @]KD$8D$8HL$ HHD$X@<HL$ HHD$X@@HD$ H@T$`HL$ HIE3AH>H ?JHHDL$ LD$T$HL$H8HD$@HD$ HD$ Hxt^HD$ HuPHD$ LuB|$H @t |$H @uHL$ D$H|DL$XLD$PT$HHL$ HII/HD$ Hxt#|$H @t |$H @uHL$ D$HH8HL$H8HD$@HD$ HD$ Hxt+HD$ HuHD$ LuHL$ HIIH8DD$HT$HL$HHHD$PHD$(HL$X(IHD$ HD$(H@H9D$ t$HD$(H@DD$`HT$XHL$(HI}HD$XH`HD$8HD$8HHD$0H|$0uLD$(HT$8HRHL$XHT$XHL$0wHHL$XGHD$(H@DD$`HT$0HL$(HIHL$(H8(IDHD$(D@HD$(HD$(HL$(H8HD$(@HHHDL$ DD$HT$HL$H8HD$@HD$ HD$ Hxt'HD$ H@DL$XDD$PHT$HHL$ HIH8DL$ LD$HT$HL$HxH$HD$@HD$XD$LD$HHD$@HxtHD$@H~ D$LH$HL$@HI+GHD$XH|$XLD$@M@ HT$PHL$LF|$LHL$PHD$XH@HAHL$PHD$XH@HAHD$XD@*HD$PP*HL$PHD$XJD`HD`HD$PP*HL$P$DHL$PHD$X@$A$HD$PH*HD$PD HD$@HxtIL$3HL$PD$`|$`t3HD$@H@AHT$PHL$@HIHL$PHL$ HIHD$ H@HE3AH7H m9CL$(HD$ ƄH8HT$HL$HhHD$pHD$ HD$ HxtHD$ H~3HT$8HL$xBE3Et^HD$xH*HD$xD D$(HD$ H@AHT$xHL$ HI|$(t D$LD$LD$LvLD$ M@ HT$0HL$(A|$(PHD$0H0HD$@HL$@HD$xHHL$0HD$xH@HAHL$0HD$xH@HAHD$xD@*HD$0P*HL$0HD$xJD`HD`HL$0HD$x@$A$HD$xH*HD$xD D$(HD$0P*HL$0D$(D HD$xD@*HD$0P*HL$0HD$xBDDHD$ HxtCLD$p3HL$0D$H|$Ht3^HD$ H@AHT$0HL$ HI|$(u HL$0@|$(t D$PD$PD$P3HhHT$HL$H8HD$@HD$ D$(H 2 L\$HEHT$ H 6 HD$HD$,|$,t |$,t*HT$HHL$ D$(AHT$HHL$ LD$(,H|$ t$HD$ HxtHT$HHL$ HI@D$(D$(H8HT$HL$H8D$$D$ H|$@uH d}?2HD$@HxtHT$HHL$@HIC@D$ D$$3uH 1 HT$@H 6 D$ D$$D$$H8HT$HL$HHHD$XH@HD$(HD$PLD$ D$0HL$PH8C@DHD$PD@HL$PHD$(LHD$PL|$ u HD$Pƀ2HL$PH8HD$P@?L\$PI{tHT$XHL$PHI.?D$0HD$Pt >HD$P0u >HL$PH8o?DHD$PD@HD$P1tEHD$Pƀ1HL$PH8HD$P@5?HT$PHPAHL$PHL$PH8HD$P@>HL$PHI==t'E3AHa2H J4L>D$8D$8HD$P0t'E3AH"2H K4 >D$<D$<|$ ~ HD$Pƀ2HD$P1uvHD$Pƀ1HD$Pƀ0HL$PH8HD$P@>LD$PIPHT$PHRHL$4|$4tHT$PHPDD$4HL$PfHL$PH8HD$P@=HD$PHxtHT$XHL$PHI<D$0D$0HHHL$H8HL$@H8]=DHD$@D@HD$@}'E3A^H0H 3<D$ D$ HD$@HD$@HL$@H8HD$@@<H8HL$H8HL$@H8<DHD$@D@HD$@'E3AlH0H 2<D$ D$ HD$@HD$@HD$@u>HL$@H8HD$@@+<HL$@E33HL$@:" HL$@H8HD$@@;2H8@WHPD$0H +H 1H `_;\_._%_=_V=_u*E3AH1H 1:DŽ$@ DŽ$@=^t4^H ^%;Z:H ^:^^^H ^:H|$`3HHD$`HH$HHD$pHH$HT1HL$8 :Hb1HL$H9H^HT$(H^HD$ LL$`LD$HHT$8H ^c8D$0H ]*:]]]H ]:H G*T$0H 1D$0HP_HT$HL$H8D$(H )H 0HL$H舻HD$ HD$ D$,HL$HD$(A03HL$H8H )XH 0LD$(H8H8D$ H m)H 0H \9\=\'E3AH@/H i0k8D$$D$$k\b\=[\=R\t'E3AH.H 508D$(D$(\4\H %\g8H=[tH [H6D$ H[H [$8[[[H [8H A(T$ H /D$ H8HL$H(H (H /JH 3[5خH 'H /vH(ffH; 9FuHfuHH8L FLFHd$ Hѹ6%7% 6ffH+Ir"tf: u,HIuMIuMt: u HIuH3ÐIt7HH; u[HAH;D uLHAH;D u=HAH;D u.H IuIMItHH; uHIuIHHHH HHH;@SH EHLAALtA@McPLHcL#IcJHCHHKAt AHLL3IH [MH(MA8HIH(_net_inet_ip_fw.one_pass_net_inet_ip_fw.autoinc_step_net_inet_ip_fw.verbose_net_inet_ip_fw.verbose_limit_net_inet_ip_fw.default_rule_net_inet_ip_fw.tables_max_net_inet_ip_fw.default_to_accept_net_inet_ip_fw.static_countIPFW2: IPV6 - Unknown Routing Header type(%d) IPFW2: IPV6 - Invalid Fragment Header IPFW2: IPV6 - Unknown Extension Header(%d), ext_hd=%x ipfw: opcode %d unimplemented -- unknown opcode %d ipfw: ouch!, skip past end of rules, denying packet ipfw: pullup failed acceptdenyloadableipfw2 initialized, divert %s, nat %s, rule-based forwarding disabled, default to %s, logging disabled unlimited limited to %d packets/entry by default IP firewall unloaded ipfw2: ENOSPC initializing default rule (support disabled) init_tablesipfw_check_hook%s: m0 is NULL%s: unknown retvalipfw_hook() error get_map%s: cannot allocate map All logging counts resetAccounting clearedlogging count resetclearedipfw: Entry %d %s. ipfw: %s. ipfw: rule too short ipfw: size mismatch (have %d want %d) ipfw: bogus action offset (%u > %u) ipfw: opcode %d size truncated ipfw: invalid fib number %d ipfw: invalid set size %d ipfw: invalid table number %d ipfw: opcode %d, multiple actions not allowed ipfw: opcode %d, action must be last opcode ipfw: no IPv6 support in kernel ipfw: opcode %d, unknown opcode ipfw: missing action ipfw: opcode %d size %d wrong overflow dumping static rules ipfw_nat not present, please load itIP_FW_NAT_CFG: %s IP_FW_NAT_DEL: %s IP_FW_NAT_GET_CFG: %s IP_FW_NAT_GET_LOG: %s ipfw: ipfw_ctl invalid option %d callout_init%s: initializing timer at %p callout_drain%s: stopping timer at %p _net_inet_ip_fw.dyn_buckets_net_inet_ip_fw.curr_dyn_buckets_net_inet_ip_fw.dyn_count_net_inet_ip_fw.dyn_max_net_inet_ip_fw.dyn_ack_lifetime_net_inet_ip_fw.dyn_syn_lifetime_net_inet_ip_fw.dyn_fin_lifetime_net_inet_ip_fw.dyn_rst_lifetime_net_inet_ip_fw.dyn_udp_lifetime_net_inet_ip_fw.dyn_short_lifetime_net_inet_ip_fw.dyn_keepaliveipfw: OUCH! cannot remove rule, count %d ipfw: sorry cannot allocate state invalid parentipfw_install_stateipfw: %s: entry already present, done ipfw: %s: Too many dynamic rules ipfw: %s: add parent failed too many entriesdrop sessionipfw: %d %s %s:%u -> %s:%u, %s ipfw: %s: unknown dynamic rule type %u NULL IPFW tableRefuseAltq %dDenyResetRejectUnreach %dAcceptCountDivert %dTee %dSetFib %dSkipTo %dPipe %dQueue %dForward to %s:%dNetgraph %dNgtee %dNatReassUNKNOWNMACTCP %s:%d %s:%d %sUDP %sICMP:%u.%u ICMP %sP:%d %s+ (frag %d:%d@%d%s)ipfw: %d %s %s [no if info]%s ipfw: limit %d reached on entry %d rn_addmask: mask impossibly already in treeMask for route not entered Non-unique normal route, mask not entered rn_delete: inconsistent annotation rn_delete: couldn't find our annotation rn_delete: couldn't find us rn_delete: Orphaned Mask %p at %p rn_detachhead%s: head already freedrn_init: radix functions require max_keylen be set rn_initrn_init 2cksum: out of data BumpClamp%s %s to %d (was %d) q_new%-10s no memory for new queue %-10s no memory for new si si_new%-10s new_sched error copy_obj%-10s (WARN) type %d %s %d have %d need %d copy_obj_q%-10s ERROR type %d %s %d have %d need %d queuecopy_profile%-10s error have %d need %d flowsetinstcopy_fsk_list%-10s sched %d has %d flowsets linkschedconfig_red%-10s called dummynet: net.inet.ip.dummynet.red_lookup_depthmust be > 0 dummynet: sorry, cannot allocate red lookup table %-10s exit fsk_attach%-10s XXX TODO requeue from fs %d to sch %d update_fs%-10s fs %d for sch %d not %d still unlinked config_link%-10s invalid pipe len %d %-10s sched %d not found config_fs%-10s invalid flowset len %d flowset buckets%-10s missing sched for flowset %d %-10s fs %d changed sched %d@%p to %d@%p config_sched%-10s bad sched len %d sched buckets%-10s invalid scheduler type %d %s %-10s cannot allocate scheduler %d %-10s cannot allocate profile %-10s sched %d new type %s %-10s sched %d type changed from %s to %s %-10s type/sub %d/%d -> %d/%d %-10s XXX WARNING link 0 for sched %d %-10s sched %d unchanged type %s %-10s error creating internal fs for %d config_profile%-10s short profile len %d %-10s no memory for profile %d dummynet_flush%-10s still %d unlinked fs do_config%-10s invalid api version got %d need %d %-10s bad len o->len %d len %d %-10s cmd %d not implemented %-10s invalid delete type %d dummynet_get%-10s compatibility mode ip_dn_ctl%-10s dummynet: unknown option %d %-10s dummynet: compat option %d %-10s argument len %d invalid DUMMYNET %p with IPv6 initialized (100409) DUMMYNET already loaded load_dn_sched%-10s missing enqueue or dequeue for %s %-10s %s already loaded not %-10s dn_sched %s %sloaded unload_dn_sched%-10s ref_count = %d %-10s dn_sched %s %sunloaded _net_inet_ip_dummynet.hash_size_net_inet_ip_dummynet.pipe_slot_limit_net_inet_ip_dummynet.pipe_byte_limit_net_inet_ip_dummynet.io_fast_net_inet_ip_dummynet.debug_net_inet_ip_dummynet.red_lookup_depth_net_inet_ip_dummynet.red_avg_pkt_size_net_inet_ip_dummynet.red_max_pkt_size_net_inet_ip_dummynet.tick_delta_net_inet_ip_dummynet.tick_delta_sum_net_inet_ip_dummynet.tick_adjustment_net_inet_ip_dummynet.tick_diff_net_inet_ip_dummynet.tick_lost_net_inet_ip_dummynet.expire_net_inet_ip_dummynet.expire_cycle_net_inet_ip_dummynet.expire_object_net_inet_ip_dummynet.object_idle_tick_net_inet_ip_dummynet.drain_ratio_net_inet_ip_dummynet.schk_count_net_inet_ip_dummynet.si_count_net_inet_ip_dummynet.fsk_count_net_inet_ip_dummynet.queue_count_net_inet_ip_dummynet.io_pkt_net_inet_ip_dummynet.io_pkt_fast_net_inet_ip_dummynet.io_pkt_droppacket on dummynet queue w/o dummynet tag!dn_enqueue%s fs %p si %p, dropping bw=0 and credit<0 ?dummynet: if_bridge not loaded dummynet/ether: pullup failed, dropping packet dummynet: bad switch %d! dummynet: fast io: pkt chain detected! dn_compat_copy_pipe%-10s have %d < need %d dn_compat_copy_queue%-10s have < need ip_dummynet_compat%-10s setting compatibility with FreeBSD 7.2 %-10s setting compatibility with FreeBSD 8 dummynet: -- unknown option %d%-10s size=%d, buf=%p %s ERROR sooptcopyout heap_resize--- %s, resize %d failed heap_extract--- %s: empty heap 0x%p %s: extract from middle not set on %p %s: father %d out of bound 0..%d --- missing hash or match functionwf2qp_enqueue%-10s ++ ouch! not eligible but empty scheduler! WF2Q+ weightRR weightRR quantumqfq_new_queue%-10s rounding weight to 1 qfq_dequeue%-10s BUG/* non-workconserving leaf */ qfq_enqueue%-10s len %d flow %p inv_w 0x%x grp %d qfq weightqfq maxlenPRIO prioritymy_mod_register%s %s called init_children%s mod_idx value %d SYSINIT+++ start module %d %s %s at %p order 0x%x +++ end module %d %s %s at %p order 0x%x ip_output%-10s unimplemented. ipfwsy_ipfwsy_Vnet_ipfwdummynetdn_fifodn_wf2qpdn_rrdn_qfqdn_prio*** ExSetTimerResolution: resolution set to %d n-sec *** ipfw_module_exit%s unloaded kesysctl_emu_set%s: match found! %s %s: len mismatch, user %d vs kernel %d %s: the entry %s is read only %s: match not found conversion of names failed for some reason *** Global Sysctl Table entries = %i, total size = %i *** WARNING: global sysctl table full, this entry will not be added,please recompile the module increasing the table size c:\winddk\7600.16385.1\inc\ddk\wdm.hIrp->CurrentLocation <= Irp->StackCount + 1Passthru: ==> Miniport Initialize: Adapt %p c:\cygwin\home\luigi\ipfw3-2012\kipfw-mod\miniport.cpAdapt->MiniportInitPending == TRUE<== Miniport Initialize: Adapt %p, Status %x pStack==>MPProcessSetPowerOid: Adapt %p InformationBuffer != NULL!(pAdapt->MPDeviceState > NdisDeviceStateD0) && (NewDeviceState != NdisDeviceStateD0)<==MPProcessSetPowerOid: Adapt %p ==>MiniportHalt: Adapt %p Status == NDIS_STATUS_SUCCESS<== MiniportHalt: pAdapt %p UpperBindingsNdisVersion==> Protocol BindAdapter BindAdapter: Adapt %p, IMInitializeDeviceInstance error %x <== Protocol BindAdapter: pAdapt %p, Status %x ==> PtOpenAdapterComplete: Adapt %p, Status %x ==> PtUnbindAdapter: Adapt %p c:\cygwin\home\luigi\ipfw3-2012\kipfw-mod\protocol.cpAdapt->MiniportHandle == NULLpAdapt->MiniportInitPending == FALSE0<== PtUnbindAdapter: Adapt %p PtUnloadProtocol: done! CloseAdapterComplete: Adapt %p, Status %x pAdapt->OutstandingRequests == TRUEOid != OID_PNP_QUERY_POWEROid != OID_PNP_SET_POWERFALSEPtPnPHandler: Adapt %p, Event %d <==PtPNPNetEventReconfigure: pAdapt %p NdisPacketPoolUsage(pAdapt->SendPacketPoolHandle) == 0pAdapt->OutstandingRequests == FALSEpAdapt->RefCount >= 0pAdapt->RefCount > 0==>PtRegisterDevice c:\cygwin\home\luigi\ipfw3-2012\kipfw-mod\passthru.cControlDeviceState != PS_DEVICE_STATE_CREATING\Device\Ipfw\DosDevices\Ipfw<==PtRegisterDevice: %x ==>Pt Dispatch <== Pt Dispatch ==>PassthruDeregisterDevice MiniportCount > 0ControlDeviceState == PS_DEVICE_STATE_READY<== PassthruDeregisterDevice: %x PtUnload: entered PtUnload: done! ʇlL4̋\D,ڊȊzx2Lbx҈(Nl։,LbrRF. ԆvjVL8'PcB2ipfwdummynetdn_fifoFIFOdn_wf2qpWF2Q+dn_rrRRdn_qfqQFQdn_prioPRIORSDSU IMK@fc:\cygwin\home\luigi\ipfw3-2012\kipfw-mod\objchk_win7_amd64\amd64\ipfw.pdb  bbbb  Rp2p2p p `  bp`""p`"p`rpp`  p  "  2pb p ` p `bp`"  b p `p`p`  "  BR p"'| H'| ` p `"  p`  "BRpB"bp`Bp`Bbp`p` p `B p `  Bp`,A| B p `    bp`p`% p `| p`    *pp0Br p%- p `| PR p!p`p/!p`| p`  Rp p `  p`/)p`| 0p` pr pp`bp`  bA p `  %C p `| b        20B2-+] fincomingoutgoing@B0JpQB0 XQB0J RB(0ПRB0JRB0PRB0JSBXphSB0J0TB@ T`xBFTlB`^UY`Z0Z`\pGD8C@LDlDlD D`C D0lYFY&ZLG0ZQZG`ZL\tG`\O^tG`^^dD_{_D__PC`dFdfFf.g`G@ggGgrhDhTiXC`ii$EjlDmlD>?lD??LG@@D@AlDAALGA|CtGC^ELGpEFEFFDF1HtG@HJG0JJXCJJPEJKNG`NN@C O_O@CpOR DRU FUU$EUVlDVcZ@FpZZLGZ[LG [\LG\^^ Dp^`F`aEa!fFffXCfogDghD hbiGpikDEkl@Dlm DmoGoppDpqDqt8Et vEvw,EwyE yylDyN|G`|k}C}}D}J@GPDCׄPC{TDCЅ8GCB$EPE@qLFdE@C ^FpgCpq8FFGe@Cp@C@C@CED$EtG՛CCP՜tG~@CE<DPiEpDE ȟEПtGtLD9lDeXCpDCC@CC D$EGEF@C0dEl$E&tG0lC@C dE LD_CpCCCEEEPETG`GCgCpdEͻE LG0CƾCоCEbLGpxCpCr@C(F@C bhCpED=tGPDGq0F@CLF^ FpCeEpEE(FT@G`PC D`C8HC@lDxxE"tG0aDdElDXC FLGiEpTD FPC@C< FPHC8G@C0G DDlDD@CPB@CP;FPD= LGP  dE  LG@  G s G|  G hGpGHT$HL$VWHDŽ$H ֏E3L$(H$ H ֿH$3Ƅ$Ƅ$HNVH$0H]H$@H`aH$`HDŽ$PHgH$hHgH$ HWiH$HiH$HiH$HDŽ$H.fH$pHWH$XHDŽ$xL tAH$H $$toH܈H ]ǾH|$ 3D$ D$!HH$H|$xH$HnHD$(H;rHD$0HvHD$8HcwHD$@HwrHD$HHrHD$PHwHD$XHzHD$`HtHD$hHkuHD$pHhH$HnH$HaqH$H{H$H}H$ALD$ HH$$tH |HH 3~$t3H 4$H_^HH2-+HtH;u/H H HH3HH#HDHHHH(LLIIH(IpfẅA@@ʇlL4̋\D,ڊȊzx2Lbx҈(Nl։,LbrRF. ԆvjVL8ExFreePoolWithTagstrncmpHKeReleaseSpinLock?DbgPrintKeAcquireSpinLockRaiseToDpcpKeSetTargetProcessorDpcKeInitializeDpcKeInitializeTimersKeSetTimerKeCancelTimer_snprintfstrncpyExSetTimerResolutionRtlRandomExsExAllocatePoolWithTagIoFreeMdlMmMapLockedPagesSpecifyCacheIofCompleteRequest4RtlAssertRtlInitUnicodeStringKeBugCheckExntoskrnl.exePKeQueryPerformanceCounterHAL.dllNdisFreePacketNdisUnchainBufferAtFront NdisAllocateBufferNdisIMGetDeviceContextNdisAllocatePacketNdisFreePacketPool3NdisMIndicateStatusComplete2NdisMIndicateStatusNdisReturnPacketsNdisResetEventNdisSetEventNdisIMCopySendPerPacketInfoNdisWaitEventYNdisMSetAttributesExNdisIMCopySendCompletePerPacketInfoNdisIMGetCurrentPacketStack-NdisCancelSendPackets=NdisCloseAdapterNdisRequestNdisGetPoolFromPacketNdisGetReceivedPacketNdisIMInitializeDeviceInstanceEx`NdisMSleepNdisIMDeInitializeDeviceInstance|NdisOpenProtocolConfigurationNdisInitializeEventNdisIMNotifyPnPEvent?NdisCloseConfigurationNdisReEnumerateProtocolBindingsNdisFreeMemoryuNdisOpenAdapterxNdisDprFreePacketNdisIMCancelInitializeDeviceInstance~NdisPacketPoolUsagevNdisDprAllocatePacketNdisReadConfiguration NdisAllocatePacketPoolExNdisAllocateMemoryWithTagpNdisDeregisterProtocolPNdisMRegisterUnloadHandlerHNdisMRegisterDeviceNdisIMDeregisterLayeredMiniportNdisInitializeWrapperNdisRegisterProtocolNdisMDeregisterDeviceNdisIMRegisterLayeredMiniportNdisTerminateWrapperNdisIMAssociateMiniportNDIS.SYSPX`hxС(PXpȢآ (0@H`hpxУأ (8`h 08@HPipfw3-2012/binary64/ipfw.exe000755 000423 000000 00000441352 12011754122 016043 0ustar00luigiwheel000000 000000 MZ@ !L!This program cannot be run in DOS mode. $PEL'P' *@PL `D a|.texth`P`.dataJL@`/4H@"@0.bssP P`.idataD ` $@0/14p.@@B/29d0@B/454@B/61tOP:@B/73  @B/871 @B/99@0B/1128 @B/123R0@B/134h@@BU$@KD$D$$_D$D$$SD$D$$GD$D$$;ÐU$@fƒҸtD$@$PtD$PA$@AС:At:$@ƒҸtD$@$t $:AÍvU$@ƒҸtD$'@$t $@AÐU HHUfP]U]uÉ։T$$*u#$&¸tB ]u]UWVS<RfU؁@uu}u$C@D$$J@Ctts@@Uԉʅt$!NjD$EԉD$$O@~EA@CM؅t% E؋D$UԉT$$T@NEA@Fu<[^_]USӅtD$$Z@u$]@\$$f@[]U]uÉփ=0]At̀Āunu8t0t$i@t$n@ $s@~ut $w@eut $@L 3]u]UP?]UH]u}Ɖ׉MD$ ED$$ËE8u<$t"XÉ$ YEԈ]u}]UWVSC/<uYC$s*$t$D$$!@ C [($^\$D$$(@<us{*D$ .ut$C@D$$#|$D$$!@{(D$ .t$0\$$|$D$$(@h $3@$ L[^_]UE D$E$uD$H@$GUE D$E$uD$O@$GdU8]u}]} u=,]A=@u!D$D$$Ҽ@@yD$W@$Ert'|t"nthtgtvtuwu't$|$ 1)Ӊ\$D$$覻#t$|$ \$D$$ߺ]u}]UWVSu} ѸʃtOtIu߹у9u9ҋu ߉8uUBEMuĸ[^_]UWVS,EUU/aA؋uDt7L$ED$4$/<\uF~ƃtD u<\tD$+E@$Ǻ9utE\t 9u}u&|$$@É<$ҽthE0f}trU$ս$tD$<$E<$能}tE0UZ؃,[^_]Ã$蒽UWVS$ۺt؆ĉT$$ tD$$Z@Gۉ\$$@2[]UWVSÉׅt*L$$@@D‰D$$@s?~S@D$$Z@˹Cf9t$-S~ A@뵃[^_]U(]u}uэY\$E D$4$¸u9} у9tE D$t$$@豹]u}]U(]u}É։D$@$RtȉtE ؋]u}]U(]u}]U u׸уL$T$$u.t$$tt$\$$@ոЋ]u}]UWVS]} ~<u*0PI 4)։)s9E ЍP9U ~tJI4 < )Is/?BI 4)Ƹ)sE} 9ƋE [^_]UWVS\EĉUԀ`D$@$TD$@Eԉ$u UĀJ1@u8t}E]ԃD$,$_pM8{(D$ F$}~D$`@$AĴPvD$D$@$A褴}ă )UfBĉJAEB}~%]ԉKQ9]ԍSU6uЍL1MCaADuD$ML$4$̳UU9u::}tD$@$Aѳ\$D$@$A谳;E|;E~&M̉L$uЉt$ D$D$@$A耳+EЃuB9~"EЉD$ ]Љ\$D$@$ANUԀ:-uD$@$A2CIك 49}߉ЋM-t}ËuԃUB aADE]EԋFu5uĀ~}}D$@$Au}u}u EĀHjE}tEȃ?~D$@$A4EȃUB*ME2Eu $L@ C@tu $R@E%@@@D‰D$$*MEEu $U@覥C@tu $R@营E%@@@D‰D$$ƇMvE$M_ESEtEE4C@tu $R@{y $;@Et UC@tu $R@¤{y $;@谤SU$EEtuEEt $Y@o}tMD$$@TCD$$`@>MESu"A$AxD$]@$u f"TAiE wD$袋D$VA$蘋t@f"TA.D$]A$A D$D$>A$AE;uD$xA$@Ȋ TA6!TAf$TA,TAf&TA;D$:<$uD$,<$tBpU$E;uut$D$A$A;f&TAD$]@$ku (TA (TAE TA0EE TARuD$A$@軉D$ D$$;f"TAD$D$ EԉD$E؉D$$AhuD$A$AZ"TA;E|D$A$A:EN TA9E>$U TAcED$D$A$A TAft3E PAEEtf}tD$ A$AquFE*tiD$3A$uUSUCuD$=A$@)$ɈyD$YA$A F]MMED$D$ ED$t$$tAD$tAD$A$蟇}tD$A$@腇u(D$$ @4D$D$A$@WD$]@$D$ UԉT$$Ƌ aADtEԀ8uu;8u1ED$$ @T$ D$D$A$AĆ过8"t ~~AED$$ @`T$D$D$ D$D$ A$Amu1ED$$ @T$ D$D$0 A$A4}Eω4$PEuEE UUEE3u6E PAEEt$$ @E }H Džlt/<(t<{u$F~uDžl DžlMMEtHD$O A$u+UByD$S A$@)ȀMAEuD$m A$@D$~ AU$5 Au8 Au8t Au8u $NEؼb Au8t Au8u $KE膼)MߋUE趾UߋEtMA?t8肾UUE&M9MD$D$ A$AtFD$ A$u2}t luD$ A$A脃EH@lt`tF A8t A8uDžlED$ A$@ tD$ A$>tD$ A$@ނSUCt`(t{uSltD$ A$@观PxuEDžlEMDžlE]tID$O A$u,UByD$S A$@5ȀMAEEuD$ A$@ U߈s$ED$/$ts)t7 A޹8tMĉL$ED$$贂u\$U$:jXst7@8tMĉL$ED$$]tڋEC@޹8U$}t!]MA?t/{UUEMD$D$ A$@ÀtID$ A$u5}t luD$ A$A膀EH@]lt\tB A8tD$ A$̀uDžlED$ A$@D$O A$=u+UByD$S A$@ȀMAt[D$@$tM$ EhtE@?tEtD$A$tD$3 A$@QSUCt`(t{uSltD$ A$@PxuEDžlEMDžlE]tID$O A$u,UByD$S A$@~ȀMAEEuD$B A$@~~U߈s$T~ED$/$ats)t7 A޹8tML$ED$$'u\$U$fst7@8tML$ED$$~tڋE@޹8}U$}}t!]MA?t/UUEMD$D$V A$@6}tID$ A$hu5}t luD$ A$A|EH@]ltUt; A8tD$ A$@}uDžlD$ A$@|D$O A$u+UByD$S A$@L|ȀMAtUD$@$rtM$ EtE@?t茶E;tU9Uu7XAMMEe>!u'ExyD$S A$@{UB}t$$`@qEKMx$A]{yD$S A$@^{E@]lt}uD$q A$@,{UJ@]lfD$ A$@zlTD$ A$@z$E"]3MA$E] $@Eٲ]$@E踲]$@E藲]$Ev]$EU]fEuD$ A$@yUUBJ @8u MAz aADu:D$,\$E$pD$ A$z]C.ED$$yu\$D$ A$A'y]E@?E+u Uz,u Mj-aEVUuD$ A$@xEGUtw<,uUD$MԉL$Eԉ$yU,ttD$ A$A`x<vD$+ A$AHxډ WUu"O]MuD$ A$@xD$]$\]eEuD$B A$@wD$U A$_xt7$ڋEvuMUD$D$X A$AwD$D$$x$E贯]MuD$i A$@,wD$U A$wt7$ڋEӽuM]D$D$z A$AvD$D$$aw$E]EuD$ A$@vD$U A$wt7$ڋE0uMUD$D$ A$A>vD$D$$v$En]|MuD$ A$@uD$D$$fv$E]$]uD$ A$@uD$D$$v%$E蹭]UuD$ A$@1u$@E]MuD$ A$@t$ @E]M];uD$" A$@tED$UԉT$M$.uUԀ:u $Nu ]$uuUD$D$8 A$AVt@GMI]];uD$M A$@"tED$UԉT$M$tUԀ:u $t ]$ uuUD$D$c A$As@GMI]!];uD$x A$@sE>D$UԉT$M$BsxUԀ:tD$ A$AJsG]K] $E|] $E[]l EuD$ A$@rD$U A$fst7$AڋE}uMUD$D$ A$ArD$D$$ s$AE軪] MuD$ A$@3r$`@#E!] ];uD$ A$@qE@}< UD$D$M$\rĉG]( ]uD$ A$@qD$D$$r$E] E8uD$3 A$@9qUM$@E] ltD$T A$@p}tD$ A$@p$'E]]]) ltD$ A$@p}tD$ A$@ypuFE(f@@Ut+׉\$$@$~ Fu}~uD$ A$@pu,D$$$`@ǴD$D$A$@oD$]@$"u fFD$ MԉL$]$oËU aADtEԀ8uuAp8fu5D$$$`@/]T$ D$D$A$AIoDp8"t ~~ED$$$`@MT$D$D$ D$D$ A$Anu5D$$$`@藳]T$ D$D$0 A$Anf^]EE UuD$m A$@nD$~ A$跴 A8twD$ A$nu $NE}CD$ A$nu $KEI)M߉ڋEzUߋEt ]7MD$D$ A$Am]uD$ A$@mE艻]D]EuD$ A$@NmE蜻]D]UuD$A$@mD$M $U]D]q]uD$&A$@lD$E$U]D]4UuD$>A$@lD$@$ֲtM$ ]ECt ]UD$D$RA$AFlMuD$iA$@)lD$@$atM$ ]Eβt ]gUD$D$A$AkM9tyuD$A$Ak] CCكڃ]誦MU C薦]}D]EuD$A$@Dk@8tEU uMD$D$A$Aj]f$$E4]E$%E]$$=E]$:EѢ]$KE谢]$NE菢]]D$E$O]})tD$A$@iUD$<$Q]KMAEAE8ھэ41zuT~D$A$AoiUUFI EMAUt?։D$M $i>ыUD EދuƋMA]]gEtOD$U A$uitg$QڋE茯UD$D$$A$AhD$$`@GD$D$A$@jhD$]@$袮D$ MԉL$]$ hËU aADtEԀ8uu?i8u5D$$`@賬]T$ D$D$A$Agh8"t ې~~ED$$`@gMT$D$D$ D$D$ A$Aqgu5D$$`@]T$ D$D$0 A$A4gۉ$QE|]UuD$AA$@fD$D$$tg$SE$]2$TE]M9t ˃yuD$\A$@qfED$LA$zt*D$QA$dtD$WA$@^D$mA$:tD$qA$$8DDuD$xA$@]sD$/C$ ^t-X$*^E< v\$D$M@$Ac]E U܋ϕtD$D$"@$D7];#5u,\$dT$ LD$D$H A$AKD$u Ah$L`~(dD$ LT$D$ A$AHK4$K(dD$ LT$D$ A$AK4$K`=D$dD$ LT$D$ A$AJD$&!Ah$Lu1$,x uȋuD$$P+AZ0;]uދuD$<U̍D:$=oEEEMԃMĉuuD$$P+A/u E9uDE9uX+uȉt$|$EEȉ$N/E̋U<E̍KMȃ9]u<э\ ;UuD$Eȍ<$knEEEUȃUuԉMЉMċ}ԋ׹р| ,uU9UuPM̋}49]|2UԋD$4$0Mԋ<эt9]}E]ăEU9UuuԋMu=$]Au$/$]A}}wW+A8}t$`+A-}EpD$=4$.ÅuGD$+A4$.DD$D$ D$D$4$J%{@{u$+A^-\D$D$$,ED$ED$ D$D$$$ bAbAEbANN(&$4A0]A ]A" ]A]A]A$]AU$P,#-@ D$ D$D$$+A,$,]A,]A]A} ]AqD$l3A$@+$`,8]AL(]A@]A4]A(4]AM $+ED$3Aut$}̉<$,bAuD$3A$@+M)щM̃~aAD tSC]A]A<]A3uЉуMȃNMȸ3A9ɉ8u]Ai}NEȉD$D$3AEЉ$*u]AD$3AUЉ$pu]AD$3A$gpu]AiD$3A$Bpu]AD3ЃO‰D$D$3A4$9*}~~sCaAD tfUT$@T$ L$D$D$$ <]A}tD$D$3A$A4)m<]A]Au =]AtmuD$4A$@(u =]At }~aAD tSC=<]AD$&4A$nu$1Y=]At/D$*4A$nu\$ủ4$1!=]At/D$/4A$nu\$}̉<$=]At/D$/4A$Lnu\$Ẻ$D$3A$nu$-D$64A$mu\$Ủ$<]D$<4A$muD$$蹎0D$C4A$muD$$臎 <]A<D$K4A$`mu $"D$R4A$=mu$]A$D$X4A$muD$\$M̉ $D$]4A$luD$\$ủ4$D$f4A$ltD$l4A$lu}ԉ|$\$Ẻ$BID$*4A$mluD$\$Ủ$D$D$q4A$@%M $% \[^_]D$Ẽ $y7D$ D$GD$$D$$7AT$$7A~ $,~ ,[^_]UWVS]޹ 9rU u <,uU D$t$E $U ,ttD$7A$Ac,CtD$$8A ,CtD$$8A[]UWVS,uE EF}D$8A<$E D$U T$$qU  ,ttT$D$8A$A=vT$D$8A$A D}uftHCFf^,[^_]ËE D$D$8A$ANUS]U ZC?t?uC DB؃[]US]U C?t?uF DE؃[]ÐUWVS\EEȋUUMىMEEu}u }ۉ]؃} uu]E EE9}߉}܋E؉E}uUM F}!Uȉ]Ћ  ]  U)…]E9Es!}<;މ|$\$E$Us]܋UU܋E)9EY9]s]뾋MMЋE EÃ} `E EƉσ} (E EEEM}|$EЉD$U$Uy:MԉL$|$E$UxZUԉT$MЉL$}<$U}I}8EԉD$|$U$U MԉL$}Љ|$E$U}I}ԋUډUԋMىMىMĉ\$L$E$Uy:UԉT$\$M $UxZ]ԉ\$EĉD$U$U]I]8MԉL$\$E$U UԉT$MĉL$]$U]I]ԋEE+UUԉD$T$M $Uy4t$ED$U$UxPt$MԉL$E$UIu$9Ay$D$ 9AD$9AD$?$9AE t$EEEl9AE t+E9A"EEE9AE tEz9A~0} tUy$kȜ)EʉU̺E kddEʉU̺EE9AE u E9A}эL Mȃ9E L0u] +]d~ k uӃ΃MЉ]9]|b]9]9MrUEȋỦuu؋}܉t$|$ $T$ ;U |;Est~ʉEȉŰu EȉŰutCrEȋỦuЋu؋}܉t$|$ $T$9]~ ~߉EȉUEȉU̸}x} }v~E tyE9E Eȃ ƋED$ UZD$]\$T$D$9AEĉD$ D$9AE D$U$ ML$UZD$ML$EȋŨ2D$dD$ $T$׋Uĉ΋MωečD$ T$D$9AM L$]$i ؋]u}]ÐffffU D$:AD$ :A@ $ U D$:AD$ :A@ $ UWVS]u }څt7t0tuu u[^_]ÅuU8]u}}u Ek D$|$E$f ÉE 8u ;Et8t:A! U؉]u}]UX]u}p}}}ыUD E$ øIuf3CC S{}̋}ы}DC}щJB}z |$ẺD$U$G}щL$EED$U$t$\$$mFE$ øpEfCC }|$\$$F;CEԉE$Uԉ$EԸ}EUfBB |$T$$=F¸]ԃ{}Ћ{ EEȃ}tq} tkUUąt_D$E$n;}vD$:A$$:AmU:|$} |$EЉ$H}tH}׍GD$UT$Eȉ$UD:t<.}ȉ|$D$@:A4$XCtt@uVvUЋD$D$E:A4$%O}ЋD$D$J:A4$ 4UЋD$D$N:A4$}ЋD$D$S:A4$Cu"t$ D$ D$$W:Ayt$$ ;GEԉ$]u}]UH]u}}w(4$cøttEC{C(C|$UT$$8D$ED$D$D$t$ \$D$$CE$ Ɖ$]u}]UWVS(<$øECSC(CT$UT$$D$ED$|$\$|$ \$D$!$CE$3 NjCSD$T$E$;$e[^_]U(D$D$D$D$ D$D$$e:A u" D$D$:A$p:A_UE$?URD$:AD$:A@ $_ÐQL$=r -=w) ̋@PÐffffffU8}} MuU]uEȉщu܉Uu,9vX1҉ƋMt؃ڋ]u}]Ð119wЃUu`M9Mv9s1Ҿ븍u 11ÉډڃUdރEIMԉ¸ }+EԋuM ׉Mԉuu މӉe9r}M9r19u1UED$$aAU]ÐU]ÐU]ÐU]Ð%pbA%TbA%bA%bA%\bA%bA%bA%bA%bA%aA%DbA%bA%bA%bA%`bA%tbA%xbA%aA%bA%bA%bA%hbA%cA%bA%lbA%bA%bA%cA%bA%aA%PbA%bA%bA%aA%aA%cA%HbA%aA%$bA%bA%aA%aA%bA%|bA%dbA%aA%,bA%LbA%cA%bA%bA%aA%bA%aA%0bA%(bA%bA%aA%bA%bA%XbA%bA%8bA%4bA%bA%bA% bA%aA%bA% cA%aA%bA%cA%aA%A?A?AJAKAL AMAYA@A@"AA+AB6ACBADLAERAn\AngAooAm Al Al Ar ArwApApAqAqAwAFO AA AAAA A AAAAAAAAAAAAAAAA"AA'A1A4A?ACAGAKAOASA WA~ A`A AiAAAAAAAAAAAA A A A A A.A A A A݆@ADA5IANASAYA\AbAgAcrAd}AAA7A7A7AA A dA^A{A"A AAAAQ4*AG8*AH@*AIH*AJO*AKV*AL_*AMh*AYn*AZu*A[z*A[*AN*AO*AQ*AP*AX*AV*AW&!AR*AR!AS*A*A*A *A *A *A\*A\*A]*Am*Ap*Ap+Aq +Aqu&AT&AU+A9A9A9A"9A )9A,9A09A@79A>9AG9AT9A\9Acyggcc_s-1.dll__register_frame_infocyggcj-11.dll_Jv_RegisterClasses__deregister_frame_info, setup %s %s%s%s!%s%stablearg%u ip4 ip6 ip from any to anyany&/0123456789abcdefABCDEF:Incorrect MAC addressIncorrect mask lengthIncorrect mask%*llu %llu%05d(%ds) PARENT %d LIMIT STATE %s proto %u %s %d <-> %s %d UNKNOWN <-> UNKNOWNcallocreallocsocketport list: invalid separator <%c> in <%s>too many ports/ranges invalid flag %s0x%04x%d??? DEPRECATED: '%s' matched '%s' as a sub-stringDEPRECATED: '%s' matched '%s'metable(/:,{,{hostname ``%s'' unknownbad netmask ``%s''bad width ``%s''address set cannot be in a listinvalid set with mask %d set not closed incomplete range %d-addr %d out of range [%d-%d] invalid range %d-%ddouble '-' in rangenot any never matchesaddress list too long not%s lookup %s %d%s%s table(%u,%u%s/%d%c%d-%d:%s/%d any %02x:%02x:%02x:%02x:%02x:%02x&%02x:%02x:%02x:%02x:%02x:%02x... src-ip dst-ip src-ip6 dst-ip6 out inxmitrecvvia# DISABLED %05u %10u %s %*sset %d prob %f check-stateallowcountdenyresetrejectunreach %sunreach %ureset6skipto pipe queue divert tee netgraph ngtee fwd tableargfwd %s,%dnat nat globalsetfib reassreturncall ** unrecognized action %d len %d log logamount %d log untag tag from any to any // %s from { to proto %u MAC frag fib %u sockarg diverted diverted-loopback diverted-output diverted-?<%u> layer2 %s %s ipid %u ipttl %u ipver %u ipprecedence %u iplen %uipoptionsiptos icmptypes established tcpdatalen %utcpflagstcpoptions tcpwin %d tcpack %d tcpseq %d uid %s uid %u gid %s gid %u jail %d verrevpath versrcreach antispoof ipsec keep-state limit tagged [opcode %d len %d] or } // %s/@V0@.@0.@R.@c.@A.@/@/@-/@@/@S/@/@V0@/@$0@V0@V0@V0@V0@V0@u0@V0@V0@V0@V0@V0@V0@V0@V0@V0@V0@V0@V0@f/@y/@V0@.@s0@V0@0@V0@V0@20@4@1@1@1@1@S2@S2@S2@S2@3@3@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@:@4@4@4@4@:@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@1@S2@4@4@4@4@4@2@2@2@3@3@3@z3@9@:@:@:@:@:@:@:@:@:@:@:@.5@U5@&6@5@k5@76@76@76@7@Q7@6@7@17@6@7@8@;9@8@i8@8@8@8@7@8@9@9@:@9@9@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@9@:@:@9@9@:@5@.8@:@:@:@:@:@:@:@:@:@s:@:@:@:@:@:@:@:@|5@5@disableenable enableset needs commandshowgetsockopt(IP_FW_GET)%s %dswapset swap needs 2 set numbers invalid set number %s moveruletosyntax: set move [rule] X to Y invalid source number %s invalid dest. set %s invalid set number %d invalid set command %s cannot enable and disable the same set set enable/disable: setsockopt(IP_FW_DEL)missing keyword to enable/disable firewallnet.inet.ip.fw.enablenet.inet6.ip6.fw.enableone_passnet.inet.ip.fw.one_passdebugnet.inet.ip.fw.debugverbosenet.inet.ip.fw.verbosedyn_keepalivenet.inet.ip.fw.dyn_keepaliveunrecognize enable/disable keyword: %s DUMMYNETFWTesting only, list disabled getsockopt(IP_%s_GET)## Dynamic rules (%d): invalid rule number: %srule %lu does not exist## Dynamic rules:missing rule specificationsetinvalid syntaxrule %u not availablerule %u: setsockopt(IP_FW_DEL)illegal set %sprobillegal match prob. %smissing actionmissing reject codeunknown ICMP unreachable code ``%s''missing unreach codemissing argument for %sillegal argument for %sdivertillegal divert/tee portmissing forward address[:port]illegal forwarding port ``%s''missing fib numbernet.fibsfibs not suported. fib too large. invalid action %s log cannot be specified more than oncelogamountlogamount requires argumentlogamount must be positivenet.inet.ip.fw.verbose_limitsysctlbyname("%s")tag and untag cannot be specified more than once%s: missing argument%s: invalid argument: %s%s: argument is out of range (%u..%u): %s%s: illegal argument value: %snotdouble "not" not allowed missing protocolallipipv4ip4ipv6ip6invalid protocol ``%s''orinvalid OR block)}missing ")" frommissing ``from''nested "(" not allowed missing source addressme6bad source address %smissing ``to''missing dst addressbad destination address %sinvalid "or" block +nested "(" not allowed +missing ")" recv, xmit, via require interface name or address*?[bad ip address ``%s''icmptypes requires list of typesinvalid ICMP typeICMP type out of rangeipttl requires TTL-,invalid ipttl %sipid requires idinvalid ipid %siplen requires lengthinvalid ip len %sipver requires versionipprecedence requires valuemissing argument for ipoptionsmissing argument for iptosuid requires argumentuid "%s" nonexistentgid requires argumentgid "%s" nonexistentjail requires argumentjail requires prison IDtcpdatalen requires lengthinvalid tcpdata len %smissing argument for tcpoptionstcpseq/tcpack requires argumenttcpwin requires lengthmissing argument for tcpflagskeep-state cannot be part of an or blockonly one of keep-state and limit is allowedlimit cannot be part of an or blocklimit: missing limit maskmissing source IPmissing destination IPmissing source IP6missing destination IP6missing source portinvalid source port %smissing destination portinvalid destination port %sMAC dst srcmissing mac typeinvalid mac type %sflow-id filter is active only for ipv6 protocol comment too long (max 80 chars)tagged: invalid tag list: %sfib requires fib numberformat: lookup argument tablenumformat: cannot lookup on %sunrecognised option [%d] %s IP_FW_ADDgetsockopt(%s)dK@L@L@P@L@P@P@M@M@L@L@/N@L@wK@K@K@K@QK@L@O@M@O@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@O@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@xL@K@P@-O@Js@]@]@]@^@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@"p@o@Js@Js@Js@k@ok@l@Ul@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@tj@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@Js@n@o@`@n@l@k@n@Js@Js@q@Js@xr@Wr@rt@rt@Yt@rt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@rt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@Yt@rt@RESETLOGZEROAccounting clearedLogging counts resetclearedlogging count resetsetsockopt(IP_FW_%s)%s. invalid rule number %s rule %u: setsockopt(IP_FW_%s)Entry %d %s. invalid rule number ``%s''pipesrulesAre you sure? [yn] setsockopt(IP_FW_DEL)setsockopt(IP_%s_FLUSH)Flushed all %s. ADDDELnet.inet.ip.fw.tables_maxWarn: Failed to get the max tables number via sysctl. Using the compiled in defaults. The reason wastable number or 'all' keyword requiredThe table number exceeds the maximum allowed value (%d)table needs commandlistflushtable number requiredadddeleteIP address requiredsetsockopt(IP_FW_TABLE_%s)setsockopt(IP_FW_TABLE_ADD)setsockopt(IP_FW_TABLE_FLUSH)getsockopt(IP_FW_TABLE_GETSIZE)getsockopt(IP_FW_TABLE_LIST)---table(%d)--- %s/%u %s %s/%u %u invalid table command %sacceptpasspermitpipequeueteenetgraphngteefwdforwardskiptodropunreach6unreach//natsetfibcallaltqlogtaguntagtaggeduidgidjailinlimitkeep-statebridgedlayer2outdiverteddiverted-loopbackdiverted-outputfragmentfragfibipoptsiplenipidipprecedencedscpipttlipversionipverestabestablishedsetupsockargtcpdatalentcpflgstcpoptstcpseqtcpacktcpwinicmptypeicmptypesdst-ipsrc-ipdst-portsrc-portprotoMACmacmac-typeverrevpathversrcreachantispoofipsecicmp6typeicmp6typesext6hdrflow-iddst-ipv6dst-ip6src-ipv6src-ip6lookup!|{(ssrrlsrrrrtsip optionlowdelaythroughputreliabilitymincostcongestionecntransportip tos optionmssmaxsegwindowsacktimestampcctcp optionsynfinackpshrsturgtcp flagsrc-addrdst-addrJKLM "3nethostprotocolportneedfragsrcfailnet-unknownhost-unknownisolatednet-prohibhost-prohibtosnettoshostfilter-prohibhost-precedenceprecedence-cutoffarprarpvlanlooptrailatatalkaarppppoe_discpppoe_sessipx_8022ipx_8023ipx_iiipx_snapipxnsAinvalid number: %squeue, mask: %s 0x%02x 0x%08x/0x%04x -> 0x%08x/0x%04x mask: %sproto: 0x%02x, flow_id: 0x%08x, %s/0x%04x -> %s/0x%04x invalid oid len %d unrecognized object %d size %d Children flowsets: %u answer for cmd %d, len %d sched %d type %s flags 0x%x %d buckets %d active BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte DrpBKT ___Prot___ _flow-id_ ______________Source IPv6/port_______________ _______________Dest. IPv6/port_______________ Tot_pkt/bytes Pkt/Byte Drp%3u%c%-4s %4u %15s/%-5d %9s %9u %7d %39s/%-5d %39s/%-5d %2u %4u %3u %7.3f Mbit/s%7.3f Kbit/s%7.3f bit/s %d%05d: %s %4d ms burst %s%d KB%d B%3d sl.plr %f %cRED w_q %f min_th %d max_th %d max_p %f%s %s%s %d queues (%d buckets) %s q%05d %s%s %d flows (%d buckets) sched %d weight %d lmax %d pri %d %s profile: name "%s" loss %f samples %d duplicate token, override bandwidth value!no if supportinterface name truncatedBit/sBibytesbybandwidth too largerfopen: %s error in %s at line %d: "too many arguments"error in %s at line %d: "missing arg for %s"sampleserror in %s at line %d: "duplicate ``samples'' line"error in %s at line %d: "invalid number of samples"error in %s at line %d: "too many samples, maximum is %d"bwloss-levelerror in %s at line %d: "duplicated token: %s"error in %s at line %d: "invalid %s"error in %s at line %d: "%s greater than 1.0"namedelayproberror in %s at line %d: "invalid point found"error in %s at line %d: "probability greater than 1.0"error in %s at line %d: "unrecognised command '%s'"'%s' not found, assuming 100'%s' not found, assuming no loss%s too few samples, need at least %drule %u: setsockopt(IP_DUMMYNET_DEL)need a pipe/flowset/sched numbernoerror is only for pipesplr is only for pipesplr needs argument 0..1 queue is only for pipes or flowsetsqueue needs queue size buckets is only for pipes or flowsetsbuckets needs argument tok_maskmask needs mask specifier mask: value missingport mask must be 16 bitflow_id mask must be 20 bitin6addr invalid mask lenproto mask must be 8 bitred/gred needs w_q/min_th/max_th/max_p /0 < w_q <= 10 < max_p <= 1droptail is only for flowsetsbw is only for linksbw needs bandwidth or interface delay is only for linksdelay needs argument 0..10000ms type is only for schedulerstype needs a stringtype %s too long weight is only for flowsetsweight needs argument lmax is only for flowsetslmax needs argument priority is only for flowsetspriority needs argument pipe/schedpipe/link/sched needs number profile already setprofileextra delay needs the file name burstburst needs argument burst: invalid argumentburst: out of range (0..2^48-1)unrecognised option ``%s''delay must be < 10000net.inet.ip.dummynet.pipe_byte_limitqueue size must be < %ldBnet.inet.ip.dummynet.pipe_slot_limit2 <= queue size <= %ldmin_th %d must be < than max_th %dmax_th must be > 0net.inet.ip.dummynet.red_lookup_depthnet.inet.ip.dummynet.red_lookup_depth must be greater than zeronet.inet.ip.dummynet.red_avg_pkt_sizenet.inet.ip.dummynet.red_avg_pkt_size must be greater than zeroIP_DUMMYNET_CONFIGUREsetsockopt(%s)@@Ø@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2@ @s@@@@@@ՙ@ՙ@ՙ@@@a@@@@g@@٠@;@@L@plrnoerrorbucketsdst-ipsrc-ipdst-portsrc-portprotoweightlmaxmaxlenallmasksched_maskflow_maskdroptailredgredbandwidthlinkpipequeueflowsetschedpriprioritytypeflow-iddst-ipv6dst-ip6src-ipv6src-ip6dummynet-params$tIzDA7?G, sysctlsysctl emulation usage: ipfw sysctl name[=value] ipfw sysctl -a-aipfw sysctl: missing value ipfw syntax summary (but please do read the ipfw(8) manpage): ipfw [-abcdefhnNqStTv] where is one of the following: add [num] [set N] [prob x] RULE-BODY {pipe|queue} N config PIPE-BODY [pipe|queue] {zero|delete|show} [N{,N}] nat N config {ip IPADDR|if IFNAME|log|deny_in|same_ports|unreg_only|reset| reverse|proxy_only|redirect_addr linkspec| redirect_port linkspec|redirect_proto linkspec} set [disable N... enable N...] | move [rule] X to Y | swap X Y | show set N {show|list|zero|resetlog|delete} [N{,N}] | flush table N {add ip[/bits] [value] | delete ip[/bits] | flush | list} table all {flush | list} RULE-BODY: check-state [PARAMS] | ACTION [PARAMS] ADDR [OPTION_LIST] ACTION: check-state | allow | count | deny | unreach{,6} CODE | skipto N | {divert|tee} PORT | forward ADDR | pipe N | queue N | nat N | setfib FIB | reass PARAMS: [log [logamount LOGLIMIT]] [altq QUEUE_NAME] ADDR: [ MAC dst src ether_type ] [ ip from IPADDR [ PORT ] to IPADDR [ PORTLIST ] ] [ ipv6|ip6 from IP6ADDR [ PORT ] to IP6ADDR [ PORTLIST ] ] IPADDR: [not] { any | me | ip/bits{x,y,z} | table(t[,v]) | IPLIST } IP6ADDR: [not] { any | me | me6 | ip6/bits | IP6LIST } IP6LIST: { ip6 | ip6/bits }[,IP6LIST] IPLIST: { ip | ip/bits | ip:mask }[,IPLIST] OPTION_LIST: OPTION [OPTION_LIST] OPTION: bridged | diverted | diverted-loopback | diverted-output | {dst-ip|src-ip} IPADDR | {dst-ip6|src-ip6|dst-ipv6|src-ipv6} IP6ADDR | {dst-port|src-port} LIST | estab | frag | {gid|uid} N | icmptypes LIST | in | out | ipid LIST | iplen LIST | ipoptions SPEC | ipprecedence | ipsec | iptos SPEC | ipttl LIST | ipversion VER | keep-state | layer2 | limit ... | icmp6types LIST | ext6hdr LIST | flow-id N[,N] | fib FIB | mac ... | mac-type LIST | proto LIST | {recv|xmit|via} {IF|IPADDR} | setup | {tcpack|tcpseq|tcpwin} NN | tcpflags SPEC | tcpoptions SPEC | tcpdatalen LIST | verrevpath | versrcreach | antispoof An absolute pathname must be used with -p option.abcdefhinNp:qs:STtvbad arguments, for usage summary ``ipfw''natpipequeueflowsetschedsetinvalid set number %s missing commandaddshowconfigtableenabledisabledeleteflushzeroresetlogprintlistbad command `%s'"@@@@@_@w@@@@@@@@@@@@@@p@@@@@@Ŭ@@@@@@@@:@.@@N@k@@@no filename argumentcfNnp:qSextraneous filename arguments %srfopen: %scannot create pipecannot forkdup2()execvp(%s) failedfdopen()Line %dwaitpid()preprocessor exited with status %dpreprocessor exited with signal %d@c@c@c@c@W@c@c@c@c@c@c@c@c@c@c@c@c@c@c@c@׳@c@c@@c@c@c@c@c@c@c@@c@ @K@pathname: %susage: ipfw [options] do "ipfw -h" or "man ipfw" for detailsanymeme6/,bad width "%s''not any never matchesaddress list too longbad address "%s"unknown ICMPv6 unreachable code ``%s''unreach6 %sunreach6 %u not%s%s ip6%sError ntop in print_ip6:%s/%dinvalid ICMP6 typeICMP6 type out of range ip6 icmp6types%c%d flow-id %d%c,invalid option for ipv6 exten header extension header:%cfragmentation%chop options%crouting options%crthdr0%crthdr2%cdestination options%cauthentication header%cencapsulated security payloadinvalid ipv6 flow number %sflow number out of range %sfraghopoptroutedstoptahesprthdr0rthdr2no-routeadmin-prohibaddressportbkmgtpekMGTPEBKMGTPEKMGTPEBkMGTPE buf != NULLhumanize_number.csuffix != NULLscale >= 0.%d%s%d%s%s%s%lld%s%s%shumanize_number%s unsupported invalid%s error: buffer too small %s: %li %u %lu %i (read only) \\.\Ipfw%s failed %u, cannot talk to kernel module %s empty ether_atonmy_socketsysctlbynameipfw_config_natipfw_show_nat| ,@NAB FOU AB <`iaa4ic4cDcTc`cpc|ccccccccccdddd$d,d@dTdddldtd|dddddddddddddee e4eHeTedeteeeeeeeeeeeeefff$f0f@fLfXfhftffffffffffffggg(g4g@gLgTg\gjg|ggg4cDcTc`cpc|ccccccccccdddd$d,d@dTdddldtd|dddddddddddddee e4eHeTedeteeeeeeeeeeeeefff$f0f@fLfXfhftffffffffffffggg(g4g@gLgTg\gjg|ggg__assert_func__ctype_ptr____errno5__getreent<__main_dll_crt0@0_fdopen64_fopen64J_getgrgid32L_getgrnam32\_getpwuid32p_impure_ptrabortaccessatofatoibcopycalloc close)ctimeCcygwin_detach_dllEcygwin_internalZdll_dllcrt0gdup2errerrxexecvpexitfclosefflushfgetsfilenoforkfprintffputcfreefwrite getc3gethostbyaddr4gethostbynameAgetoptNgetprotobynameOgetprotobynumberTgetpwnam[getservbyname\getservbyportinet_atoninet_ntoainet_ntopinet_ptonisattykillmallocmemcpyToptargVoptindXoptreset]pipepprintfputcharputsqsortrealloccsetserventsnprintfsprintfstrcasecmpstrcatstrchrstrcmpstrcpystrdupstrncmpstrncpystrpbrkstrrchrstrsepstrspnstrtodstrtoimaxstrtolstrtollstrtoul tolowertoupperMwaitpidNwarnOwarnxCreateFileADeviceIoControlGetLastErrorGetModuleHandleAAGetProcAddress````````````````````````````````````````````````````````````````````````````````````````cygwin1.dll`````KERNEL32.dll@Q@1'@N`@"N@0 @ @ @ P@ *`@/@0@ 2@3!Q1mainCRTStartup'zV__divdi3cygwin_crt0"Ncygwin_premain0"0 cygwin_premain1" cygwin_premain2" cygwin_premain3U =_cygwin_crt0_commonenviron_fmode__cygwin_cxx_malloc]*]_cygwin_dll_entry_cygwin_noncygwin_dll_entry__dynamically_loaded,/_pei386_runtime_relocator0DllMain$2cygwin_attach_dll2C __CTOR_LIST__ __DTOR_LIST__QU'zSItypeUSItypeDItypeUDItype DWstructZDWunionLMainFunc  =Q_LOCK_Tn_off64_t~_fpos_t_fpos64_t_ssize_twint_t)_flock_t9ptrdiff_tJsize_t{__gnuc_va_listva_liststraceDWORDWINBOOL0BOOLE__ULongT_Bigint__tm_on_exit_args_atexitp__sbufS __sFILE64"__FILE1_glue_rand48_reentLPVOIDHANDLE_SECURITY_ATTRIBUTESSECURITY_ATTRIBUTESDHINSTANCE__gHINSTANCEHMODULE^per_processcallbackMTinterface:MainFuncpnothrow_tper_process_cxx_mallocB*DWORDOHINSTANCE__rHINSTANCEVARENUMV0DWORDWINBOOLBOOLfLPVOIDHINSTANCE__HINSTANCEU2DWORDU_LOCK_Tf_off64_tv_fpos_t_fpos64_t_ssize_twint_t_mbstate_t(_flock_t8__ULongG_Bigint__tm_on_exit_args_atexitd__sbuf'__sFILE64__FILE _glueV _rand48_reent size_t HINSTANCE__ HINSTANCE HMODULE per_processMainFuncSC {ix86_tune_indicesix86_arch_indicesVARENUM| func_ptrMGNU C 4.5.3 20110428 (Fedora Cygwin 4.5.3-4)/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/crt0.c@@charlong unsigned intintunsigned charshort unsigned intfloatlong intunsigned intsigned charshort intlong long intlong long unsigned intmainCRTStartup@@0n@@/gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3/libgcc/../gcc/config/i386/cygwin.asm/gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/build/i686-pc-cygwin/libgccGNU AS 2.21.90vDGNU C 4.5.3/gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3/libgcc/../gcc/libgcc2.c/gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/build/i686-pc-cygwin/libgcc@^@intunsigned intshort unsigned intcharsigned charunsigned charshort intlong long intlong long unsigned intlong intlong unsigned intfloatdoubleSItypeUSItypeDItype'UDItype8complex floatcomplex double long doublecomplex long doubleDWstruct;low#high#Zs llDWunion; __udivmoddi4`K n` d` rp`K nnbQ ddcQ rrdZ d0e d1e n0e n1e n2e q0f q1f bg bmg ww0Q m1 m0 Z__divdi37@^@8u7v7c9 uu:Z vv;Zw<jD@E A(yP L:'@^@3b>mGNU C 4.5.3 20110428 (Fedora Cygwin 4.5.3-4)/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/lib/cygwin_crt0.c`@@charlong unsigned intintunsigned charshort unsigned intfloatlong intunsigned intsigned charshort intlong long intlong long unsigned intdoubleMainFunc\b|||<cygwin_crt0`@@fLGNU C 4.5.3 20110428 (Fedora Cygwin 4.5.3-4)/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/lib/premain0.c@@wcygwin_premain0 @@argc argv intchar"GNU C 4.5.3 20110428 (Fedora Cygwin 4.5.3-4)/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/lib/premain1.c@@cygwin_premain1 @@argc argv intcharnGNU C 4.5.3 20110428 (Fedora Cygwin 4.5.3-4)/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/lib/premain2.c@@Ocygwin_premain2 @@/argc argv intcharGNU C 4.5.3 20110428 (Fedora Cygwin 4.5.3-4)/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/lib/premain3.c@@cygwin_premain3 @@gargc argv intchar9GNU C++ 4.5.3 20110428 (Fedora Cygwin 4.5.3-4)/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/lib/_cygwin_crt0_common.cc/usr/src/debug/cygwin-1.7.16-1/i686-pc-cygwin/winsup/cygwinP@\@'signed charunsigned charshort intshort unsigned intintunsigned intlong long intlong long unsigned int_LOCK_T`long int_off64_t$&_fpos_t,b_fpos64_t2n_ssize_t8wint_t`D_mbstate_tG__wchH__wchbI __countE# __valueJ# ) _flock_tOQptrdiff_tsize_tlong unsigned int schar__gnuc_va_list( __builtin_va_listsva_listf{%_active(# version-# lmicrosec.# execing/# vsprntf&_ZN6strace7vsprntfEPcPKcS2_S0__mwrite'_ZN6strace5writeEjPKciactivate*_ZN6strace8activateEb+microseconds,_ZN6strace12microsecondsEv dll_info0_ZN6strace8dll_infoEvOprntf1_ZN6strace5prntfEjPKcS1_zvprntf2_ZN6strace6vprntfEjPKcS1_Pcwm3_ZN6strace2wmEiii write_childpid4_ZN6strace14write_childpidEmKXattached5_ZNK6strace8attachedEvactive6_ZNK6strace6activeEvactive_val7_ZN6strace10active_valEvbool  s DWORDXWINBOOL BOOLfloat__ULongX_Bigint- _next.# _k/# _maxwds/# _sign/# _wds/# _x0# T X __tm$5 __tm_sec6# __tm_min7# __tm_hour8# __tm_mday9# __tm_mon:# __tm_year;# __tm_wday<# __tm_yday=# __tm_isdst># G _fnargsH# _dso_handleI# _fntypesKE# _is_cxaNE# ` _atexitYS _nextZS# _ind[# _fns]Y#^#  ji  i__sbufi _basej# _sizek#  `m !_reent@E "b #d $_unused_rande#$_strtok_lastfm#$_asctime_bufg#$_localtime_bufh#$$_gamma_signgami#H$_rand_nextj7#P$_r48k#X$_mblen_statel#h$_mbtowc_statem#p$_wctomb_staten#x$_l64a_bufo#$_signal_bufp#$_getdate_errq#$_mbrlen_stater#$_mbrtowc_states#$_mbsrtowcs_statet#$_wcrtomb_stateu#$_wcsrtombs_statev#$_h_errnow##} $_nextf#$_nmalloc#x%_reentx%_unused $_errnoF#$_stdinK{#$_stdoutK{#$_stderrK{# $_incM#$_emergencyN%#$_current_categoryP#0$_current_localeQ#4$__sdidinitS#8$__cleanupUF#<$_resultXL#@$_result_kY#D$_p5sZL#H$_freelist[R#L$_cvtlen^#P$_cvtbuf_m#T$_new#X$_atexitX#$_atexit0#$_sig_funci#$__sglue1#$__sfu#   `  ~ `~  - `  C  S __sFILE64p _p# _r# _w# _flags# _file# _bfp# _lbfsize# _data# _cookie`# _read #$ _write #( _seek #, _close- #0 _ubp#4 _up#< _ur#@ _ubuf3 #D _nbufC #G$_lbp#H$_blksize#P$_flags2#T$_offsetn#X$_seek64#`$_lock )#d$_mbstate #h ` __FILES &_glue u$_nextu#$_niobs#$_iobs{# 1 "&_rand481$_seed2#$_mult3#$_add4#   s  s  s    %  s5 '@@  5 T L 'i o ^ S  LPVOID V`wchar_tHANDLE `&_SECURITY_ATTRIBUTES $nLength #$lpSecurityDescriptor #$bInheritHandle 0#SECURITY_ATTRIBUTES  XD &HINSTANCE__g$i#HINSTANCEy DHMODULE g m( ^cygwin_getinfo_types^)CW_LOCK_PINFO)CW_UNLOCK_PINFO)CW_GETTHREADNAME)CW_GETPINFO)CW_SETPINFO)CW_SETTHREADNAME)CW_GETVERSIONINFO)CW_READ_V1_MOUNT_TABLES)CW_USER_DATA)CW_PERFILE )CW_GET_CYGDRIVE_PREFIXES )CW_GETPINFO_FULL )CW_INIT_EXCEPTIONS )CW_GET_CYGDRIVE_INFO )CW_SET_CYGWIN_REGISTRY_NAME)CW_GET_CYGWIN_REGISTRY_NAME)CW_STRACE_TOGGLE)CW_STRACE_ACTIVE)CW_CYGWIN_PID_TO_WINPID)CW_EXTRACT_DOMAIN_AND_USER)CW_CMDLINE)CW_CHECK_NTSEC)CW_GET_ERRNO_FROM_WINERROR)CW_GET_POSIX_SECURITY_ATTRIBUTE)CW_GET_SHMLBA)CW_GET_UID_FROM_SID)CW_GET_GID_FROM_SID)CW_GET_BINMODE)CW_HOOK)CW_ARGV)CW_ENVP)CW_DEBUG_SELF)CW_SYNC_WINENV )CW_CYGTLS_PADSIZE!)CW_SET_DOS_FILE_WARNING")CW_SET_PRIV_KEY#)CW_SETERRNO$)CW_EXIT_PROCESS%)CW_SET_EXTERNAL_TOKEN&)CW_GET_INSTKEY')CW_INT_SETLOCALE()CW_CVT_MNT_OPTS))CW_LST_MNT_OPTS*)CW_STRERROR+)CW_CVT_ENV_TO_WINENV,)CW_ALLOC_DRIVE_MAP-)CW_MAP_DRIVE_MAP.)CW_FREE_DRIVE_MAP/per_process  initial_sp m# magic_biscuit X#$dll_major X#$dll_minor X# $impure_ptr_ptr #$envptr #$malloc #$free -#$realloc G# $fmode_ptr *#$$main f#($ctors l#,$dtors l#0$data_start `#4$data_end `#8$bss_start `#<$bss_end `#@$calloc #D$premain #H$run_ctors_p #X$unused #\$cxx_malloc "#x$hmodule $#|$api_major &#$api_minor '#$unused2 *4#$pseudo_reloc_start +`#$pseudo_reloc_end ,`#$image_base -`#$threadinterface 0#$impure_ptr 4#   `J  '-` " `G`J 3 f M j `JJ r  ' ^  X per_process_cxx_malloc  oper_new # oper_new__ # oper_delete -# oper_delete__ -# oper_new_nt # oper_new___nt # oper_delete_nt # oper_delete___nt # &MTinterface $concurrency #$threadcount b#$pthread_prepare 4#$pthread_child 4# $pthread_parent 4#*Init _ZN11MTinterface4InitEvj*fixup_before_fork _ZN11MTinterface17fixup_before_forkEv+fixup_after_fork _ZN11MTinterface16fixup_after_forkEv ,callback .$cb j#$next .#  MainFunc f-stdp.39.4J/nothrow_t0cE `Jp x'` 1_cygwin_crt0_commonE_cygwin_crt0_common@8P@\@92fE:3uE94P5newuG95uwasnullHA ^6:7_impure_ptr)8_data_start__+s8_data_end__+s8_bss_start__+s8_bss_end__+s8__CTOR_LIST__,j8__DTOR_LIST__-j9CYGTLS_PADSIZE1:_tlsbase*%fs:4m8sec_none_nih;cw_std_maskL7hProcImpToken 7__dynamically_loaded,# *G _fnargsH# _dso_handleI# _fntypesK8# _is_cxaN8# d _atexitYF _nextZF# _ind[# _fns]L#*^# ^\ \ __sbufi _basej# _sizek#d_reent@D_errnoF#_stdinKP #_stdoutKP #_stderrKP # _incM#_emergencyN/ #_current_categoryP#0_current_localeQ#4__sdidinitS#8__cleanupUK #<_resultX#@_result_kY#D_p5sZ#H_freelist[Q #L_cvtlen^#P_cvtbuf_#T_new #X_atexitF#_atexit0#_sig_funcc #__sglue #__sfo #dvdvd   ' __sFILE64p _p# _r# _w# _flags# _file# _bfd# _lbfsize# _data# _cookied# _read#$ _write#( _seek#, _close#0 _ubd#4 _up#< _ur#@ _ubuf#D _nbuf#G_lbd#H_blksize#P_flags2#T_offsetf#X_seek64#`_lock (#d_mbstate #hd__FILE'_glue J _nextJ #_niobs#_iobsP # _rand481 _seed2 #_mult3 #_add4# c _unused_rande#_strtok_lastf#_asctime_bufg #_localtime_bufh#$_gamma_signgami#H_rand_nextj;#P_r48kV #X_mblen_statel#h_mbtowc_statem#p_wctomb_staten#x_l64a_bufo #_signal_bufp #_getdate_errq#_mbrlen_stater#_mbrtowc_states#_mbsrtowcs_statet#_wcrtomb_stateu#_wcsrtombs_statev#_h_errnow#   | _nextf #_nmalloc #x    a/ _reentx _unused ? K ? c i W  size_tHINSTANCE__ i#HINSTANCE  HMODULE   per_process initial_sp# magic_biscuit#dll_major#dll_minor# impure_ptr_ptr#envptr#malloc#free #realloc # fmode_ptr #$main#(ctors#,dtors#0data_startd#4data_endd#8bss_startd#<bss_endd#@calloc#Dpremain!#Hrun_ctors_p#XunusedS#\cxx_malloc"|#xhmodule$ #|api_major&#api_minor'#unused2* #pseudo_reloc_start+d#pseudo_reloc_end,d#image_base-d#threadinterface2d#impure_ptr4#d ddd ^d   M1 GG 1 c per_process_cxx_malloccMainFunccygwin_attach_dll@@h fu @\A  GNU C 4.5.3/gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3/libgcc/../gcc/libgcc2.c/gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/build/i686-pc-cygwin/libgcc0@0@ intunsigned intshort unsigned intcharsigned charunsigned charshort intlong long intlong long unsigned intlong intlong unsigned intsix86_tune_indicesX86_TUNE_USE_LEAVEX86_TUNE_PUSH_MEMORYX86_TUNE_ZERO_EXTEND_WITH_ANDX86_TUNE_UNROLL_STRLENX86_TUNE_DEEP_BRANCH_PREDICTIONX86_TUNE_BRANCH_PREDICTION_HINTSX86_TUNE_DOUBLE_WITH_ADDX86_TUNE_USE_SAHFX86_TUNE_MOVXX86_TUNE_PARTIAL_REG_STALL X86_TUNE_PARTIAL_FLAG_REG_STALL X86_TUNE_USE_HIMODE_FIOP X86_TUNE_USE_SIMODE_FIOP X86_TUNE_USE_MOV0 X86_TUNE_USE_CLTDX86_TUNE_USE_XCHGBX86_TUNE_SPLIT_LONG_MOVESX86_TUNE_READ_MODIFY_WRITEX86_TUNE_READ_MODIFYX86_TUNE_PROMOTE_QIMODEX86_TUNE_FAST_PREFIXX86_TUNE_SINGLE_STRINGOPX86_TUNE_QIMODE_MATHX86_TUNE_HIMODE_MATHX86_TUNE_PROMOTE_QI_REGSX86_TUNE_PROMOTE_HI_REGSX86_TUNE_ADD_ESP_4X86_TUNE_ADD_ESP_8X86_TUNE_SUB_ESP_4X86_TUNE_SUB_ESP_8X86_TUNE_INTEGER_DFMODE_MOVESX86_TUNE_PARTIAL_REG_DEPENDENCYX86_TUNE_SSE_PARTIAL_REG_DEPENDENCY X86_TUNE_SSE_UNALIGNED_MOVE_OPTIMAL!X86_TUNE_SSE_SPLIT_REGS"X86_TUNE_SSE_TYPELESS_STORES#X86_TUNE_SSE_LOAD0_BY_PXOR$X86_TUNE_MEMORY_MISMATCH_STALL%X86_TUNE_PROLOGUE_USING_MOVE&X86_TUNE_EPILOGUE_USING_MOVE'X86_TUNE_SHIFT1(X86_TUNE_USE_FFREEP)X86_TUNE_INTER_UNIT_MOVES*X86_TUNE_INTER_UNIT_CONVERSIONS+X86_TUNE_FOUR_JUMP_LIMIT,X86_TUNE_SCHEDULE-X86_TUNE_USE_BT.X86_TUNE_USE_INCDEC/X86_TUNE_PAD_RETURNS0X86_TUNE_EXT_80387_CONSTANTS1X86_TUNE_SHORTEN_X87_SSE2X86_TUNE_AVOID_VECTOR_DECODE3X86_TUNE_PROMOTE_HIMODE_IMUL4X86_TUNE_SLOW_IMUL_IMM32_MEM5X86_TUNE_SLOW_IMUL_IMM86X86_TUNE_MOVE_M1_VIA_OR7X86_TUNE_NOT_UNPAIRABLE8X86_TUNE_NOT_VECTORMODE9X86_TUNE_USE_VECTOR_FP_CONVERTS:X86_TUNE_USE_VECTOR_CONVERTS;X86_TUNE_FUSE_CMP_AND_BRANCH<X86_TUNE_OPT_AGU=X86_TUNE_LAST>ix86_arch_indicesX86_ARCH_CMOVEX86_ARCH_CMPXCHGX86_ARCH_CMPXCHG8BX86_ARCH_XADDX86_ARCH_BSWAPX86_ARCH_LASTfloatdoubleVARENUMs3 VT_EMPTYVT_NULLVT_I2VT_I4VT_R4VT_R8VT_CYVT_DATEVT_BSTRVT_DISPATCH VT_ERROR VT_BOOL VT_VARIANT VT_UNKNOWN VT_DECIMALVT_I1VT_UI1VT_UI2VT_UI4VT_I8VT_UI8VT_INTVT_UINTVT_VOIDVT_HRESULTVT_PTRVT_SAFEARRAYVT_CARRAYVT_USERDEFINEDVT_LPSTRVT_LPWSTRVT_RECORD$VT_INT_PTR%VT_UINT_PTR&VT_FILETIMEVT_BLOBVT_STREAMVT_STORAGEVT_STREAMED_OBJECTVT_STORED_OBJECTVT_BLOB_OBJECTVT_CFVT_CLSIDVT_BSTR_BLOBVT_VECTOR VT_ARRAYVT_BYREFVT_RESERVEDVT_ILLEGALVT_ILLEGALMASKEDVT_TYPEMASKcomplex floatcomplex double long doublecomplex long doublefunc_ptr+u |  __CTOR_LIST__ P@ __DTOR_LIST__ \@% $ > .? : ; @%% $ > : ; I : ; : ;I8  : ; : ;I: ;I .: ;' I  : ;I 4: ;I   I&I.? : ;' I@: ;I 4: ;I1RUX Y1 U414141  % $ >  I: ; I' II.? : ; ' @: ; I % .? : ; ' @: ; I $ >  I% .? : ; ' @: ; I $ >  I% .? : ; ' @: ; I $ >  I% .? : ; ' @: ; I $ >  I% $ > : ; I : ;I : ;  : ;  : ; I : ; I8 I !I/  I  I : ;  : ; I8 2 .? : ; @I2 < I4 I.? : ; @2 < .? : ; @< .? : ; < .? : ; @I< .? : ; @I< &I I : ;  : ;  : ;  : ; I8  I! : ;" : ;# : ;$ : ;I8 % : ;I& : ;'( : ; )( *.? : ;@< +.? : ;@< , : ;-9: ; .: ; /< 0G : ; 1.? : ; @I@2: ; I 3: ; I4 U54: ; I64: ; I? < 74: ; I? < 84: ;I? < 94: ; I:4: ; @I? < ;4: ; I <4: ; I?  % $ > : ; I  I : ; : ;I8 : ;I  : ;  ( .: ; ' I@ : ; I .? : ; @' I@4: ; I4: ; I 4: ; I? < 4: ; I?  % .? : ; @% $ > : ; I  : ; : ;I8 : ;I I .? : ; @I@ : ; I % $ > : ; I I : ;I : ;  : ; I I !I/  : ;  : ; I8  : ;  : ;  : ;  : ; I8 ' ' II : ; : ;I8 &I : ; : ; : ; : ;I' < .? : ; ' I@: ; I 4: ; I % $ > '  I : ; (  : ;: ; I I !I/ 4: ;I?  jJ /usr/src/debug/cygwin-1.7.16-1/winsup/cygwincrt0.c@i?x /gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3/libgcc/../gcc/config/i386cygwin.asm@%!KY1g=YY1/>///A!x /gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3/libgcc/../gcclibgcc2.clibgcc2.h@tB+,yi~- .z.y.= <0Nk<.Kw= KW=qsTdZ:?;gI0-/KH>>EMqL=w_ /usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/libcygwin_crt0.ccrt0.h`@gYhR /usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/libpremain0.c@ =hR /usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/libpremain1.c@ =hR /usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/libpremain2.c@ =hR /usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/libpremain3.c@ =0| /usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/lib/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/include/sys/usr/src/debug/cygwin-1.7.16-1/newlib/libc/include/sys/usr/lib64/gcc/i686-pc-cygwin/4.5.3/include/usr/src/debug/cygwin-1.7.16-1/winsup/w32api/include/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/usr/lib64/gcc/i686-pc-cygwin/4.5.3/include/c++._cygwin_crt0_common.cclock.h_types.hstddef.hstdarg.hstrace.hwindef.hreent.hwinnt.hcygwin.hcygwin-cxx.hthread.hcrt0.hcstddefwinsup.hcygtls.hsecurity.hcygwait.hglobals.hnewP@gfX.wu t<i /usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/lib/usr/src/debug/cygwin-1.7.16-1/winsup/w32api/includedll_main.ccwindef.hwinnt.h@ pX.{ /usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/lib/usr/src/debug/cygwin-1.7.16-1/winsup/w32api/include/usr/src/debug/cygwin-1.7.16-1/winsup/cygwin/include/sys/usr/src/debug/cygwin-1.7.16-1/newlib/libc/include/sys/usr/lib64/gcc/i686-pc-cygwin/4.5.3/includecygwin_attach_dll.cwindef.hlock.h_types.hstddef.hreent.hcygwin.hcrt0.h@v:>=;q@ /gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3/libgcc/../gcc/config/i386/usr/i686-pc-cygwin/bin/../include/w32api/gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3/libgcc/../gcci386.hwtypes.hlibgcc2.cgbl-ctors.h| @AB  | ,4@NAB FOU AB | x`@"AB | @AB A | @AB A |  @AB A | @@AB A | (tP@ AB E AA C | `@*AB f 4@AB g F N E A C N p@ AB D | @@AB A | t@ AG A |  @3AB Dg strace_on_exit_args__dynamically_loaded_on_exit_argsttutttmumntnptpNu,0,\ N\W]PRboPR40N04LRQorRQRQ4RVWotVWVW<RXoXQXVNX<JPoPPR/W<HToTTTNTL$<RWoSSRS%V%(R(NS!R1P%(P(DVDGvGNVHR0PSxLO'NLO'(;R@DR(DPtt"uttutttutttutttutttut u}SP SPPP"01tt)u)*t01t13t3ZuZ`t`ututu t0Y1Y]P]w1wP1P 1ttutttuttt u ttt.u.3t4RNpUW4RNpUW .filegcrt0.c  .text.data.bss 0 Q n 48% .file-gcygming-crtbegin.c$_obj8JF \  .text.data.bss.rdata_t.jcrJ.filepgipfw2.c~p       2 _pr_u64K     _do_cmd %  2m  =J  Y  e  r  ~ X  >  _fill_ip  f  *`3    '@2_f_iptos <`GTt+ g\0 |2 _n2mask7 +&8 9      #f "h i .textpMn.data.bss  .rdata@ ".filegdummynet.c"o _o_nexto , p <Ip Ikq Ur `r lwz }z 7|   ?  .texto(a.data0%.bss .rdata,DW.filegmain.c  _main .textB.data .bss .rdataH; M.filegipv6.c0  ,8 M7 X, i {n   ׯ  ±  .text0 g.data  .bss .rdataFq.filegqsort_r.c_qsort_r@ .text@.data.bss .filegexpand_number.cк .textк.data.bss .rdatadI.fileghumanize_number.c I.text.data.bss .rdatalI.filegglue.c  J/ @J_strlcpy0 T ^ lJ a  J  J.text@.data.bss .rdata J.filegfakeQ 0 n .text1.data.bss   .fileglibgcc2.c .textN.data.bss D )' z 4 DtD8[%Y@ P.file5gcygwin_crt0.c` .text`".data.bss m i  {x ,,D"k` .fileMgpremain0.c .text.data.bss  LN w l 48f& .fileegpremain1.c% .text.data.bss " L0  l 48& .file}gpremain2.c6 .text.data.bss n L O l  4/8& .filegpremain3.cG .text.data.bss  L  l@ 4g8& .text.idata$7.idata$5.idata$4@.idata$6D.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text .filegfake.text(.filegfake.text0.filegfake.text8.filegfake.text@.filegfake.textH.filegfake.textP.filegfake.textX.filegfake.text`.filegfake.texth.filegfake.textp.filegfake.textx.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.file gfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.file"gfake.text.file&gfake.text.file*gfake.text.file.gfake.text.file2gfake.text.file6gfake.text.file:gfake.text.file>gfake.text.fileBgfake.text.fileFgfake.text .fileJgfake.text(.fileNgfake.text0.fileRgfake.text8.fileVgfake.text@.fileZgfake.textH.file^gfake.textP.filebgfake.textX.filefgfake.text`.filejgfake.texth.filengfake.textp.filergfake.textx.filevgfake.text.filezgfake.text.filegfake.text.text.idata$7.idata$5.idata$4.idata$6.text.idata$7.idata$5.idata$4.idata$6.text.idata$7.idata$5.idata$4.idata$6.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text.filegfake.text .filegfake.text(.filegfake.text0.filegfake.text8.filegfake.text@.filegzXP .textP =.data .bss  D =' 4t @Y$ Po .text`.idata$7.idata$5.idata$4h.idata$6.file*gdll_entry.c` 4 0 ,  8 p .text`.data.bss( J * [  aIWaF  o .file.gfake.text.fileFg .text.data.bss< I %/ D t@ 480@ .file`gdll_main.cc4 .text .data.bss< n 0  t 48Z` .filedgfake.text.filegS@ _u.8982@ .text3.data.bss@  2  y  88(NY o* .filegfake.text.text.data.bss .idata$7, .idata$5(.idata$4.idata$6.text.data.bss .idata$70 .idata$5,.idata$4.idata$6.text.data.bss .idata$7$ .idata$5 .idata$4.idata$6j.text .data.bss .idata$7 .idata$5.idata$4.idata$6\.text(.data.bss .idata$7( .idata$5$.idata$4.idata$6|.filegfakehnamefthunk.text0.data.bss .idata$2.idata$4.idata$5.filegfake.text0.data.bss .idata$4.idata$50.idata$74  .fileglibgcc2.c.text0.data.bss  C   .6W.filegcygming-crtend.cgDvJ0 @ .text0.data.bss tD.jcrJT`.idata$2.idata$5.idata$4<.idata$7.idata$5.idata$4<.idata$64@feat.00.idata$7.idata$5.idata$4D.idata$6T@feat.00.idata$7.idata$5.idata$4H.idata$6`@feat.00.idata$7.idata$5.idata$4L.idata$6p@feat.00.idata$7.idata$5.idata$4P.idata$6|@feat.00.idata$7.idata$5.idata$4T.idata$6@feat.00.idata$7.idata$5.idata$4X.idata$6@feat.00.idata$7.idata$5.idata$4\.idata$6@feat.00.idata$7.idata$5.idata$4`.idata$6@feat.00.idata$7.idata$5.idata$4d.idata$6@feat.00.idata$7.idata$5.idata$4l.idata$6@feat.00.idata$7.idata$5.idata$4p.idata$6@feat.00.idata$7.idata$5.idata$4t.idata$6@feat.00.idata$7.idata$5.idata$4x.idata$6@feat.00.idata$7.idata$5.idata$4|.idata$6@feat.00.idata$7.idata$5.idata$4.idata$6@feat.00.idata$7.idata$5.idata$4.idata$6@feat.00.idata$7.idata$5.idata$4.idata$6$@feat.00.idata$7.idata$5.idata$4.idata$6,@feat.00.idata$7.idata$5 .idata$4.idata$6@@feat.00.idata$7 .idata$5.idata$4.idata$6T@feat.00.idata$7.idata$5.idata$4.idata$6d@feat.00.idata$7.idata$5.idata$4.idata$6l@feat.00.idata$7.idata$5.idata$4.idata$6t@feat.00.idata$7.idata$5 .idata$4.idata$6|@feat.00.idata$7 .idata$5$.idata$4.idata$6@feat.00.idata$7$.idata$5(.idata$4.idata$6@feat.00.idata$7(.idata$5,.idata$4.idata$6@feat.00.idata$7,.idata$50.idata$4.idata$6@feat.00.idata$70.idata$54.idata$4.idata$6@feat.00.idata$74.idata$58.idata$4.idata$6@feat.00.idata$78.idata$5<.idata$4.idata$6@feat.00.idata$7<.idata$5@.idata$4.idata$6@feat.00.idata$7@.idata$5D.idata$4.idata$6@feat.00.idata$7D.idata$5H.idata$4.idata$6@feat.00.idata$7H.idata$5L.idata$4.idata$6@feat.00.idata$7L.idata$5P.idata$4.idata$6@feat.00.idata$7P.idata$5T.idata$4.idata$6@feat.00.idata$7T.idata$5X.idata$4.idata$6@feat.00.idata$7X.idata$5\.idata$4.idata$6 @feat.00.idata$7\.idata$5`.idata$4.idata$64@feat.00.idata$7`.idata$5d.idata$4.idata$6H@feat.00.idata$7d.idata$5h.idata$4.idata$6T@feat.00.idata$7h.idata$5l.idata$4.idata$6d@feat.00.idata$7l.idata$5p.idata$4.idata$6t@feat.00.idata$7p.idata$5t.idata$4.idata$6@feat.00.idata$7t.idata$5x.idata$4.idata$6@feat.00.idata$7x.idata$5|.idata$4.idata$6@feat.00.idata$7|.idata$5.idata$4.idata$6@feat.00.idata$7.idata$5.idata$4.idata$6@feat.00.idata$7.idata$5.idata$4 .idata$6@feat.00.idata$7.idata$5.idata$4.idata$6@feat.00.idata$7.idata$5.idata$4 .idata$6@feat.00.idata$7.idata$5.idata$4$.idata$6@feat.00.idata$7.idata$5.idata$4(.idata$6@feat.00.idata$7.idata$5.idata$4,.idata$6@feat.00.idata$7.idata$5.idata$40.idata$6@feat.00.idata$7.idata$5.idata$44.idata$6$@feat.00.idata$7.idata$5.idata$48.idata$60@feat.00.idata$7.idata$5.idata$4<.idata$6@@feat.00.idata$7.idata$5.idata$4@.idata$6L@feat.00.idata$7.idata$5.idata$4D.idata$6X@feat.00.idata$7.idata$5.idata$4H.idata$6h@feat.00.idata$7.idata$5.idata$4L.idata$6t@feat.00.idata$7.idata$5.idata$4P.idata$6@feat.00.idata$7.idata$5.idata$4T.idata$6@feat.00.idata$7.idata$5.idata$4X.idata$6@feat.00.idata$7.idata$5.idata$4\.idata$6@feat.00.idata$7.idata$5.idata$4`.idata$6@feat.00.idata$7.idata$5.idata$4d.idata$6@feat.00.idata$7.idata$5.idata$4h.idata$6@feat.00.idata$7.idata$5.idata$4l.idata$6@feat.00.idata$7.idata$5.idata$4p.idata$6@feat.00.idata$7.idata$5.idata$4t.idata$6@feat.00.idata$7.idata$5.idata$4x.idata$6@feat.00.idata$7.idata$5.idata$4|.idata$6@feat.00.idata$7.idata$5.idata$4.idata$6@feat.00.idata$7.idata$5.idata$4.idata$6@feat.00.idata$7 .idata$5.idata$4.idata$6(@feat.00.idata$7 .idata$5.idata$4.idata$64@feat.00.idata$7 .idata$5 .idata$4.idata$6@@feat.00.idata$7 .idata$5.idata$4.idata$6L@feat.00.idata$7 .idata$5.idata$4.idata$6T@feat.00.idata$4.idata$5.idata$7 Xh_putchar0 @A P _sprintf`  % \4 _free  ? _strcat _strcmp Q   $        pA  % ; G [ t  L  _warnx    H \^ x  pA_getcH  pA  pA   (   ( _puts8   # H . :  N ] t  _fputc0 _execvp   @_toupperP  `  @A__ZdlPv&   _environ ( 6 ,_atofx N  ` pAr ( _isatty }  l _fdopen   @   pA_co __dll__ '_fwrite 5_strncpyX D X g@v$_atoi p_memcpy@ 4  /@A_fileno Mx _waitpid \D_warn p}J_tolower P_fflush@ P pA_err` ___main _fprintf  __alloca _strtol pA_strdup 0p P  &8 _fopenh _callocX 0 __fmode$ <_strpbrk O[ _ctime _dup2 _bcopy "0 ,fu_realloch  _access #6__end__pA_strtod _strchr H( R(_malloc8 l\_fclose z<_pipe _strcpy |( pA% 3@_strspn @NTc,q_abort   x_strtoll(  pA%_fork :___errno Hp _strncmp D_errx   d_strrchr  (_strtoul 9"Od_fgets v#_kill _strsep __Znaj'!__Znwj(4_exit t_printf .h@A4 _getopt P_qsort  8pA$  __ZdaPv%_close 0H>.eh_frame.debug_aranges.debug_pubnames.debug_pubtypes.debug_info.debug_abbrev.debug_line.debug_frame.debug_str.debug_loc.debug_ranges_mainCRTStartup_WinMainCRTStartup.debug_abbrev.debug_info.debug_line.debug_frame.debug_loc.debug_pubnames.debug_pubtypes.debug_aranges___EH_FRAME_BEGIN_____JCR_LIST_____gcc_register_frame___gcc_deregister_frame.eh_frame_fill_cmd_lookup_host_print_flags_f_tcpflags_PRINT_UINT_ARG_show_prerequisites_next_cmd_add_proto0_get_mac_addr_mask_show_dyn_ipfw_safe_calloc_safe_realloc_match_token_strtoport_ether_types_fill_newports_fill_flags_match_value_print_port_print_newports__port_name__substrcmp_add_ports__substrcmp2_contigmask_add_srcip_add_dstip_print_ip_lookup_key_rule_options_print_mac_show_ipfw_twidth.5360_icmpcodes_f_ipopts_f_tcpopts_limit_masks_ipfw_sets_handler_ipfw_sysctl_handler_ipfw_list_minimask.5652_ipfw_delete_ipfw_add_actbuf.5797_cmdbuf.5798_rulebuf.5796_rule_actions_rule_action_params_ipfw_zero_ipfw_flush_ipfw_table_handler_oid_fill_compare_points_parse_range_print_mask_flush_buf_list_pipes_is_valid_number_read_bandwidth_load_extra_delays_ipfw_delete_pipe_ipfw_config_pipe_dummynet_params_dummynet_flush_dummynet_list_ipfw_main_ipfw_readfile_fill_ip6_fill_unreach6_code_icmp6codes_print_unreach6_code_print_ip6_fill_icmp6types_print_icmp6types_print_flow6id_fill_ext6hdr_ext6hdrcodes_print_ext6hdr_fill_flow6_add_srcip6_add_dstip6_expand_number_humanize_number___FUNCTION__.3524_ipfw_show_nat___FUNCTION__.31264_ipfw_config_nat___FUNCTION__.31269_strtonum_sysctlbyname___FUNCTION__.31650_wnd_setsockopt_wnd_getsockopt_my_socket___FUNCTION__.31693_gethostbyname2_ether_aton___FUNCTION__.31701___divdi3.debug_ranges_cygwin_crt0_cygwin_premain0_cygwin_premain1_cygwin_premain2_cygwin_premain3__cygwin_crt0_common@8.debug_str_cygwin_crt0_common.cc___dllMain_storedPtr_storedReason_storedHandle__cygwin_dll_entry@12_dll_index__cygwin_noncygwin_dll_entry@12__pei386_runtime_relocatorpseudo-reloc-dummy.c_DllMain@12_cygwin_attach_dllcygwin_attach_dll.c___FRAME_END_____JCR_END___register_frame_ctor_deregister_frame_dtor.ctors.65535.dtors.65535__imp__getopt__imp__getservbyname___RUNTIME_PSEUDO_RELOC_LIST___inet_ntop__data_start_____DTOR_LIST____imp__err__nm___impure_ptr.weak.__Jv_RegisterClasses.___gcc_register_frame__imp___getgrnam32__imp__GetLastError@0_getservbyport_strtoimax__imp__strtod__imp____assert_func__imp__bcopy___tls_start____imp__waitpid__imp__setservent__imp__CreateFileA@28__imp__warn__rt_psrelocs_start__imp__cygwin_detach_dll.weak.___register_frame_info.___gcc_register_frame__imp__getc__imp__abort.weak.___real__Znwj.__cygwin_crt0_common@8__dll_characteristics____size_of_stack_commit__.weak.___real__ZdlPv.__cygwin_crt0_common@8__imp__getprotobyname__size_of_stack_reserve____major_subsystem_version_____crt_xl_start_____crt_xi_start_____chkstk___crt_xi_end_____assert_func___dynamically_loaded__imp__strpbrk_GetLastError@0_dll_dllcrt0_inet_ntoa__imp__kill_GetModuleHandleA@4__imp__strncmp___register_frame_info__imp__strtoul__imp__strdup__bss_start____imp__fputc__imp__getprotobynumber__imp__strspn___RUNTIME_PSEUDO_RELOC_LIST_END____size_of_heap_commit____imp__access_ipfw_socket__imp__isatty__imp__GetProcAddress@8_GetProcAddress@8___crt_xp_start___inet_pton__imp__pipe__imp__getservbyport__imp__putchar__nm__optind_getprotobynumber__imp__optreset___crt_xp_end____imp__DeviceIoControl@32__imp__puts__minor_os_version____imp__strsep__imp__strtoll_DeviceIoControl@32_gethostbyname__image_base____imp__exit__section_alignment____imp__inet_aton__imp__toupper__imp___impure_ptr__IAT_end___cygwin_internal__imp__strtoimax_getgrgid.weak.___real__ZdaPv.__cygwin_crt0_common@8__RUNTIME_PSEUDO_RELOC_LIST___getservbyname__nm____ctype_ptr____imp__qsort__data_end____CTOR_LIST____imp__sprintf__bss_end_____crt_xc_end___inet_aton___crt_xc_start____imp__fgets__imp__strchr_strcasecmp___CTOR_LIST___CreateFileA@28_getgrnam___getreent__rt_psrelocs_size__imp__errx.weak.___real__ZnajRKSt9nothrow_t.__cygwin_crt0_common@8_cygwin1_dll_iname__imp__memcpy__head_cygwin1_dll.weak.___real__Znaj.__cygwin_crt0_common@8__imp__strcmp__imp____main__file_alignment___getpwnam.weak.___real__ZdaPvRKSt9nothrow_t.__cygwin_crt0_common@8__imp__strrchr__imp___getpwuid32_cygwin_detach_dll__imp__malloc__imp__atoi__imp__strncpy__major_os_version____imp__warnx__imp__dll_dllcrt0__imp__ctime__imp__realloc__IAT_start____imp___dll_crt0@0__imp____getreent_snprintf__imp__GetModuleHandleA@4__DTOR_LIST____imp__fprintf__imp__inet_pton.weak.___deregister_frame_info.___gcc_register_frame__imp__fclose_getprotobyname__imp__close__size_of_heap_reserve_____crt_xt_start____imp__execvp___ImageBase__subsystem____imp__gethostbyname__imp__fflush__imp__strtol__imp__strcpy__imp__calloc__Jv_RegisterClasses__imp____errno_resvd_set_number__imp__cygwin_internal__imp___getgrgid32__imp__inet_ntop___tls_end____imp__dup2___cygwin_cxx_malloc__imp__optind.weak.___real__ZnwjRKSt9nothrow_t.__cygwin_crt0_common@8_setservent__imp___fopen64__imp__free___deregister_frame_info__imp__snprintf__major_image_version____loader_flags____imp__tolower__imp__printf__imp__getpwnam__imp___fdopen64__ZdlPvRKSt9nothrow_t__head_libkernel32_a__rt_psrelocs_end__minor_subsystem_version____minor_image_version____ZnajRKSt9nothrow_t__ZdaPvRKSt9nothrow_t__imp__atof__imp__fileno__nm__optarg__imp__strcasecmp__imp__inet_ntoa__nm__optreset.weak.___real__ZdlPvRKSt9nothrow_t.__cygwin_crt0_common@8__RUNTIME_PSEUDO_RELOC_LIST_END____libkernel32_a_iname__imp__optarg__imp__gethostbyaddr_getpwuid__imp__fork___crt_xt_end____ZnwjRKSt9nothrow_t__imp__strcat_gethostbyaddr__imp____ctype_ptr____imp__fwriteipfw3-2012/ipfw/000755 000423 000000 00000000000 12012011777 013671 5ustar00luigiwheel000000 000000 ipfw3-2012/ipfw/include/000755 000423 000000 00000000000 12006744007 015316 5ustar00luigiwheel000000 000000 ipfw3-2012/ipfw/rule_test.sh000755 000423 000000 00000003705 12006744007 016245 0ustar00luigiwheel000000 000000 #/bin/bash COMMAND=ipfw echo .########## Set $COMMAND mode .########## $COMMAND add allow ip from any to any $COMMAND -q flush echo .########## empty rules .########## $COMMAND list $COMMAND add allow ip from any to any $COMMAND add allow ip from any to { 1.2.3.4 or 2.3.4.5 } $COMMAND add allow { dst-ip 1.2.3.4 or dst-ip 2.3.4.5 } echo .########## listing 3 rules .########## $COMMAND list $COMMAND delete 200 echo .########## listing 2 rules .########## $COMMAND list $COMMAND table 10 add 1.2.3.4 $COMMAND table 10 add 1.2.3.5 $COMMAND table 10 add 1.2.3.6 $COMMAND table 10 add 1.2.3.7/13 $COMMAND table 10 add 1.2.3.7/20 $COMMAND table 10 add 1.2.3.7/28 echo .########## listing table 10 with 6 elements .########## $COMMAND table 10 list $COMMAND table 10 delete 1.2.3.6 echo .########## listing table 10 with 5 elements .########## $COMMAND table 10 list $COMMAND table 10 flush echo .########## table 10 empty .########## $COMMAND table 10 list echo .########## move rule 100 to set 1 300 to 3 .########## $COMMAND set move rule 100 to 1 $COMMAND set move rule 300 to 3 $COMMAND -S show echo .########## move rule 200 to 2 but 200 do not exist .###### $COMMAND set move rule 200 to 2 echo .########## add some rules .########## $COMMAND add 200 queue 2 proto ip $COMMAND add 300 queue 5 proto ip $COMMAND add 400 queue 40 proto ip $COMMAND add 400 queue 50 proto ip echo .########## move rule 200 to 2 .###### $COMMAND set move rule 200 to 2 echo .########## move rule 400 to 5 .###### $COMMAND set move rule 400 to 5 echo .########## set 5 show 2 rules .###### $COMMAND set 5 show echo .########## flush set 5 .###### $COMMAND -q set 5 flush echo .########## set 5 show 0 rule .###### $COMMAND set 5 show echo .########## disable set 1 .###### $COMMAND set disable 1 echo .########## show all rules except set 1 .###### $COMMAND -S show echo .########## enable set 1 .###### $COMMAND set enable 1 echo .########## show all rules .###### $COMMAND -S show ipfw3-2012/ipfw/dummynet.c000644 000423 000000 00000111562 12010136325 015700 0ustar00luigiwheel000000 000000 /* * Copyright (c) 2002-2003,2010 Luigi Rizzo * * Redistribution and use in source forms, with and without modification, * are permitted provided that this entire comment appears intact. * * Redistribution in binary form may occur without any restrictions. * Obviously, it would be nice if you gave credit where credit is due * but requiring it would be too onerous. * * This software is provided ``AS IS'' without any warranties of any kind. * * $FreeBSD: head/sbin/ipfw/dummynet.c 206843 2010-04-19 15:11:45Z luigi $ * * dummynet support */ #include #include /* XXX there are several sysctl leftover here */ #include #include "ipfw2.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* inet_ntoa */ static struct _s_x dummynet_params[] = { { "plr", TOK_PLR }, { "noerror", TOK_NOERROR }, { "buckets", TOK_BUCKETS }, { "dst-ip", TOK_DSTIP }, { "src-ip", TOK_SRCIP }, { "dst-port", TOK_DSTPORT }, { "src-port", TOK_SRCPORT }, { "proto", TOK_PROTO }, { "weight", TOK_WEIGHT }, { "lmax", TOK_LMAX }, { "maxlen", TOK_LMAX }, { "all", TOK_ALL }, { "mask", TOK_MASK }, /* alias for both */ { "sched_mask", TOK_SCHED_MASK }, { "flow_mask", TOK_FLOW_MASK }, { "droptail", TOK_DROPTAIL }, { "red", TOK_RED }, { "gred", TOK_GRED }, { "bw", TOK_BW }, { "bandwidth", TOK_BW }, { "delay", TOK_DELAY }, { "link", TOK_LINK }, { "pipe", TOK_PIPE }, { "queue", TOK_QUEUE }, { "flowset", TOK_FLOWSET }, { "sched", TOK_SCHED }, { "pri", TOK_PRI }, { "priority", TOK_PRI }, { "type", TOK_TYPE }, { "flow-id", TOK_FLOWID}, { "dst-ipv6", TOK_DSTIP6}, { "dst-ip6", TOK_DSTIP6}, { "src-ipv6", TOK_SRCIP6}, { "src-ip6", TOK_SRCIP6}, { "profile", TOK_PROFILE}, { "burst", TOK_BURST}, { "dummynet-params", TOK_NULL }, { NULL, 0 } /* terminator */ }; #define O_NEXT(p, len) ((void *)((char *)p + len)) static void oid_fill(struct dn_id *oid, int len, int type, uintptr_t id) { oid->len = len; oid->type = type; oid->subtype = 0; oid->id = id; } /* make room in the buffer and move the pointer forward */ static void * o_next(struct dn_id **o, int len, int type) { struct dn_id *ret = *o; oid_fill(ret, len, type, 0); *o = O_NEXT(*o, len); return ret; } /* handle variable length structures moving back the pointer and fixing length */ static void * o_compact(struct dn_id **o, int len, int real_length, int type) { struct dn_id *ret = *o; ret = O_NEXT(*o, -len); oid_fill(ret, real_length, type, 0); *o = O_NEXT(ret, real_length); return ret; } #if 0 static int sort_q(void *arg, const void *pa, const void *pb) { int rev = (co.do_sort < 0); int field = rev ? -co.do_sort : co.do_sort; long long res = 0; const struct dn_flow_queue *a = pa; const struct dn_flow_queue *b = pb; switch (field) { case 1: /* pkts */ res = a->len - b->len; break; case 2: /* bytes */ res = a->len_bytes - b->len_bytes; break; case 3: /* tot pkts */ res = a->tot_pkts - b->tot_pkts; break; case 4: /* tot bytes */ res = a->tot_bytes - b->tot_bytes; break; } if (res < 0) res = -1; if (res > 0) res = 1; return (int)(rev ? res : -res); } #endif /* print a mask and header for the subsequent list of flows */ static void print_mask(struct ipfw_flow_id *id) { if (!IS_IP6_FLOW_ID(id)) { printf(" " "mask: %s 0x%02x 0x%08x/0x%04x -> 0x%08x/0x%04x\n", id->extra ? "queue," : "", id->proto, id->src_ip, id->src_port, id->dst_ip, id->dst_port); } else { char buf[255]; printf("\n mask: %sproto: 0x%02x, flow_id: 0x%08x, ", id->extra ? "queue," : "", id->proto, id->flow_id6); inet_ntop(AF_INET6, &(id->src_ip6), buf, sizeof(buf)); printf("%s/0x%04x -> ", buf, id->src_port); inet_ntop(AF_INET6, &(id->dst_ip6), buf, sizeof(buf)); printf("%s/0x%04x\n", buf, id->dst_port); } } static void print_header(struct ipfw_flow_id *id) { if (!IS_IP6_FLOW_ID(id)) printf("BKT Prot ___Source IP/port____ " "____Dest. IP/port____ " "Tot_pkt/bytes Pkt/Byte Drp\n"); else printf("BKT ___Prot___ _flow-id_ " "______________Source IPv6/port_______________ " "_______________Dest. IPv6/port_______________ " "Tot_pkt/bytes Pkt/Byte Drp\n"); } static void list_flow(struct dn_flow *ni, int *print) { char buff[255]; struct protoent *pe = NULL; struct in_addr ina; struct ipfw_flow_id *id = &ni->fid; if (*print) { print_header(&ni->fid); *print = 0; } pe = getprotobynumber(id->proto); /* XXX: Should check for IPv4 flows */ printf("%3u%c", (ni->oid.id) & 0xff, id->extra ? '*' : ' '); if (!IS_IP6_FLOW_ID(id)) { if (pe) printf("%-4s ", pe->p_name); else printf("%4u ", id->proto); ina.s_addr = htonl(id->src_ip); printf("%15s/%-5d ", inet_ntoa(ina), id->src_port); ina.s_addr = htonl(id->dst_ip); printf("%15s/%-5d ", inet_ntoa(ina), id->dst_port); } else { /* Print IPv6 flows */ if (pe != NULL) printf("%9s ", pe->p_name); else printf("%9u ", id->proto); printf("%7d %39s/%-5d ", id->flow_id6, inet_ntop(AF_INET6, &(id->src_ip6), buff, sizeof(buff)), id->src_port); printf(" %39s/%-5d ", inet_ntop(AF_INET6, &(id->dst_ip6), buff, sizeof(buff)), id->dst_port); } pr_u64(&ni->tot_pkts, 4); pr_u64(&ni->tot_bytes, 8); printf("%2u %4u %3u\n", ni->length, ni->len_bytes, ni->drops); } static void print_flowset_parms(struct dn_fs *fs, char *prefix) { int l; char qs[30]; char plr[30]; char red[90]; /* Display RED parameters */ l = fs->qsize; if (fs->flags & DN_QSIZE_BYTES) { if (l >= 8192) sprintf(qs, "%d KB", l / 1024); else sprintf(qs, "%d B", l); } else sprintf(qs, "%3d sl.", l); if (fs->plr) sprintf(plr, "plr %f", 1.0 * fs->plr / (double)(0x7fffffff)); else plr[0] = '\0'; if (fs->flags & DN_IS_RED) /* RED parameters */ sprintf(red, "\n\t %cRED w_q %f min_th %d max_th %d max_p %f", (fs->flags & DN_IS_GENTLE_RED) ? 'G' : ' ', 1.0 * fs->w_q / (double)(1 << SCALE_RED), fs->min_th, fs->max_th, 1.0 * fs->max_p / (double)(1 << SCALE_RED)); else sprintf(red, "droptail"); if (prefix[0]) { printf("%s %s%s %d queues (%d buckets) %s\n", prefix, qs, plr, fs->oid.id, fs->buckets, red); prefix[0] = '\0'; } else { printf("q%05d %s%s %d flows (%d buckets) sched %d " "weight %d lmax %d pri %d %s\n", fs->fs_nr, qs, plr, fs->oid.id, fs->buckets, fs->sched_nr, fs->par[0], fs->par[1], fs->par[2], red); if (fs->flags & DN_HAVE_MASK) print_mask(&fs->flow_mask); } } static void print_extra_delay_parms(struct dn_profile *p) { double loss; if (p->samples_no <= 0) return; loss = p->loss_level; loss /= p->samples_no; printf("\t profile: name \"%s\" loss %f samples %d\n", p->name, loss, p->samples_no); } static void flush_buf(char *buf) { if (buf[0]) printf("%s\n", buf); buf[0] = '\0'; } /* * generic list routine. We expect objects in a specific order, i.e. * PIPES AND SCHEDULERS: * link; scheduler; internal flowset if any; instances * we can tell a pipe from the number. * * FLOWSETS: * flowset; queues; * link i (int queue); scheduler i; si(i) { flowsets() : queues } */ static void list_pipes(struct dn_id *oid, struct dn_id *end) { char buf[160]; /* pending buffer */ int toPrint = 1; /* print header */ buf[0] = '\0'; for (; oid != end; oid = O_NEXT(oid, oid->len)) { if (oid->len < sizeof(*oid)) errx(1, "invalid oid len %d\n", oid->len); switch (oid->type) { default: flush_buf(buf); printf("unrecognized object %d size %d\n", oid->type, oid->len); break; case DN_TEXT: /* list of attached flowsets */ { int i, l; struct { struct dn_id id; uint32_t p[0]; } *d = (void *)oid; l = (oid->len - sizeof(*oid))/sizeof(d->p[0]); if (l == 0) break; printf(" Children flowsets: "); for (i = 0; i < l; i++) printf("%u ", d->p[i]); printf("\n"); break; } case DN_CMD_GET: if (co.verbose) printf("answer for cmd %d, len %d\n", oid->type, oid->id); break; case DN_SCH: { struct dn_sch *s = (struct dn_sch *)oid; flush_buf(buf); printf(" sched %d type %s flags 0x%x %d buckets %d active\n", s->sched_nr, s->name, s->flags, s->buckets, s->oid.id); if (s->flags & DN_HAVE_MASK) print_mask(&s->sched_mask); } break; case DN_FLOW: list_flow((struct dn_flow *)oid, &toPrint); break; case DN_LINK: { struct dn_link *p = (struct dn_link *)oid; double b = p->bandwidth; char bwbuf[30]; char burst[5 + 7]; /* This starts a new object so flush buffer */ flush_buf(buf); /* data rate */ if (b == 0) sprintf(bwbuf, "unlimited "); else if (b >= 1000000) sprintf(bwbuf, "%7.3f Mbit/s", b/1000000); else if (b >= 1000) sprintf(bwbuf, "%7.3f Kbit/s", b/1000); else sprintf(bwbuf, "%7.3f bit/s ", b); if (humanize_number(burst, sizeof(burst), p->burst, "", HN_AUTOSCALE, 0) < 0 || co.verbose) sprintf(burst, "%d", (int)p->burst); sprintf(buf, "%05d: %s %4d ms burst %s", p->link_nr % DN_MAX_ID, bwbuf, p->delay, burst); } break; case DN_FS: print_flowset_parms((struct dn_fs *)oid, buf); break; case DN_PROFILE: flush_buf(buf); print_extra_delay_parms((struct dn_profile *)oid); } flush_buf(buf); // XXX does it really go here ? } } /* * Delete pipe, queue or scheduler i */ int ipfw_delete_pipe(int do_pipe, int i) { struct { struct dn_id oid; uintptr_t a[1]; /* add more if we want a list */ } cmd; oid_fill((void *)&cmd, sizeof(cmd), DN_CMD_DELETE, DN_API_VERSION); cmd.oid.subtype = (do_pipe == 1) ? DN_LINK : ( (do_pipe == 2) ? DN_FS : DN_SCH); cmd.a[0] = i; i = do_cmd(IP_DUMMYNET3, &cmd, cmd.oid.len); if (i) { i = 1; warn("rule %u: setsockopt(IP_DUMMYNET_DEL)", i); } return i; } /* * Code to parse delay profiles. * * Some link types introduce extra delays in the transmission * of a packet, e.g. because of MAC level framing, contention on * the use of the channel, MAC level retransmissions and so on. * From our point of view, the channel is effectively unavailable * for this extra time, which is constant or variable depending * on the link type. Additionally, packets may be dropped after this * time (e.g. on a wireless link after too many retransmissions). * We can model the additional delay with an empirical curve * that represents its distribution. * * cumulative probability * 1.0 ^ * | * L +-- loss-level x * | ****** * | * * | ***** * | * * | ** * | * * +-------*-------------------> * delay * * The empirical curve may have both vertical and horizontal lines. * Vertical lines represent constant delay for a range of * probabilities; horizontal lines correspond to a discontinuty * in the delay distribution: the link will use the largest delay * for a given probability. * * To pass the curve to dummynet, we must store the parameters * in a file as described below, and issue the command * * ipfw pipe config ... bw XXX profile ... * * The file format is the following, with whitespace acting as * a separator and '#' indicating the beginning a comment: * * samples N * the number of samples used in the internal * representation (2..1024; default 100); * * loss-level L * The probability above which packets are lost. * (0.0 <= L <= 1.0, default 1.0 i.e. no loss); * * name identifier * Optional a name (listed by "ipfw pipe show") * to identify the distribution; * * "delay prob" | "prob delay" * One of these two lines is mandatory and defines * the format of the following lines with data points. * * XXX YYY * 2 or more lines representing points in the curve, * with either delay or probability first, according * to the chosen format. * The unit for delay is milliseconds. * * Data points does not need to be ordered or equal to the number * specified in the "samples" line. ipfw will sort and interpolate * the curve as needed. * * Example of a profile file: name bla_bla_bla samples 100 loss-level 0.86 prob delay 0 200 # minimum overhead is 200ms 0.5 200 0.5 300 0.8 1000 0.9 1300 1 1300 * Internally, we will convert the curve to a fixed number of * samples, and when it is time to transmit a packet we will * model the extra delay as extra bits in the packet. * */ #define ED_MAX_LINE_LEN 256+ED_MAX_NAME_LEN #define ED_TOK_SAMPLES "samples" #define ED_TOK_LOSS "loss-level" #define ED_TOK_NAME "name" #define ED_TOK_DELAY "delay" #define ED_TOK_PROB "prob" #define ED_TOK_BW "bw" #define ED_SEPARATORS " \t\n" #define ED_MIN_SAMPLES_NO 2 /* * returns 1 if s is a non-negative number, with at least one '.' */ static int is_valid_number(const char *s) { int i, dots_found = 0; int len = strlen(s); for (i = 0; i 1)) return 0; return 1; } /* * Take as input a string describing a bandwidth value * and return the numeric bandwidth value. * set clocking interface or bandwidth value */ static void read_bandwidth(char *arg, int *bandwidth, char *if_name, int namelen) { if (*bandwidth != -1) warnx("duplicate token, override bandwidth value!"); if (arg[0] >= 'a' && arg[0] <= 'z') { if (!if_name) { errx(1, "no if support"); } if (namelen >= IFNAMSIZ) warn("interface name truncated"); namelen--; /* interface name */ strncpy(if_name, arg, namelen); if_name[namelen] = '\0'; *bandwidth = 0; } else { /* read bandwidth value */ int bw; char *end = NULL; bw = strtoul(arg, &end, 0); if (*end == 'K' || *end == 'k') { end++; bw *= 1000; } else if (*end == 'M' || *end == 'm') { end++; bw *= 1000000; } if ((*end == 'B' && _substrcmp2(end, "Bi", "Bit/s") != 0) || _substrcmp2(end, "by", "bytes") == 0) bw *= 8; if (bw < 0) errx(EX_DATAERR, "bandwidth too large"); *bandwidth = bw; if (if_name) if_name[0] = '\0'; } } struct point { double prob; double delay; }; static int compare_points(const void *vp1, const void *vp2) { const struct point *p1 = vp1; const struct point *p2 = vp2; double res = 0; res = p1->prob - p2->prob; if (res == 0) res = p1->delay - p2->delay; if (res < 0) return -1; else if (res > 0) return 1; else return 0; } #define ED_EFMT(s) EX_DATAERR,"error in %s at line %d: "#s,filename,lineno /* * Interpolate a set of proability-value tuples. * * This function takes as input a tuple of values * and samples the interpolated curve described from the tuples. * * The user defined points are stored in the ponts structure. * The number of points is stored in points_no. * The user defined sampling value is stored in samples_no. * The resulting samples are in the "samples" pointer. * * We assume that The last point for the '1' value of the * probability should be defined. (XXX add checks for this) * * The input data are points and points_no. * The output data are s (the array of s_no samples) * and s_no (the number of samples) * */ static void interpolate_samples(struct point *p, int points_no, int *samples, int samples_no, const char *filename) { double dy; /* delta on the y axis */ double y; /* current value of y */ double x; /* current value of x */ double m; /* the y slope */ int i; /* samples index */ int curr; /* points current index */ /* make sure that there are enough points. */ /* XXX Duplicated should be removed */ if (points_no < 3) errx(EX_DATAERR, "%s too few samples, need at least %d", filename, 3); qsort(p, points_no, sizeof(struct point), compare_points); dy = 1.0/samples_no; y = 0; for (i=0, curr = 0; i < samples_no; i++, y+=dy) { /* This statment move the curr pointer to the next point * skipping the points with the same x value. We are * guaranteed to exit from the loop because the * last possible value of y is stricly less than 1 * and the last possible value of the y points is 1 */ while ( y >= p[curr+1].prob ) curr++; /* compute the slope of the curve */ m = (p[curr+1].delay - p[curr].delay) / (p[curr+1].prob - p[curr].prob); /* compute the x value starting from the current point */ x = p[curr].delay + (y - p[curr].prob) * m; samples[i] = x; } /* add the last sample */ samples[i] = p[curr+1].delay; } /* * p is the link (old pipe) * pf is the profile */ static void load_extra_delays(const char *filename, struct dn_profile *p, struct dn_link *link) { char line[ED_MAX_LINE_LEN]; FILE *f; int lineno = 0; int samples = -1; double loss = -1.0; char profile_name[ED_MAX_NAME_LEN]; int delay_first = -1; int do_points = 0; struct point points[ED_MAX_SAMPLES_NO]; int points_no = 0; /* XXX link never NULL? */ p->link_nr = link->link_nr; profile_name[0] = '\0'; f = fopen(filename, "r"); if (f == NULL) err(EX_UNAVAILABLE, "fopen: %s", filename); while (fgets(line, ED_MAX_LINE_LEN, f)) { /* read commands */ char *s, *cur = line, *name = NULL, *arg = NULL; ++lineno; /* parse the line */ while (cur) { s = strsep(&cur, ED_SEPARATORS); if (s == NULL || *s == '#') break; if (*s == '\0') continue; if (arg) errx(ED_EFMT("too many arguments")); if (name == NULL) name = s; else arg = s; } if ((name == NULL) || (*name == '#')) /* empty line */ continue; if (arg == NULL) errx(ED_EFMT("missing arg for %s"), name); if (!strcasecmp(name, ED_TOK_SAMPLES)) { if (samples > 0) errx(ED_EFMT("duplicate ``samples'' line")); if (atoi(arg) <=0) errx(ED_EFMT("invalid number of samples")); samples = atoi(arg); if (samples>=ED_MAX_SAMPLES_NO-1) errx(ED_EFMT("too many samples, maximum is %d"), ED_MAX_SAMPLES_NO-1); do_points = 0; } else if (!strcasecmp(name, ED_TOK_BW)) { char buf[IFNAMSIZ]; read_bandwidth(arg, &link->bandwidth, buf, sizeof(buf)); p->bandwidth = link->bandwidth; } else if (!strcasecmp(name, ED_TOK_LOSS)) { if (loss != -1.0) errx(ED_EFMT("duplicated token: %s"), name); if (!is_valid_number(arg)) errx(ED_EFMT("invalid %s"), arg); loss = atof(arg); if (loss > 1) errx(ED_EFMT("%s greater than 1.0"), name); do_points = 0; } else if (!strcasecmp(name, ED_TOK_NAME)) { if (profile_name[0] != '\0') errx(ED_EFMT("duplicated token: %s"), name); strncpy(profile_name, arg, sizeof(profile_name) - 1); profile_name[sizeof(profile_name)-1] = '\0'; do_points = 0; } else if (!strcasecmp(name, ED_TOK_DELAY)) { if (do_points) errx(ED_EFMT("duplicated token: %s"), name); delay_first = 1; do_points = 1; } else if (!strcasecmp(name, ED_TOK_PROB)) { if (do_points) errx(ED_EFMT("duplicated token: %s"), name); delay_first = 0; do_points = 1; } else if (do_points) { if (!is_valid_number(name) || !is_valid_number(arg)) errx(ED_EFMT("invalid point found")); if (delay_first) { points[points_no].delay = atof(name); points[points_no].prob = atof(arg); } else { points[points_no].delay = atof(arg); points[points_no].prob = atof(name); } if (points[points_no].prob > 1.0) errx(ED_EFMT("probability greater than 1.0")); ++points_no; } else { errx(ED_EFMT("unrecognised command '%s'"), name); } } fclose (f); if (samples == -1) { warnx("'%s' not found, assuming 100", ED_TOK_SAMPLES); samples = 100; } if (loss == -1.0) { warnx("'%s' not found, assuming no loss", ED_TOK_LOSS); loss = 1; } interpolate_samples(points, points_no, p->samples, samples, filename); p->samples_no = samples++; p->loss_level = loss * samples; strncpy(p->name, profile_name, sizeof(p->name)); } /* * configuration of pipes, schedulers, flowsets. * When we configure a new scheduler, an empty pipe is created, so: * * do_pipe = 1 -> "pipe N config ..." only for backward compatibility * sched N+Delta type fifo sched_mask ... * pipe N+Delta * flowset N+Delta pipe N+Delta (no parameters) * sched N type wf2q+ sched_mask ... * pipe N * * do_pipe = 2 -> flowset N config * flowset N parameters * * do_pipe = 3 -> sched N config * sched N parameters (default no pipe) * optional Pipe N config ... * pipe ==> */ void ipfw_config_pipe(int ac, char **av) { int i; u_int j; char *end; void *par = NULL; struct dn_id *buf, *base; struct dn_sch *sch = NULL; struct dn_link *p = NULL; struct dn_fs *fs = NULL; struct dn_profile *pf = NULL; struct ipfw_flow_id *mask = NULL; int lmax; uint32_t _foo = 0, *flags = &_foo , *buckets = &_foo; size_t max_pf_size = sizeof(struct dn_profile) + ED_MAX_SAMPLES_NO * sizeof(int); /* * allocate space for 1 header, * 1 scheduler, 1 link, 1 flowset, 1 profile */ lmax = sizeof(struct dn_id); /* command header */ lmax += sizeof(struct dn_sch) + sizeof(struct dn_link) + sizeof(struct dn_fs); lmax += max_pf_size; av++; ac--; /* Pipe number */ if (ac && isdigit(**av)) { i = atoi(*av); av++; ac--; } else i = -1; if (i <= 0) errx(EX_USAGE, "need a pipe/flowset/sched number"); base = buf = safe_calloc(1, lmax); /* all commands start with a 'CONFIGURE' and a version */ o_next(&buf, sizeof(struct dn_id), DN_CMD_CONFIG); base->id = DN_API_VERSION; switch (co.do_pipe) { case 1: /* "pipe N config ..." */ /* Allocate space for the WF2Q+ scheduler, its link * and the FIFO flowset. Set the number, but leave * the scheduler subtype and other parameters to 0 * so the kernel will use appropriate defaults. * XXX todo: add a flag to record if a parameter * is actually configured. * If we do a 'pipe config' mask -> sched_mask. * The FIFO scheduler and link are derived from the * WF2Q+ one in the kernel. */ sch = o_next(&buf, sizeof(*sch), DN_SCH); p = o_next(&buf, sizeof(*p), DN_LINK); fs = o_next(&buf, sizeof(*fs), DN_FS); sch->sched_nr = i; sch->oid.subtype = 0; /* defaults to WF2Q+ */ mask = &sch->sched_mask; flags = &sch->flags; buckets = &sch->buckets; *flags |= DN_PIPE_CMD; p->link_nr = i; /* This flowset is only for the FIFO scheduler */ fs->fs_nr = i + 2*DN_MAX_ID; fs->sched_nr = i + DN_MAX_ID; break; case 2: /* "queue N config ... " */ fs = o_next(&buf, sizeof(*fs), DN_FS); fs->fs_nr = i; mask = &fs->flow_mask; flags = &fs->flags; buckets = &fs->buckets; break; case 3: /* "sched N config ..." */ sch = o_next(&buf, sizeof(*sch), DN_SCH); fs = o_next(&buf, sizeof(*fs), DN_FS); sch->sched_nr = i; mask = &sch->sched_mask; flags = &sch->flags; buckets = &sch->buckets; /* fs is used only with !MULTIQUEUE schedulers */ fs->fs_nr = i + DN_MAX_ID; fs->sched_nr = i; break; } /* set to -1 those fields for which we want to reuse existing * values from the kernel. * Also, *_nr and subtype = 0 mean reuse the value from the kernel. * XXX todo: support reuse of the mask. */ if (p) p->bandwidth = -1; for (j = 0; j < sizeof(fs->par)/sizeof(fs->par[0]); j++) fs->par[j] = -1; while (ac > 0) { double d; int tok = match_token(dummynet_params, *av); ac--; av++; switch(tok) { case TOK_NOERROR: NEED(fs, "noerror is only for pipes"); fs->flags |= DN_NOERROR; break; case TOK_PLR: NEED(fs, "plr is only for pipes"); NEED1("plr needs argument 0..1\n"); d = strtod(av[0], NULL); if (d > 1) d = 1; else if (d < 0) d = 0; fs->plr = (int)(d*0x7fffffff); ac--; av++; break; case TOK_QUEUE: NEED(fs, "queue is only for pipes or flowsets"); NEED1("queue needs queue size\n"); end = NULL; fs->qsize = strtoul(av[0], &end, 0); if (*end == 'K' || *end == 'k') { fs->flags |= DN_QSIZE_BYTES; fs->qsize *= 1024; } else if (*end == 'B' || _substrcmp2(end, "by", "bytes") == 0) { fs->flags |= DN_QSIZE_BYTES; } ac--; av++; break; case TOK_BUCKETS: NEED(fs, "buckets is only for pipes or flowsets"); NEED1("buckets needs argument\n"); *buckets = strtoul(av[0], NULL, 0); ac--; av++; break; case TOK_FLOW_MASK: case TOK_SCHED_MASK: case TOK_MASK: NEED(mask, "tok_mask"); NEED1("mask needs mask specifier\n"); /* * per-flow queue, mask is dst_ip, dst_port, * src_ip, src_port, proto measured in bits */ par = NULL; bzero(mask, sizeof(*mask)); end = NULL; while (ac >= 1) { uint32_t *p32 = NULL; uint16_t *p16 = NULL; uint32_t *p20 = NULL; struct in6_addr *pa6 = NULL; uint32_t a; tok = match_token(dummynet_params, *av); ac--; av++; switch(tok) { case TOK_ALL: /* * special case, all bits significant * except 'extra' (the queue number) */ mask->dst_ip = ~0; mask->src_ip = ~0; mask->dst_port = ~0; mask->src_port = ~0; mask->proto = ~0; n2mask(&mask->dst_ip6, 128); n2mask(&mask->src_ip6, 128); mask->flow_id6 = ~0; *flags |= DN_HAVE_MASK; goto end_mask; case TOK_QUEUE: mask->extra = ~0; *flags |= DN_HAVE_MASK; goto end_mask; case TOK_DSTIP: mask->addr_type = 4; p32 = &mask->dst_ip; break; case TOK_SRCIP: mask->addr_type = 4; p32 = &mask->src_ip; break; case TOK_DSTIP6: mask->addr_type = 6; pa6 = &mask->dst_ip6; break; case TOK_SRCIP6: mask->addr_type = 6; pa6 = &mask->src_ip6; break; case TOK_FLOWID: mask->addr_type = 6; p20 = &mask->flow_id6; break; case TOK_DSTPORT: p16 = &mask->dst_port; break; case TOK_SRCPORT: p16 = &mask->src_port; break; case TOK_PROTO: break; default: ac++; av--; /* backtrack */ goto end_mask; } if (ac < 1) errx(EX_USAGE, "mask: value missing"); if (*av[0] == '/') { a = strtoul(av[0]+1, &end, 0); if (pa6 == NULL) a = (a == 32) ? ~0 : (1 << a) - 1; } else a = strtoul(av[0], &end, 0); if (p32 != NULL) *p32 = a; else if (p16 != NULL) { if (a > 0xFFFF) errx(EX_DATAERR, "port mask must be 16 bit"); *p16 = (uint16_t)a; } else if (p20 != NULL) { if (a > 0xfffff) errx(EX_DATAERR, "flow_id mask must be 20 bit"); *p20 = (uint32_t)a; } else if (pa6 != NULL) { if (a > 128) errx(EX_DATAERR, "in6addr invalid mask len"); else n2mask(pa6, a); } else { if (a > 0xFF) errx(EX_DATAERR, "proto mask must be 8 bit"); mask->proto = (uint8_t)a; } if (a != 0) *flags |= DN_HAVE_MASK; ac--; av++; } /* end while, config masks */ end_mask: break; case TOK_RED: case TOK_GRED: NEED1("red/gred needs w_q/min_th/max_th/max_p\n"); fs->flags |= DN_IS_RED; if (tok == TOK_GRED) fs->flags |= DN_IS_GENTLE_RED; /* * the format for parameters is w_q/min_th/max_th/max_p */ if ((end = strsep(&av[0], "/"))) { double w_q = strtod(end, NULL); if (w_q > 1 || w_q <= 0) errx(EX_DATAERR, "0 < w_q <= 1"); fs->w_q = (int) (w_q * (1 << SCALE_RED)); } if ((end = strsep(&av[0], "/"))) { fs->min_th = strtoul(end, &end, 0); if (*end == 'K' || *end == 'k') fs->min_th *= 1024; } if ((end = strsep(&av[0], "/"))) { fs->max_th = strtoul(end, &end, 0); if (*end == 'K' || *end == 'k') fs->max_th *= 1024; } if ((end = strsep(&av[0], "/"))) { double max_p = strtod(end, NULL); if (max_p > 1 || max_p <= 0) errx(EX_DATAERR, "0 < max_p <= 1"); fs->max_p = (int)(max_p * (1 << SCALE_RED)); } ac--; av++; break; case TOK_DROPTAIL: NEED(fs, "droptail is only for flowsets"); fs->flags &= ~(DN_IS_RED|DN_IS_GENTLE_RED); break; case TOK_BW: NEED(p, "bw is only for links"); NEED1("bw needs bandwidth or interface\n"); read_bandwidth(av[0], &p->bandwidth, NULL, 0); ac--; av++; break; case TOK_DELAY: NEED(p, "delay is only for links"); NEED1("delay needs argument 0..10000ms\n"); p->delay = strtoul(av[0], NULL, 0); ac--; av++; break; case TOK_TYPE: { int l; NEED(sch, "type is only for schedulers"); NEED1("type needs a string"); l = strlen(av[0]); if (l == 0 || l > 15) errx(1, "type %s too long\n", av[0]); strcpy(sch->name, av[0]); sch->oid.subtype = 0; /* use string */ ac--; av++; break; } case TOK_WEIGHT: NEED(fs, "weight is only for flowsets"); NEED1("weight needs argument\n"); fs->par[0] = strtol(av[0], &end, 0); ac--; av++; break; case TOK_LMAX: NEED(fs, "lmax is only for flowsets"); NEED1("lmax needs argument\n"); fs->par[1] = strtol(av[0], &end, 0); ac--; av++; break; case TOK_PRI: NEED(fs, "priority is only for flowsets"); NEED1("priority needs argument\n"); fs->par[2] = strtol(av[0], &end, 0); ac--; av++; break; case TOK_SCHED: case TOK_PIPE: NEED(fs, "pipe/sched"); NEED1("pipe/link/sched needs number\n"); fs->sched_nr = strtoul(av[0], &end, 0); ac--; av++; break; case TOK_PROFILE: { size_t real_length; NEED((!pf), "profile already set"); NEED(p, "profile"); NEED1("extra delay needs the file name\n"); /* load the profile structure using the DN_API */ pf = o_next(&buf, max_pf_size, DN_PROFILE); load_extra_delays(av[0], pf, p); //XXX can't fail? /* compact the dn_id structure */ real_length = sizeof(struct dn_profile) + pf->samples_no * sizeof(int); o_compact(&buf, max_pf_size, real_length, DN_PROFILE); --ac; ++av; } break; case TOK_BURST: NEED(p, "burst"); NEED1("burst needs argument\n"); errno = 0; if (expand_number(av[0], (int64_t *)&p->burst) < 0) if (errno != ERANGE) errx(EX_DATAERR, "burst: invalid argument"); if (errno || p->burst > (1ULL << 48) - 1) errx(EX_DATAERR, "burst: out of range (0..2^48-1)"); ac--; av++; break; default: errx(EX_DATAERR, "unrecognised option ``%s''", av[-1]); } } /* check validity of parameters */ if (p) { if (p->delay > 10000) errx(EX_DATAERR, "delay must be < 10000"); if (p->bandwidth == -1) p->bandwidth = 0; } if (fs) { /* XXX accept a 0 scheduler to keep the default */ if (fs->flags & DN_QSIZE_BYTES) { size_t len; long limit; len = sizeof(limit); if (sysctlbyname("net.inet.ip.dummynet.pipe_byte_limit", &limit, &len, NULL, 0) == -1) limit = 1024*1024; if (fs->qsize > limit) errx(EX_DATAERR, "queue size must be < %ldB", limit); } else { size_t len; long limit; len = sizeof(limit); if (sysctlbyname("net.inet.ip.dummynet.pipe_slot_limit", &limit, &len, NULL, 0) == -1) limit = 100; if (fs->qsize > limit) errx(EX_DATAERR, "2 <= queue size <= %ld", limit); } if (fs->flags & DN_IS_RED) { size_t len; int lookup_depth, avg_pkt_size; double w_q; if (fs->min_th >= fs->max_th) errx(EX_DATAERR, "min_th %d must be < than max_th %d", fs->min_th, fs->max_th); if (fs->max_th == 0) errx(EX_DATAERR, "max_th must be > 0"); len = sizeof(int); if (sysctlbyname("net.inet.ip.dummynet.red_lookup_depth", &lookup_depth, &len, NULL, 0) == -1) lookup_depth = 256; if (lookup_depth == 0) errx(EX_DATAERR, "net.inet.ip.dummynet.red_lookup_depth" " must be greater than zero"); len = sizeof(int); if (sysctlbyname("net.inet.ip.dummynet.red_avg_pkt_size", &avg_pkt_size, &len, NULL, 0) == -1) avg_pkt_size = 512; if (avg_pkt_size == 0) errx(EX_DATAERR, "net.inet.ip.dummynet.red_avg_pkt_size must" " be greater than zero"); /* * Ticks needed for sending a medium-sized packet. * Unfortunately, when we are configuring a WF2Q+ queue, we * do not have bandwidth information, because that is stored * in the parent pipe, and also we have multiple queues * competing for it. So we set s=0, which is not very * correct. But on the other hand, why do we want RED with * WF2Q+ ? */ #if 0 if (p.bandwidth==0) /* this is a WF2Q+ queue */ s = 0; else s = (double)ck.hz * avg_pkt_size * 8 / p.bandwidth; #endif /* * max idle time (in ticks) before avg queue size becomes 0. * NOTA: (3/w_q) is approx the value x so that * (1-w_q)^x < 10^-3. */ w_q = ((double)fs->w_q) / (1 << SCALE_RED); #if 0 // go in kernel idle = s * 3. / w_q; fs->lookup_step = (int)idle / lookup_depth; if (!fs->lookup_step) fs->lookup_step = 1; weight = 1 - w_q; for (t = fs->lookup_step; t > 1; --t) weight *= 1 - w_q; fs->lookup_weight = (int)(weight * (1 << SCALE_RED)); #endif /* code moved in the kernel */ } } i = do_cmd(IP_DUMMYNET3, base, (char *)buf - (char *)base); if (i) err(1, "setsockopt(%s)", "IP_DUMMYNET_CONFIGURE"); } void dummynet_flush(void) { struct dn_id oid; oid_fill(&oid, sizeof(oid), DN_CMD_FLUSH, DN_API_VERSION); do_cmd(IP_DUMMYNET3, &oid, oid.len); } /* Parse input for 'ipfw [pipe|sched|queue] show [range list]' * Returns the number of ranges, and possibly stores them * in the array v of size len. */ static int parse_range(int ac, char *av[], uint32_t *v, int len) { int n = 0; char *endptr, *s; uint32_t base[2]; if (v == NULL || len < 2) { v = base; len = 2; } for (s = *av; s != NULL; av++, ac--) { v[0] = strtoul(s, &endptr, 10); v[1] = (*endptr != '-') ? v[0] : strtoul(endptr+1, &endptr, 10); if (*endptr == '\0') { /* prepare for next round */ s = (ac > 0) ? *(av+1) : NULL; } else { if (*endptr != ',') { warn("invalid number: %s", s); s = ++endptr; continue; } /* continue processing from here */ s = ++endptr; ac++; av--; } if (v[1] < v[0] || v[1] >= DN_MAX_ID-1 || v[1] >= DN_MAX_ID-1) { continue; /* invalid entry */ } n++; /* translate if 'pipe list' */ if (co.do_pipe == 1) { v[0] += DN_MAX_ID; v[1] += DN_MAX_ID; } v = (n*2 < len) ? v + 2 : base; } return n; } /* main entry point for dummynet list functions. co.do_pipe indicates * which function we want to support. * av may contain filtering arguments, either individual entries * or ranges, or lists (space or commas are valid separators). * Format for a range can be n1-n2 or n3 n4 n5 ... * In a range n1 must be <= n2, otherwise the range is ignored. * A number 'n4' is translate in a range 'n4-n4' * All number must be > 0 and < DN_MAX_ID-1 */ void dummynet_list(int ac, char *av[], int show_counters) { struct dn_id *oid, *x = NULL; int ret, i; int n; /* # of ranges */ u_int buflen, l; u_int max_size; /* largest obj passed up */ (void)show_counters; // XXX unused, but we should use it. ac--; av++; /* skip 'list' | 'show' word */ n = parse_range(ac, av, NULL, 0); /* Count # of ranges. */ /* Allocate space to store ranges */ l = sizeof(*oid) + sizeof(uint32_t) * n * 2; oid = safe_calloc(1, l); oid_fill(oid, l, DN_CMD_GET, DN_API_VERSION); if (n > 0) /* store ranges in idx */ parse_range(ac, av, (uint32_t *)(oid + 1), n*2); /* * Compute the size of the largest object returned. If the * response leaves at least this much spare space in the * buffer, then surely the response is complete; otherwise * there might be a risk of truncation and we will need to * retry with a larger buffer. * XXX don't bother with smaller structs. */ max_size = sizeof(struct dn_fs); if (max_size < sizeof(struct dn_sch)) max_size = sizeof(struct dn_sch); if (max_size < sizeof(struct dn_flow)) max_size = sizeof(struct dn_flow); switch (co.do_pipe) { case 1: oid->subtype = DN_LINK; /* list pipe */ break; case 2: oid->subtype = DN_FS; /* list queue */ break; case 3: oid->subtype = DN_SCH; /* list sched */ break; } /* * Ask the kernel an estimate of the required space (result * in oid.id), unless we are requesting a subset of objects, * in which case the kernel does not give an exact answer. * In any case, space might grow in the meantime due to the * creation of new queues, so we must be prepared to retry. */ if (n > 0) { buflen = 4*1024; } else { ret = do_cmd(-IP_DUMMYNET3, oid, (uintptr_t)&l); if (ret != 0 || oid->id <= sizeof(*oid)) goto done; buflen = oid->id + max_size; oid->len = sizeof(*oid); /* restore */ } /* Try a few times, until the buffer fits */ for (i = 0; i < 20; i++) { l = buflen; x = safe_realloc(x, l); bcopy(oid, x, oid->len); ret = do_cmd(-IP_DUMMYNET3, x, (uintptr_t)&l); if (ret != 0 || x->id <= sizeof(*oid)) goto done; /* no response */ if (l + max_size <= buflen) break; /* ok */ buflen *= 2; /* double for next attempt */ } list_pipes(x, O_NEXT(x, l)); done: if (x) free(x); free(oid); } ipfw3-2012/ipfw/qsort.c000644 000423 000000 00000012546 12006744007 015217 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 1992, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)qsort.c 8.1 (Berkeley) 6/4/93"; #endif /* LIBC_SCCS and not lint */ #include __FBSDID("$FreeBSD: src/lib/libc/stdlib/qsort.c,v 1.15 2008/01/14 09:21:34 das Exp $"); #include #ifdef I_AM_QSORT_R typedef int cmp_t(void *, const void *, const void *); #else typedef int cmp_t(const void *, const void *); #endif static inline char *med3(char *, char *, char *, cmp_t *, void *); static inline void swapfunc(char *, char *, int, int); #define min(a, b) (a) < (b) ? a : b /* * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". */ #define swapcode(TYPE, parmi, parmj, n) { \ long i = (n) / sizeof (TYPE); \ TYPE *pi = (TYPE *) (parmi); \ TYPE *pj = (TYPE *) (parmj); \ do { \ TYPE t = *pi; \ *pi++ = *pj; \ *pj++ = t; \ } while (--i > 0); \ } #define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \ es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1; static inline void swapfunc(a, b, n, swaptype) char *a, *b; int n, swaptype; { if(swaptype <= 1) swapcode(long, a, b, n) else swapcode(char, a, b, n) } #define swap(a, b) \ if (swaptype == 0) { \ long t = *(long *)(a); \ *(long *)(a) = *(long *)(b); \ *(long *)(b) = t; \ } else \ swapfunc(a, b, es, swaptype) #define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype) #ifdef I_AM_QSORT_R #define CMP(t, x, y) (cmp((t), (x), (y))) #else #define CMP(t, x, y) (cmp((x), (y))) #endif static inline char * med3(char *a, char *b, char *c, cmp_t *cmp, void *thunk #ifndef I_AM_QSORT_R __unused // XXX what ? #endif ) { return CMP(thunk, a, b) < 0 ? (CMP(thunk, b, c) < 0 ? b : (CMP(thunk, a, c) < 0 ? c : a )) :(CMP(thunk, b, c) > 0 ? b : (CMP(thunk, a, c) < 0 ? a : c )); } #ifdef I_AM_QSORT_R void qsort_r(void *a, size_t n, size_t es, void *thunk, cmp_t *cmp) #else #define thunk NULL void qsort(void *a, size_t n, size_t es, cmp_t *cmp) #endif { char *pa, *pb, *pc, *pd, *pl, *pm, *pn; size_t d, r; int cmp_result; int swaptype, swap_cnt; loop: SWAPINIT(a, es); swap_cnt = 0; if (n < 7) { for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) for (pl = pm; pl > (char *)a && CMP(thunk, pl - es, pl) > 0; pl -= es) swap(pl, pl - es); return; } pm = (char *)a + (n / 2) * es; if (n > 7) { pl = a; pn = (char *)a + (n - 1) * es; if (n > 40) { d = (n / 8) * es; pl = med3(pl, pl + d, pl + 2 * d, cmp, thunk); pm = med3(pm - d, pm, pm + d, cmp, thunk); pn = med3(pn - 2 * d, pn - d, pn, cmp, thunk); } pm = med3(pl, pm, pn, cmp, thunk); } swap(a, pm); pa = pb = (char *)a + es; pc = pd = (char *)a + (n - 1) * es; for (;;) { while (pb <= pc && (cmp_result = CMP(thunk, pb, a)) <= 0) { if (cmp_result == 0) { swap_cnt = 1; swap(pa, pb); pa += es; } pb += es; } while (pb <= pc && (cmp_result = CMP(thunk, pc, a)) >= 0) { if (cmp_result == 0) { swap_cnt = 1; swap(pc, pd); pd -= es; } pc -= es; } if (pb > pc) break; swap(pb, pc); swap_cnt = 1; pb += es; pc -= es; } if (swap_cnt == 0) { /* Switch to insertion sort */ for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) for (pl = pm; pl > (char *)a && CMP(thunk, pl - es, pl) > 0; pl -= es) swap(pl, pl - es); return; } pn = (char *)a + n * es; r = min(pa - (char *)a, pb - pa); vecswap(a, pb - r, r); r = min(pd - pc, pn - pd - es); vecswap(pb, pn - r, r); if ((r = pb - pa) > es) #ifdef I_AM_QSORT_R qsort_r(a, r / es, es, thunk, cmp); #else qsort(a, r / es, es, cmp); #endif if ((r = pd - pc) > es) { /* Iterate rather than recurse to save stack space */ a = pn - r; n = r / es; goto loop; } /* qsort(pn - r, r / es, es, cmp);*/ } ipfw3-2012/ipfw/add_rules000755 000423 000000 00000001056 12006744007 015565 0ustar00luigiwheel000000 000000 #!/bin/bash # # A test script to add rules PRG=./ipfw myfun() { $PRG add 10 count icmp from any to 131.114.9.128 $PRG add 20 count icmp from 131.114.9.128 to any $PRG add 20 count icmp from any to 131.114.9.130 $PRG add 30 count icmp from 131.114.9.130 to any $PRG add 40 count icmp from any to 131.114.9.129 $PRG add 50 count icmp from 131.114.9.129 to any $PRG add 60 count icmp from 131.114.9.236 to any sleep 1 $PRG del 10 $PRG del 20 $PRG del 20 $PRG del 30 $PRG del 40 $PRG del 50 $PRG del 60 } for ((i=0;i<100;i++)) ; do myfun done ipfw3-2012/ipfw/ipv6.c000644 000423 000000 00000031315 12010142067 014717 0ustar00luigiwheel000000 000000 /* * Copyright (c) 2002-2003 Luigi Rizzo * Copyright (c) 1996 Alex Nash, Paul Traina, Poul-Henning Kamp * Copyright (c) 1994 Ugen J.S.Antsilevich * * Idea and grammar partially left from: * Copyright (c) 1993 Daniel Boulet * * Redistribution and use in source forms, with and without modification, * are permitted provided that this entire comment appears intact. * * Redistribution in binary form may occur without any restrictions. * Obviously, it would be nice if you gave credit where credit is due * but requiring it would be too onerous. * * This software is provided ``AS IS'' without any warranties of any kind. * * NEW command line interface for IP firewall facility * * $FreeBSD: user/luigi/ipfw3-head/sbin/ipfw/ipv6.c 187770 2009-01-27 12:01:30Z luigi $ * * ipv6 support */ #include #include #include "ipfw2.h" #include #include #include #include #include #include #include #include #include #include #include #include #include static struct _s_x icmp6codes[] = { { "no-route", ICMP6_DST_UNREACH_NOROUTE }, { "admin-prohib", ICMP6_DST_UNREACH_ADMIN }, { "address", ICMP6_DST_UNREACH_ADDR }, { "port", ICMP6_DST_UNREACH_NOPORT }, { NULL, 0 } }; void fill_unreach6_code(u_short *codep, char *str) { int val; char *s; val = strtoul(str, &s, 0); if (s == str || *s != '\0' || val >= 0x100) val = match_token(icmp6codes, str); if (val < 0) errx(EX_DATAERR, "unknown ICMPv6 unreachable code ``%s''", str); *codep = val; return; } void print_unreach6_code(uint16_t code) { char const *s = match_value(icmp6codes, code); if (s != NULL) printf("unreach6 %s", s); else printf("unreach6 %u", code); } /* * Print the ip address contained in a command. */ void print_ip6(ipfw_insn_ip6 *cmd, char const *s) { struct hostent *he = NULL; int len = F_LEN((ipfw_insn *) cmd) - 1; struct in6_addr *a = &(cmd->addr6); char trad[255]; printf("%s%s ", cmd->o.len & F_NOT ? " not": "", s); if (cmd->o.opcode == O_IP6_SRC_ME || cmd->o.opcode == O_IP6_DST_ME) { printf("me6"); return; } if (cmd->o.opcode == O_IP6) { printf(" ip6"); return; } /* * len == 4 indicates a single IP, whereas lists of 1 or more * addr/mask pairs have len = (2n+1). We convert len to n so we * use that to count the number of entries. */ for (len = len / 4; len > 0; len -= 2, a += 2) { int mb = /* mask length */ (cmd->o.opcode == O_IP6_SRC || cmd->o.opcode == O_IP6_DST) ? 128 : contigmask((uint8_t *)&(a[1]), 128); if (mb == 128 && co.do_resolv) he = gethostbyaddr((char *)a, sizeof(*a), AF_INET6); if (he != NULL) /* resolved to name */ printf("%s", he->h_name); else if (mb == 0) /* any */ printf("any"); else { /* numeric IP followed by some kind of mask */ if (inet_ntop(AF_INET6, a, trad, sizeof( trad ) ) == NULL) printf("Error ntop in print_ip6\n"); printf("%s", trad ); if (mb < 0) /* XXX not really legal... */ printf(":%s", inet_ntop(AF_INET6, &a[1], trad, sizeof(trad))); else if (mb < 128) printf("/%d", mb); } if (len > 2) printf(","); } } void fill_icmp6types(ipfw_insn_icmp6 *cmd, char *av) { uint8_t type; bzero(cmd, sizeof(*cmd)); while (*av) { if (*av == ',') av++; type = strtoul(av, &av, 0); if (*av != ',' && *av != '\0') errx(EX_DATAERR, "invalid ICMP6 type"); /* * XXX: shouldn't this be 0xFF? I can't see any reason why * we shouldn't be able to filter all possiable values * regardless of the ability of the rest of the kernel to do * anything useful with them. */ if (type > ICMP6_MAXTYPE) errx(EX_DATAERR, "ICMP6 type out of range"); cmd->d[type / 32] |= ( 1 << (type % 32)); } cmd->o.opcode = O_ICMP6TYPE; cmd->o.len |= F_INSN_SIZE(ipfw_insn_icmp6); } void print_icmp6types(ipfw_insn_u32 *cmd) { int i, j; char sep= ' '; printf(" ip6 icmp6types"); for (i = 0; i < 7; i++) for (j=0; j < 32; ++j) { if ( (cmd->d[i] & (1 << (j))) == 0) continue; printf("%c%d", sep, (i*32 + j)); sep = ','; } } void print_flow6id( ipfw_insn_u32 *cmd) { uint16_t i, limit = cmd->o.arg1; char sep = ','; printf(" flow-id "); for( i=0; i < limit; ++i) { if (i == limit - 1) sep = ' '; printf("%d%c", cmd->d[i], sep); } } /* structure and define for the extension header in ipv6 */ static struct _s_x ext6hdrcodes[] = { { "frag", EXT_FRAGMENT }, { "hopopt", EXT_HOPOPTS }, { "route", EXT_ROUTING }, { "dstopt", EXT_DSTOPTS }, { "ah", EXT_AH }, { "esp", EXT_ESP }, { "rthdr0", EXT_RTHDR0 }, { "rthdr2", EXT_RTHDR2 }, { NULL, 0 } }; /* fills command for the extension header filtering */ int fill_ext6hdr( ipfw_insn *cmd, char *av) { int tok; char *s = av; cmd->arg1 = 0; while(s) { av = strsep( &s, ",") ; tok = match_token(ext6hdrcodes, av); switch (tok) { case EXT_FRAGMENT: cmd->arg1 |= EXT_FRAGMENT; break; case EXT_HOPOPTS: cmd->arg1 |= EXT_HOPOPTS; break; case EXT_ROUTING: cmd->arg1 |= EXT_ROUTING; break; case EXT_DSTOPTS: cmd->arg1 |= EXT_DSTOPTS; break; case EXT_AH: cmd->arg1 |= EXT_AH; break; case EXT_ESP: cmd->arg1 |= EXT_ESP; break; case EXT_RTHDR0: cmd->arg1 |= EXT_RTHDR0; break; case EXT_RTHDR2: cmd->arg1 |= EXT_RTHDR2; break; default: errx( EX_DATAERR, "invalid option for ipv6 exten header" ); break; } } if (cmd->arg1 == 0 ) return 0; cmd->opcode = O_EXT_HDR; cmd->len |= F_INSN_SIZE( ipfw_insn ); return 1; } void print_ext6hdr( ipfw_insn *cmd ) { char sep = ' '; printf(" extension header:"); if (cmd->arg1 & EXT_FRAGMENT ) { printf("%cfragmentation", sep); sep = ','; } if (cmd->arg1 & EXT_HOPOPTS ) { printf("%chop options", sep); sep = ','; } if (cmd->arg1 & EXT_ROUTING ) { printf("%crouting options", sep); sep = ','; } if (cmd->arg1 & EXT_RTHDR0 ) { printf("%crthdr0", sep); sep = ','; } if (cmd->arg1 & EXT_RTHDR2 ) { printf("%crthdr2", sep); sep = ','; } if (cmd->arg1 & EXT_DSTOPTS ) { printf("%cdestination options", sep); sep = ','; } if (cmd->arg1 & EXT_AH ) { printf("%cauthentication header", sep); sep = ','; } if (cmd->arg1 & EXT_ESP ) { printf("%cencapsulated security payload", sep); } } /* Try to find ipv6 address by hostname */ static int lookup_host6 (char *host, struct in6_addr *ip6addr) { struct hostent *he; if (!inet_pton(AF_INET6, host, ip6addr)) { if ((he = gethostbyname2(host, AF_INET6)) == NULL) return(-1); memcpy(ip6addr, he->h_addr_list[0], sizeof( struct in6_addr)); } return(0); } /* * fill the addr and mask fields in the instruction as appropriate from av. * Update length as appropriate. * The following formats are allowed: * any matches any IP6. Actually returns an empty instruction. * me returns O_IP6_*_ME * * 03f1::234:123:0342 single IP6 addres * 03f1::234:123:0342/24 address/mask * 03f1::234:123:0342/24,03f1::234:123:0343/ List of address * * Set of address (as in ipv6) not supported because ipv6 address * are typically random past the initial prefix. * Return 1 on success, 0 on failure. */ static int fill_ip6(ipfw_insn_ip6 *cmd, char *av) { int len = 0; struct in6_addr *d = &(cmd->addr6); /* * Needed for multiple address. * Note d[1] points to struct in6_add r mask6 of cmd */ cmd->o.len &= ~F_LEN_MASK; /* zero len */ if (strcmp(av, "any") == 0) return (1); if (strcmp(av, "me") == 0) { /* Set the data for "me" opt*/ cmd->o.len |= F_INSN_SIZE(ipfw_insn); return (1); } if (strcmp(av, "me6") == 0) { /* Set the data for "me" opt*/ cmd->o.len |= F_INSN_SIZE(ipfw_insn); return (1); } av = strdup(av); while (av) { /* * After the address we can have '/' indicating a mask, * or ',' indicating another address follows. */ char *p; int masklen; char md = '\0'; if ((p = strpbrk(av, "/,")) ) { md = *p; /* save the separator */ *p = '\0'; /* terminate address string */ p++; /* and skip past it */ } /* now p points to NULL, mask or next entry */ /* lookup stores address in *d as a side effect */ if (lookup_host6(av, d) != 0) { /* XXX: failed. Free memory and go */ errx(EX_DATAERR, "bad address \"%s\"", av); } /* next, look at the mask, if any */ masklen = (md == '/') ? atoi(p) : 128; if (masklen > 128 || masklen < 0) errx(EX_DATAERR, "bad width \"%s\''", p); else n2mask(&d[1], masklen); APPLY_MASK(d, &d[1]) /* mask base address with mask */ /* find next separator */ if (md == '/') { /* find separator past the mask */ p = strpbrk(p, ","); if (p != NULL) p++; } av = p; /* Check this entry */ if (masklen == 0) { /* * 'any' turns the entire list into a NOP. * 'not any' never matches, so it is removed from the * list unless it is the only item, in which case we * report an error. */ if (cmd->o.len & F_NOT && av == NULL && len == 0) errx(EX_DATAERR, "not any never matches"); continue; } /* * A single IP can be stored alone */ if (masklen == 128 && av == NULL && len == 0) { len = F_INSN_SIZE(struct in6_addr); break; } /* Update length and pointer to arguments */ len += F_INSN_SIZE(struct in6_addr)*2; d += 2; } /* end while */ /* * Total length of the command, remember that 1 is the size of * the base command. */ if (len + 1 > F_LEN_MASK) errx(EX_DATAERR, "address list too long"); cmd->o.len |= len+1; free(av); return (1); } /* * fills command for ipv6 flow-id filtering * note that the 20 bit flow number is stored in a array of u_int32_t * it's supported lists of flow-id, so in the o.arg1 we store how many * additional flow-id we want to filter, the basic is 1 */ void fill_flow6( ipfw_insn_u32 *cmd, char *av ) { u_int32_t type; /* Current flow number */ u_int16_t nflow = 0; /* Current flow index */ char *s = av; cmd->d[0] = 0; /* Initializing the base number*/ while (s) { av = strsep( &s, ",") ; type = strtoul(av, &av, 0); if (*av != ',' && *av != '\0') errx(EX_DATAERR, "invalid ipv6 flow number %s", av); if (type > 0xfffff) errx(EX_DATAERR, "flow number out of range %s", av); cmd->d[nflow] |= type; nflow++; } if( nflow > 0 ) { cmd->o.opcode = O_FLOW6ID; cmd->o.len |= F_INSN_SIZE(ipfw_insn_u32) + nflow; cmd->o.arg1 = nflow; } else { errx(EX_DATAERR, "invalid ipv6 flow number %s", av); } } ipfw_insn * add_srcip6(ipfw_insn *cmd, char *av) { fill_ip6((ipfw_insn_ip6 *)cmd, av); if (F_LEN(cmd) == 0) { /* any */ } else if (F_LEN(cmd) == F_INSN_SIZE(ipfw_insn)) { /* "me" */ cmd->opcode = O_IP6_SRC_ME; } else if (F_LEN(cmd) == (F_INSN_SIZE(struct in6_addr) + F_INSN_SIZE(ipfw_insn))) { /* single IP, no mask*/ cmd->opcode = O_IP6_SRC; } else { /* addr/mask opt */ cmd->opcode = O_IP6_SRC_MASK; } return cmd; } ipfw_insn * add_dstip6(ipfw_insn *cmd, char *av) { fill_ip6((ipfw_insn_ip6 *)cmd, av); if (F_LEN(cmd) == 0) { /* any */ } else if (F_LEN(cmd) == F_INSN_SIZE(ipfw_insn)) { /* "me" */ cmd->opcode = O_IP6_DST_ME; } else if (F_LEN(cmd) == (F_INSN_SIZE(struct in6_addr) + F_INSN_SIZE(ipfw_insn))) { /* single IP, no mask*/ cmd->opcode = O_IP6_DST; } else { /* addr/mask opt */ cmd->opcode = O_IP6_DST_MASK; } return cmd; } ipfw3-2012/ipfw/main.c000644 000423 000000 00000037106 12010143727 014767 0ustar00luigiwheel000000 000000 /* * Copyright (c) 2002-2003,2010 Luigi Rizzo * Copyright (c) 1996 Alex Nash, Paul Traina, Poul-Henning Kamp * Copyright (c) 1994 Ugen J.S.Antsilevich * * Idea and grammar partially left from: * Copyright (c) 1993 Daniel Boulet * * Redistribution and use in source forms, with and without modification, * are permitted provided that this entire comment appears intact. * * Redistribution in binary form may occur without any restrictions. * Obviously, it would be nice if you gave credit where credit is due * but requiring it would be too onerous. * * This software is provided ``AS IS'' without any warranties of any kind. * * Command line interface for IP firewall facility * * $FreeBSD: head/sbin/ipfw/main.c 206494 2010-04-12 08:27:53Z luigi $ */ #include #include #include #include #include #include #include #include #include #include #include "ipfw2.h" static void help(void) { fprintf(stderr, "ipfw syntax summary (but please do read the ipfw(8) manpage):\n\n" "\tipfw [-abcdefhnNqStTv] \n\n" "where is one of the following:\n\n" "add [num] [set N] [prob x] RULE-BODY\n" "{pipe|queue} N config PIPE-BODY\n" "[pipe|queue] {zero|delete|show} [N{,N}]\n" "nat N config {ip IPADDR|if IFNAME|log|deny_in|same_ports|unreg_only|reset|\n" " reverse|proxy_only|redirect_addr linkspec|\n" " redirect_port linkspec|redirect_proto linkspec}\n" "set [disable N... enable N...] | move [rule] X to Y | swap X Y | show\n" "set N {show|list|zero|resetlog|delete} [N{,N}] | flush\n" "table N {add ip[/bits] [value] | delete ip[/bits] | flush | list}\n" "table all {flush | list}\n" "\n" "RULE-BODY: check-state [PARAMS] | ACTION [PARAMS] ADDR [OPTION_LIST]\n" "ACTION: check-state | allow | count | deny | unreach{,6} CODE |\n" " skipto N | {divert|tee} PORT | forward ADDR |\n" " pipe N | queue N | nat N | setfib FIB | reass\n" "PARAMS: [log [logamount LOGLIMIT]] [altq QUEUE_NAME]\n" "ADDR: [ MAC dst src ether_type ] \n" " [ ip from IPADDR [ PORT ] to IPADDR [ PORTLIST ] ]\n" " [ ipv6|ip6 from IP6ADDR [ PORT ] to IP6ADDR [ PORTLIST ] ]\n" "IPADDR: [not] { any | me | ip/bits{x,y,z} | table(t[,v]) | IPLIST }\n" "IP6ADDR: [not] { any | me | me6 | ip6/bits | IP6LIST }\n" "IP6LIST: { ip6 | ip6/bits }[,IP6LIST]\n" "IPLIST: { ip | ip/bits | ip:mask }[,IPLIST]\n" "OPTION_LIST: OPTION [OPTION_LIST]\n" "OPTION: bridged | diverted | diverted-loopback | diverted-output |\n" " {dst-ip|src-ip} IPADDR | {dst-ip6|src-ip6|dst-ipv6|src-ipv6} IP6ADDR |\n" " {dst-port|src-port} LIST |\n" " estab | frag | {gid|uid} N | icmptypes LIST | in | out | ipid LIST |\n" " iplen LIST | ipoptions SPEC | ipprecedence | ipsec | iptos SPEC |\n" " ipttl LIST | ipversion VER | keep-state | layer2 | limit ... |\n" " icmp6types LIST | ext6hdr LIST | flow-id N[,N] | fib FIB |\n" " mac ... | mac-type LIST | proto LIST | {recv|xmit|via} {IF|IPADDR} |\n" " setup | {tcpack|tcpseq|tcpwin} NN | tcpflags SPEC | tcpoptions SPEC |\n" " tcpdatalen LIST | verrevpath | versrcreach | antispoof\n" ); exit(0); } /* * Called with the arguments, including program name because getopt * wants it to be present. * Returns 0 if successful, 1 if empty command, errx() in case of errors. * First thing we do is process parameters creating an argv[] array * which includes the program name and a NULL entry at the end. * If we are called with a single string, we split it on whitespace. * Also, arguments with a trailing ',' are joined to the next one. * The pointers (av[]) and data are in a single chunk of memory. * av[0] points to the original program name, all other entries * point into the allocated chunk. */ static int ipfw_main(int oldac, char **oldav) { int ch, ac; const char *errstr; char **av, **save_av; int do_acct = 0; /* Show packet/byte count */ int try_next = 0; /* set if pipe cmd not found */ int av_size; /* compute the av size */ char *av_p; /* used to build the av list */ #define WHITESP " \t\f\v\n\r" if (oldac < 2) return 1; /* need at least one argument */ if (oldac == 2) { /* * If we are called with one argument, try to split it into * words for subsequent parsing. Spaces after a ',' are * removed by copying the string in-place. */ char *arg = oldav[1]; /* The string is the first arg. */ int l = strlen(arg); int copy = 0; /* 1 if we need to copy, 0 otherwise */ int i, j; for (i = j = 0; i < l; i++) { if (arg[i] == '#') /* comment marker */ break; if (copy) { arg[j++] = arg[i]; copy = !strchr("," WHITESP, arg[i]); } else { copy = !strchr(WHITESP, arg[i]); if (copy) arg[j++] = arg[i]; } } if (!copy && j > 0) /* last char was a 'blank', remove it */ j--; l = j; /* the new argument length */ arg[j++] = '\0'; if (l == 0) /* empty string! */ return 1; /* * First, count number of arguments. Because of the previous * processing, this is just the number of blanks plus 1. */ for (i = 0, ac = 1; i < l; i++) if (strchr(WHITESP, arg[i]) != NULL) ac++; /* * Allocate the argument list structure as a single block * of memory, containing pointers and the argument * strings. We include one entry for the program name * because getopt expects it, and a NULL at the end * to simplify further parsing. */ ac++; /* add 1 for the program name */ av_size = (ac+1) * sizeof(char *) + l + 1; av = safe_calloc(av_size, 1); /* * Init the argument pointer to the end of the array * and copy arguments from arg[] to av[]. For each one, * j is the initial character, i is the one past the end. */ av_p = (char *)&av[ac+1]; for (ac = 1, i = j = 0; i < l; i++) { if (strchr(WHITESP, arg[i]) != NULL || i == l-1) { if (i == l-1) i++; bcopy(arg+j, av_p, i-j); av[ac] = av_p; av_p += i-j; /* the length of the string */ *av_p++ = '\0'; ac++; j = i + 1; } } } else { /* * If an argument ends with ',' join with the next one. */ int first, i, l=0; /* * Allocate the argument list structure as a single block * of memory, containing both pointers and the argument * strings. We include some space for the program name * because getopt expects it. * We add an extra pointer to the end of the array, * to make simpler further parsing. */ for (i=0; i= 2 && !strcmp(av[1], "sysctl")) { char *s; int i; if (ac != 3) { printf( "sysctl emulation usage:\n" " ipfw sysctl name[=value]\n" " ipfw sysctl -a\n"); return 0; } s = strchr(av[2], '='); if (s == NULL) { s = !strcmp(av[2], "-a") ? NULL : av[2]; sysctlbyname(s, NULL, NULL, NULL, 0); } else { /* ipfw sysctl x.y.z=value */ /* assume an INT value, will extend later */ if (s[1] == '\0') { printf("ipfw sysctl: missing value\n\n"); return 0; } *s = '\0'; i = strtol(s+1, NULL, 0); sysctlbyname(av[2], NULL, NULL, &i, sizeof(int)); } return 0; } #endif /* Save arguments for final freeing of memory. */ save_av = av; optind = optreset = 1; /* restart getopt() */ while ((ch = getopt(ac, av, "abcdefhinNp:qs:STtv")) != -1) switch (ch) { case 'a': do_acct = 1; break; case 'b': co.comment_only = 1; co.do_compact = 1; break; case 'c': co.do_compact = 1; break; case 'd': co.do_dynamic = 1; break; case 'e': co.do_expired = 1; break; case 'f': co.do_force = 1; break; case 'h': /* help */ free(save_av); help(); break; /* NOTREACHED */ case 'i': co.do_value_as_ip = 1; break; case 'n': co.test_only = 1; break; case 'N': co.do_resolv = 1; break; case 'q': co.do_quiet = 1; break; case 'p': errx(EX_USAGE, "An absolute pathname must be used " "with -p option."); /* NOTREACHED */ case 's': /* sort */ co.do_sort = atoi(optarg); break; case 'S': co.show_sets = 1; break; case 't': co.do_time = 1; break; case 'T': co.do_time = 2; /* numeric timestamp */ break; case 'v': /* verbose */ co.verbose = 1; break; default: free(save_av); return 1; } ac -= optind; av += optind; NEED1("bad arguments, for usage summary ``ipfw''"); /* * An undocumented behaviour of ipfw1 was to allow rule numbers first, * e.g. "100 add allow ..." instead of "add 100 allow ...". * In case, swap first and second argument to get the normal form. */ if (ac > 1 && isdigit(*av[0])) { char *p = av[0]; av[0] = av[1]; av[1] = p; } /* * Optional: pipe, queue or nat. */ co.do_nat = 0; co.do_pipe = 0; co.use_set = 0; if (!strncmp(*av, "nat", strlen(*av))) co.do_nat = 1; else if (!strncmp(*av, "pipe", strlen(*av))) co.do_pipe = 1; else if (_substrcmp(*av, "queue") == 0) co.do_pipe = 2; else if (_substrcmp(*av, "flowset") == 0) co.do_pipe = 2; else if (_substrcmp(*av, "sched") == 0) co.do_pipe = 3; else if (!strncmp(*av, "set", strlen(*av))) { if (ac > 1 && isdigit(av[1][0])) { co.use_set = strtonum(av[1], 0, resvd_set_number, &errstr); if (errstr) errx(EX_DATAERR, "invalid set number %s\n", av[1]); ac -= 2; av += 2; co.use_set++; } } if (co.do_pipe || co.do_nat) { ac--; av++; } NEED1("missing command"); /* * For pipes, queues and nats we normally say 'nat|pipe NN config' * but the code is easier to parse as 'nat|pipe config NN' * so we swap the two arguments. */ if ((co.do_pipe || co.do_nat) && ac > 1 && isdigit(*av[0])) { char *p = av[0]; av[0] = av[1]; av[1] = p; } if (co.use_set == 0) { if (_substrcmp(*av, "add") == 0) ipfw_add(av); else if (co.do_nat && _substrcmp(*av, "show") == 0) ipfw_show_nat(ac, av); else if (co.do_pipe && _substrcmp(*av, "config") == 0) ipfw_config_pipe(ac, av); else if (co.do_nat && _substrcmp(*av, "config") == 0) ipfw_config_nat(ac, av); else if (_substrcmp(*av, "set") == 0) ipfw_sets_handler(av); else if (_substrcmp(*av, "table") == 0) ipfw_table_handler(ac, av); else if (_substrcmp(*av, "enable") == 0) ipfw_sysctl_handler(av, 1); else if (_substrcmp(*av, "disable") == 0) ipfw_sysctl_handler(av, 0); else try_next = 1; } if (co.use_set || try_next) { if (_substrcmp(*av, "delete") == 0) ipfw_delete(av); else if (_substrcmp(*av, "flush") == 0) ipfw_flush(co.do_force); else if (_substrcmp(*av, "zero") == 0) ipfw_zero(ac, av, 0 /* IP_FW_ZERO */); else if (_substrcmp(*av, "resetlog") == 0) ipfw_zero(ac, av, 1 /* IP_FW_RESETLOG */); else if (_substrcmp(*av, "print") == 0 || _substrcmp(*av, "list") == 0) ipfw_list(ac, av, do_acct); else if (_substrcmp(*av, "show") == 0) ipfw_list(ac, av, 1 /* show counters */); else errx(EX_USAGE, "bad command `%s'", *av); } /* Free memory allocated in the argument parsing. */ free(save_av); return 0; } static void ipfw_readfile(int ac, char *av[]) { #define MAX_ARGS 32 char buf[4096]; char *progname = av[0]; /* original program name */ const char *cmd = NULL; /* preprocessor name, if any */ const char *filename = av[ac-1]; /* file to read */ int c, lineno=0; FILE *f = NULL; pid_t preproc = 0; while ((c = getopt(ac, av, "cfNnp:qS")) != -1) { switch(c) { case 'c': co.do_compact = 1; break; case 'f': co.do_force = 1; break; case 'N': co.do_resolv = 1; break; case 'n': co.test_only = 1; break; case 'p': /* * ipfw -p cmd [args] filename * * We are done with getopt(). All arguments * except the filename go to the preprocessor, * so we need to do the following: * - check that a filename is actually present; * - advance av by optind-1 to skip arguments * already processed; * - decrease ac by optind, to remove the args * already processed and the final filename; * - set the last entry in av[] to NULL so * popen() can detect the end of the array; * - set optind=ac to let getopt() terminate. */ if (optind == ac) errx(EX_USAGE, "no filename argument"); cmd = optarg; av[ac-1] = NULL; av += optind - 1; ac -= optind; optind = ac; break; case 'q': co.do_quiet = 1; break; case 'S': co.show_sets = 1; break; default: errx(EX_USAGE, "bad arguments, for usage" " summary ``ipfw''"); } } if (cmd == NULL && ac != optind + 1) errx(EX_USAGE, "extraneous filename arguments %s", av[ac-1]); if ((f = fopen(filename, "r")) == NULL) err(EX_UNAVAILABLE, "fopen: %s", filename); if (cmd != NULL) { /* pipe through preprocessor */ int pipedes[2]; if (pipe(pipedes) == -1) err(EX_OSERR, "cannot create pipe"); preproc = fork(); if (preproc == -1) err(EX_OSERR, "cannot fork"); if (preproc == 0) { /* * Child, will run the preprocessor with the * file on stdin and the pipe on stdout. */ if (dup2(fileno(f), 0) == -1 || dup2(pipedes[1], 1) == -1) err(EX_OSERR, "dup2()"); fclose(f); close(pipedes[1]); close(pipedes[0]); execvp(cmd, av); err(EX_OSERR, "execvp(%s) failed", cmd); } else { /* parent, will reopen f as the pipe */ fclose(f); close(pipedes[1]); if ((f = fdopen(pipedes[0], "r")) == NULL) { int savederrno = errno; (void)kill(preproc, SIGTERM); errno = savederrno; err(EX_OSERR, "fdopen()"); } } } while (fgets(buf, sizeof(buf), f)) { /* read commands */ char linename[20]; char *args[2]; lineno++; snprintf(linename, sizeof(linename), "Line %d", lineno); setprogname(linename); /* XXX */ args[0] = progname; args[1] = buf; ipfw_main(2, args); } fclose(f); if (cmd != NULL) { int status; if (waitpid(preproc, &status, 0) == -1) errx(EX_OSERR, "waitpid()"); if (WIFEXITED(status) && WEXITSTATUS(status) != EX_OK) errx(EX_UNAVAILABLE, "preprocessor exited with status %d", WEXITSTATUS(status)); else if (WIFSIGNALED(status)) errx(EX_UNAVAILABLE, "preprocessor exited with signal %d", WTERMSIG(status)); } } int main(int ac, char *av[]) { #if defined(_WIN32) && defined(TCC) { WSADATA wsaData; int ret=0; unsigned short wVersionRequested = MAKEWORD(2, 2); ret = WSAStartup(wVersionRequested, &wsaData); if (ret != 0) { /* Tell the user that we could not find a usable */ /* Winsock DLL. */ printf("WSAStartup failed with error: %d\n", ret); return 1; } } #endif /* * If the last argument is an absolute pathname, interpret it * as a file to be preprocessed. */ if (ac > 1 && av[ac - 1][0] == '/') { if (access(av[ac - 1], R_OK) == 0) ipfw_readfile(ac, av); else err(EX_USAGE, "pathname: %s", av[ac - 1]); } else { if (ipfw_main(ac, av)) { errx(EX_USAGE, "usage: ipfw [options]\n" "do \"ipfw -h\" or \"man ipfw\" for details"); } } return EX_OK; } ipfw3-2012/ipfw/expand_number.c000644 000423 000000 00000006042 12006744007 016670 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 2007 Eric Anderson * Copyright (c) 2007 Pawel Jakub Dawidek * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ // #include __FBSDID("$FreeBSD: src/lib/libutil/expand_number.c,v 1.2.4.2 2009/06/10 14:52:34 des Exp $"); #include #include #include #include //#include #include /* * Convert an expression of the following forms to a int64_t. * 1) A positive decimal number. * 2) A positive decimal number followed by a 'b' or 'B' (mult by 1). * 3) A positive decimal number followed by a 'k' or 'K' (mult by 1 << 10). * 4) A positive decimal number followed by a 'm' or 'M' (mult by 1 << 20). * 5) A positive decimal number followed by a 'g' or 'G' (mult by 1 << 30). * 6) A positive decimal number followed by a 't' or 'T' (mult by 1 << 40). * 7) A positive decimal number followed by a 'p' or 'P' (mult by 1 << 50). * 8) A positive decimal number followed by a 'e' or 'E' (mult by 1 << 60). */ int expand_number(const char *buf, int64_t *num) { static const char unit[] = "bkmgtpe"; char *endptr, s; int64_t number; int i; number = strtoimax(buf, &endptr, 0); if (endptr == buf) { /* No valid digits. */ errno = EINVAL; return (-1); } if (*endptr == '\0') { /* No unit. */ *num = number; return (0); } s = tolower(*endptr); switch (s) { case 'b': case 'k': case 'm': case 'g': case 't': case 'p': case 'e': break; default: /* Unrecognized unit. */ errno = EINVAL; return (-1); } for (i = 0; unit[i] != '\0'; i++) { if (s == unit[i]) break; if ((number < 0 && (number << 10) > number) || (number >= 0 && (number << 10) < number)) { errno = ERANGE; return (-1); } number <<= 10; } *num = number; return (0); } ipfw3-2012/ipfw/ipfw2.c000644 000423 000000 00000267601 12010150105 015063 0ustar00luigiwheel000000 000000 /* * Copyright (c) 2002-2003 Luigi Rizzo * Copyright (c) 1996 Alex Nash, Paul Traina, Poul-Henning Kamp * Copyright (c) 1994 Ugen J.S.Antsilevich * * Idea and grammar partially left from: * Copyright (c) 1993 Daniel Boulet * * Redistribution and use in source forms, with and without modification, * are permitted provided that this entire comment appears intact. * * Redistribution in binary form may occur without any restrictions. * Obviously, it would be nice if you gave credit where credit is due * but requiring it would be too onerous. * * This software is provided ``AS IS'' without any warranties of any kind. * * NEW command line interface for IP firewall facility * * $FreeBSD: head/sbin/ipfw/ipfw2.c 206843 2010-04-19 15:11:45Z luigi $ */ #include #include #include #include #include #include "ipfw2.h" #include #include #include #include #include #include #include #include #include #include #include /* ctime */ #include /* _long_to_time */ #include #include #include /* offsetof */ #include #include /* only IFNAMSIZ */ #include #include /* only n_short, n_long */ #include #include #include #include #include struct cmdline_opts co; /* global options */ int resvd_set_number = RESVD_SET; int ipfw_socket = -1; #ifndef s6_addr32 #define s6_addr32 __u6_addr.__u6_addr32 #endif #define GET_UINT_ARG(arg, min, max, tok, s_x) do { \ if (!av[0]) \ errx(EX_USAGE, "%s: missing argument", match_value(s_x, tok)); \ if (_substrcmp(*av, "tablearg") == 0) { \ arg = IP_FW_TABLEARG; \ break; \ } \ \ { \ long _xval; \ char *end; \ \ _xval = strtol(*av, &end, 10); \ \ if (!isdigit(**av) || *end != '\0' || (_xval == 0 && errno == EINVAL)) \ errx(EX_DATAERR, "%s: invalid argument: %s", \ match_value(s_x, tok), *av); \ \ if (errno == ERANGE || _xval < min || _xval > max) \ errx(EX_DATAERR, "%s: argument is out of range (%u..%u): %s", \ match_value(s_x, tok), min, max, *av); \ \ if (_xval == IP_FW_TABLEARG) \ errx(EX_DATAERR, "%s: illegal argument value: %s", \ match_value(s_x, tok), *av); \ arg = _xval; \ } \ } while (0) static void PRINT_UINT_ARG(const char *str, uint32_t arg) { if (str != NULL) printf("%s",str); if (arg == IP_FW_TABLEARG) printf("tablearg"); else printf("%u", arg); } static struct _s_x f_tcpflags[] = { { "syn", TH_SYN }, { "fin", TH_FIN }, { "ack", TH_ACK }, { "psh", TH_PUSH }, { "rst", TH_RST }, { "urg", TH_URG }, { "tcp flag", 0 }, { NULL, 0 } }; static struct _s_x f_tcpopts[] = { { "mss", IP_FW_TCPOPT_MSS }, { "maxseg", IP_FW_TCPOPT_MSS }, { "window", IP_FW_TCPOPT_WINDOW }, { "sack", IP_FW_TCPOPT_SACK }, { "ts", IP_FW_TCPOPT_TS }, { "timestamp", IP_FW_TCPOPT_TS }, { "cc", IP_FW_TCPOPT_CC }, { "tcp option", 0 }, { NULL, 0 } }; /* * IP options span the range 0 to 255 so we need to remap them * (though in fact only the low 5 bits are significant). */ static struct _s_x f_ipopts[] = { { "ssrr", IP_FW_IPOPT_SSRR}, { "lsrr", IP_FW_IPOPT_LSRR}, { "rr", IP_FW_IPOPT_RR}, { "ts", IP_FW_IPOPT_TS}, { "ip option", 0 }, { NULL, 0 } }; static struct _s_x f_iptos[] = { { "lowdelay", IPTOS_LOWDELAY}, { "throughput", IPTOS_THROUGHPUT}, { "reliability", IPTOS_RELIABILITY}, { "mincost", IPTOS_MINCOST}, { "congestion", IPTOS_ECN_CE}, { "ecntransport", IPTOS_ECN_ECT0}, { "ip tos option", 0}, { NULL, 0 } }; static struct _s_x limit_masks[] = { {"all", DYN_SRC_ADDR|DYN_SRC_PORT|DYN_DST_ADDR|DYN_DST_PORT}, {"src-addr", DYN_SRC_ADDR}, {"src-port", DYN_SRC_PORT}, {"dst-addr", DYN_DST_ADDR}, {"dst-port", DYN_DST_PORT}, {NULL, 0} }; /* * we use IPPROTO_ETHERTYPE as a fake protocol id to call the print routines * This is only used in this code. */ #define IPPROTO_ETHERTYPE 0x1000 static struct _s_x ether_types[] = { /* * Note, we cannot use "-:&/" in the names because they are field * separators in the type specifications. Also, we use s = NULL as * end-delimiter, because a type of 0 can be legal. */ { "ip", 0x0800 }, { "ipv4", 0x0800 }, { "ipv6", 0x86dd }, { "arp", 0x0806 }, { "rarp", 0x8035 }, { "vlan", 0x8100 }, { "loop", 0x9000 }, { "trail", 0x1000 }, { "at", 0x809b }, { "atalk", 0x809b }, { "aarp", 0x80f3 }, { "pppoe_disc", 0x8863 }, { "pppoe_sess", 0x8864 }, { "ipx_8022", 0x00E0 }, { "ipx_8023", 0x0000 }, { "ipx_ii", 0x8137 }, { "ipx_snap", 0x8137 }, { "ipx", 0x8137 }, { "ns", 0x0600 }, { NULL, 0 } }; static struct _s_x rule_actions[] = { { "accept", TOK_ACCEPT }, { "pass", TOK_ACCEPT }, { "allow", TOK_ACCEPT }, { "permit", TOK_ACCEPT }, { "count", TOK_COUNT }, { "pipe", TOK_PIPE }, { "queue", TOK_QUEUE }, { "divert", TOK_DIVERT }, { "tee", TOK_TEE }, { "netgraph", TOK_NETGRAPH }, { "ngtee", TOK_NGTEE }, { "fwd", TOK_FORWARD }, { "forward", TOK_FORWARD }, { "skipto", TOK_SKIPTO }, { "deny", TOK_DENY }, { "drop", TOK_DENY }, { "reject", TOK_REJECT }, { "reset6", TOK_RESET6 }, { "reset", TOK_RESET }, { "unreach6", TOK_UNREACH6 }, { "unreach", TOK_UNREACH }, { "check-state", TOK_CHECKSTATE }, { "//", TOK_COMMENT }, { "nat", TOK_NAT }, { "reass", TOK_REASS }, { "setfib", TOK_SETFIB }, { "call", TOK_CALL }, { "return", TOK_RETURN }, { NULL, 0 } /* terminator */ }; static struct _s_x rule_action_params[] = { { "altq", TOK_ALTQ }, { "log", TOK_LOG }, { "tag", TOK_TAG }, { "untag", TOK_UNTAG }, { NULL, 0 } /* terminator */ }; /* * The 'lookup' instruction accepts one of the following arguments. * -1 is a terminator for the list. * Arguments are passed as v[1] in O_DST_LOOKUP options. */ static int lookup_key[] = { TOK_DSTIP, TOK_SRCIP, TOK_DSTPORT, TOK_SRCPORT, TOK_UID, TOK_JAIL, TOK_DSCP, -1 }; static struct _s_x rule_options[] = { { "tagged", TOK_TAGGED }, { "uid", TOK_UID }, { "gid", TOK_GID }, { "jail", TOK_JAIL }, { "in", TOK_IN }, { "limit", TOK_LIMIT }, { "keep-state", TOK_KEEPSTATE }, { "bridged", TOK_LAYER2 }, { "layer2", TOK_LAYER2 }, { "out", TOK_OUT }, { "diverted", TOK_DIVERTED }, { "diverted-loopback", TOK_DIVERTEDLOOPBACK }, { "diverted-output", TOK_DIVERTEDOUTPUT }, { "xmit", TOK_XMIT }, { "recv", TOK_RECV }, { "via", TOK_VIA }, { "fragment", TOK_FRAG }, { "frag", TOK_FRAG }, { "fib", TOK_FIB }, { "ipoptions", TOK_IPOPTS }, { "ipopts", TOK_IPOPTS }, { "iplen", TOK_IPLEN }, { "ipid", TOK_IPID }, { "ipprecedence", TOK_IPPRECEDENCE }, { "dscp", TOK_DSCP }, { "iptos", TOK_IPTOS }, { "ipttl", TOK_IPTTL }, { "ipversion", TOK_IPVER }, { "ipver", TOK_IPVER }, { "estab", TOK_ESTAB }, { "established", TOK_ESTAB }, { "setup", TOK_SETUP }, { "sockarg", TOK_SOCKARG }, { "tcpdatalen", TOK_TCPDATALEN }, { "tcpflags", TOK_TCPFLAGS }, { "tcpflgs", TOK_TCPFLAGS }, { "tcpoptions", TOK_TCPOPTS }, { "tcpopts", TOK_TCPOPTS }, { "tcpseq", TOK_TCPSEQ }, { "tcpack", TOK_TCPACK }, { "tcpwin", TOK_TCPWIN }, { "icmptype", TOK_ICMPTYPES }, { "icmptypes", TOK_ICMPTYPES }, { "dst-ip", TOK_DSTIP }, { "src-ip", TOK_SRCIP }, { "dst-port", TOK_DSTPORT }, { "src-port", TOK_SRCPORT }, { "proto", TOK_PROTO }, { "MAC", TOK_MAC }, { "mac", TOK_MAC }, { "mac-type", TOK_MACTYPE }, { "verrevpath", TOK_VERREVPATH }, { "versrcreach", TOK_VERSRCREACH }, { "antispoof", TOK_ANTISPOOF }, { "ipsec", TOK_IPSEC }, { "icmp6type", TOK_ICMP6TYPES }, { "icmp6types", TOK_ICMP6TYPES }, { "ext6hdr", TOK_EXT6HDR}, { "flow-id", TOK_FLOWID}, { "ipv6", TOK_IPV6}, { "ip6", TOK_IPV6}, { "ipv4", TOK_IPV4}, { "ip4", TOK_IPV4}, { "dst-ipv6", TOK_DSTIP6}, { "dst-ip6", TOK_DSTIP6}, { "src-ipv6", TOK_SRCIP6}, { "src-ip6", TOK_SRCIP6}, { "lookup", TOK_LOOKUP}, { "//", TOK_COMMENT }, { "not", TOK_NOT }, /* pseudo option */ { "!", /* escape ? */ TOK_NOT }, /* pseudo option */ { "or", TOK_OR }, /* pseudo option */ { "|", /* escape */ TOK_OR }, /* pseudo option */ { "{", TOK_STARTBRACE }, /* pseudo option */ { "(", TOK_STARTBRACE }, /* pseudo option */ { "}", TOK_ENDBRACE }, /* pseudo option */ { ")", TOK_ENDBRACE }, /* pseudo option */ { NULL, 0 } /* terminator */ }; /* * Helper routine to print a possibly unaligned uint64_t on * various platform. If width > 0, print the value with * the desired width, followed by a space; * otherwise, return the required width. */ int pr_u64(uint64_t *pd, int width) { #ifdef TCC #define U64_FMT "I64" #else #define U64_FMT "llu" #endif uint64_t u; unsigned long long d; bcopy (pd, &u, sizeof(u)); d = u; return (width > 0) ? printf("%*" U64_FMT " ", width, d) : snprintf(NULL, 0, "%" U64_FMT, d) ; #undef U64_FMT } void * safe_calloc(size_t number, size_t size) { void *ret = calloc(number, size); if (ret == NULL) err(EX_OSERR, "calloc"); return ret; } void * safe_realloc(void *ptr, size_t size) { void *ret = realloc(ptr, size); if (ret == NULL) err(EX_OSERR, "realloc"); return ret; } /* * conditionally runs the command. * Selected options or negative -> getsockopt */ int do_cmd(int optname, void *optval, uintptr_t optlen) { int i; if (co.test_only) return 0; if (ipfw_socket == -1) ipfw_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); if (ipfw_socket < 0) err(EX_UNAVAILABLE, "socket"); if (optname == IP_FW_GET || optname == IP_DUMMYNET_GET || optname == IP_FW_ADD || optname == IP_FW_TABLE_LIST || optname == IP_FW_TABLE_GETSIZE || optname == IP_FW_NAT_GET_CONFIG || optname < 0 || optname == IP_FW_NAT_GET_LOG) { if (optname < 0) optname = -optname; i = getsockopt(ipfw_socket, IPPROTO_IP, optname, optval, (socklen_t *)optlen); } else { i = setsockopt(ipfw_socket, IPPROTO_IP, optname, optval, optlen); } return i; } #if 0 // XXX still unused /* * do_setcmd3 - pass ipfw control cmd to kernel * @optname: option name * @optval: pointer to option data * @optlen: option length * * Function encapsulates option value in IP_FW3 socket option * and calls setsockopt(). * Function returns 0 on success or -1 otherwise. */ static int do_setcmd3(int optname, void *optval, socklen_t optlen) { socklen_t len; ip_fw3_opheader *op3; if (co.test_only) return (0); if (ipfw_socket == -1) ipfw_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); if (ipfw_socket < 0) err(EX_UNAVAILABLE, "socket"); len = sizeof(ip_fw3_opheader) + optlen; op3 = alloca(len); /* Zero reserved fields */ memset(op3, 0, sizeof(ip_fw3_opheader)); memcpy(op3 + 1, optval, optlen); op3->opcode = optname; return setsockopt(ipfw_socket, IPPROTO_IP, IP_FW3, op3, len); } #endif // XXX still unused /** * match_token takes a table and a string, returns the value associated * with the string (-1 in case of failure). */ int match_token(struct _s_x *table, char *string) { struct _s_x *pt; uint i = strlen(string); for (pt = table ; i && pt->s != NULL ; pt++) if (strlen(pt->s) == i && !bcmp(string, pt->s, i)) return pt->x; return -1; } /** * match_value takes a table and a value, returns the string associated * with the value (NULL in case of failure). */ char const * match_value(struct _s_x *p, int value) { for (; p->s != NULL; p++) if (p->x == value) return p->s; return NULL; } /* * _substrcmp takes two strings and returns 1 if they do not match, * and 0 if they match exactly or the first string is a sub-string * of the second. A warning is printed to stderr in the case that the * first string is a sub-string of the second. * * This function will be removed in the future through the usual * deprecation process. */ int _substrcmp(const char *str1, const char* str2) { if (strncmp(str1, str2, strlen(str1)) != 0) return 1; if (strlen(str1) != strlen(str2)) warnx("DEPRECATED: '%s' matched '%s' as a sub-string", str1, str2); return 0; } /* * _substrcmp2 takes three strings and returns 1 if the first two do not match, * and 0 if they match exactly or the second string is a sub-string * of the first. A warning is printed to stderr in the case that the * first string does not match the third. * * This function exists to warn about the bizarre construction * strncmp(str, "by", 2) which is used to allow people to use a shortcut * for "bytes". The problem is that in addition to accepting "by", * "byt", "byte", and "bytes", it also excepts "by_rabid_dogs" and any * other string beginning with "by". * * This function will be removed in the future through the usual * deprecation process. */ int _substrcmp2(const char *str1, const char* str2, const char* str3) { if (strncmp(str1, str2, strlen(str2)) != 0) return 1; if (strcmp(str1, str3) != 0) warnx("DEPRECATED: '%s' matched '%s'", str1, str3); return 0; } /* * prints one port, symbolic or numeric */ static void print_port(int proto, uint16_t port) { if (proto == IPPROTO_ETHERTYPE) { char const *s; if (co.do_resolv && (s = match_value(ether_types, port)) ) printf("%s", s); else printf("0x%04x", port); } else { struct servent *se = NULL; if (co.do_resolv) { struct protoent *pe = getprotobynumber(proto); se = getservbyport(htons(port), pe ? pe->p_name : NULL); } if (se) printf("%s", se->s_name); else printf("%d", port); } } static struct _s_x _port_name[] = { {"dst-port", O_IP_DSTPORT}, {"src-port", O_IP_SRCPORT}, {"ipid", O_IPID}, {"iplen", O_IPLEN}, {"ipttl", O_IPTTL}, {"mac-type", O_MAC_TYPE}, {"tcpdatalen", O_TCPDATALEN}, {"tcpwin", O_TCPWIN}, {"tagged", O_TAGGED}, {NULL, 0} }; /* * Print the values in a list 16-bit items of the types above. * XXX todo: add support for mask. */ static void print_newports(ipfw_insn_u16 *cmd, int proto, int opcode) { uint16_t *p = cmd->ports; int i; char const *sep; if (opcode != 0) { sep = match_value(_port_name, opcode); if (sep == NULL) sep = "???"; printf (" %s", sep); } sep = " "; for (i = F_LEN((ipfw_insn *)cmd) - 1; i > 0; i--, p += 2) { printf("%s", sep); print_port(proto, p[0]); if (p[0] != p[1]) { printf("-"); print_port(proto, p[1]); } sep = ","; } } /* * Like strtol, but also translates service names into port numbers * for some protocols. * In particular: * proto == -1 disables the protocol check; * proto == IPPROTO_ETHERTYPE looks up an internal table * proto == matches the values there. * Returns *end == s in case the parameter is not found. */ static int strtoport(char *s, char **end, int base, int proto) { char *p, *buf; char *s1; int i; *end = s; /* default - not found */ if (*s == '\0') return 0; /* not found */ if (isdigit(*s)) return strtol(s, end, base); /* * find separator. '\\' escapes the next char. */ for (s1 = s; *s1 && (isalnum(*s1) || *s1 == '\\') ; s1++) if (*s1 == '\\' && s1[1] != '\0') s1++; buf = safe_calloc(s1 - s + 1, 1); /* * copy into a buffer skipping backslashes */ for (p = s, i = 0; p != s1 ; p++) if (*p != '\\') buf[i++] = *p; buf[i++] = '\0'; if (proto == IPPROTO_ETHERTYPE) { i = match_token(ether_types, buf); free(buf); if (i != -1) { /* found */ *end = s1; return i; } } else { struct protoent *pe = NULL; struct servent *se; if (proto != 0) pe = getprotobynumber(proto); setservent(1); se = getservbyname(buf, pe ? pe->p_name : NULL); free(buf); if (se != NULL) { *end = s1; return ntohs(se->s_port); } } return 0; /* not found */ } /* * Fill the body of the command with the list of port ranges. */ static int fill_newports(ipfw_insn_u16 *cmd, char *av, int proto) { uint16_t a, b, *p = cmd->ports; int i = 0; char *s = av; while (*s) { a = strtoport(av, &s, 0, proto); if (s == av) /* empty or invalid argument */ return (0); switch (*s) { case '-': /* a range */ av = s + 1; b = strtoport(av, &s, 0, proto); /* Reject expressions like '1-abc' or '1-2-3'. */ if (s == av || (*s != ',' && *s != '\0')) return (0); p[0] = a; p[1] = b; break; case ',': /* comma separated list */ case '\0': p[0] = p[1] = a; break; default: warnx("port list: invalid separator <%c> in <%s>", *s, av); return (0); } i++; p += 2; av = s + 1; } if (i > 0) { if (i + 1 > F_LEN_MASK) errx(EX_DATAERR, "too many ports/ranges\n"); cmd->o.len |= i + 1; /* leave F_NOT and F_OR untouched */ } return (i); } static struct _s_x icmpcodes[] = { { "net", ICMP_UNREACH_NET }, { "host", ICMP_UNREACH_HOST }, { "protocol", ICMP_UNREACH_PROTOCOL }, { "port", ICMP_UNREACH_PORT }, { "needfrag", ICMP_UNREACH_NEEDFRAG }, { "srcfail", ICMP_UNREACH_SRCFAIL }, { "net-unknown", ICMP_UNREACH_NET_UNKNOWN }, { "host-unknown", ICMP_UNREACH_HOST_UNKNOWN }, { "isolated", ICMP_UNREACH_ISOLATED }, { "net-prohib", ICMP_UNREACH_NET_PROHIB }, { "host-prohib", ICMP_UNREACH_HOST_PROHIB }, { "tosnet", ICMP_UNREACH_TOSNET }, { "toshost", ICMP_UNREACH_TOSHOST }, { "filter-prohib", ICMP_UNREACH_FILTER_PROHIB }, { "host-precedence", ICMP_UNREACH_HOST_PRECEDENCE }, { "precedence-cutoff", ICMP_UNREACH_PRECEDENCE_CUTOFF }, { NULL, 0 } }; static void fill_reject_code(u_short *codep, char *str) { int val; char *s; val = strtoul(str, &s, 0); if (s == str || *s != '\0' || val >= 0x100) val = match_token(icmpcodes, str); if (val < 0) errx(EX_DATAERR, "unknown ICMP unreachable code ``%s''", str); *codep = val; return; } static void print_reject_code(uint16_t code) { char const *s = match_value(icmpcodes, code); if (s != NULL) printf("unreach %s", s); else printf("unreach %u", code); } /* * Returns the number of bits set (from left) in a contiguous bitmask, * or -1 if the mask is not contiguous. * XXX this needs a proper fix. * This effectively works on masks in big-endian (network) format. * when compiled on little endian architectures. * * First bit is bit 7 of the first byte -- note, for MAC addresses, * the first bit on the wire is bit 0 of the first byte. * len is the max length in bits. */ int contigmask(uint8_t *p, int len) { int i, n; for (i=0; iarg1 & 0xff; uint8_t clear = (cmd->arg1 >> 8) & 0xff; if (list == f_tcpflags && set == TH_SYN && clear == TH_ACK) { printf(" setup"); return; } printf(" %s ", name); for (i=0; list[i].x != 0; i++) { if (set & list[i].x) { set &= ~list[i].x; printf("%s%s", comma, list[i].s); comma = ","; } if (clear & list[i].x) { clear &= ~list[i].x; printf("%s!%s", comma, list[i].s); comma = ","; } } } /* * Print the ip address contained in a command. */ static void print_ip(ipfw_insn_ip *cmd, char const *s) { struct hostent *he = NULL; uint32_t len = F_LEN((ipfw_insn *)cmd); uint32_t *a = ((ipfw_insn_u32 *)cmd)->d; if (cmd->o.opcode == O_IP_DST_LOOKUP && len > F_INSN_SIZE(ipfw_insn_u32)) { uint32_t d = a[1]; const char *arg = ""; if (d < sizeof(lookup_key)/sizeof(lookup_key[0])) arg = match_value(rule_options, lookup_key[d]); printf("%s lookup %s %d", cmd->o.len & F_NOT ? " not": "", arg, cmd->o.arg1); return; } printf("%s%s ", cmd->o.len & F_NOT ? " not": "", s); if (cmd->o.opcode == O_IP_SRC_ME || cmd->o.opcode == O_IP_DST_ME) { printf("me"); return; } if (cmd->o.opcode == O_IP_SRC_LOOKUP || cmd->o.opcode == O_IP_DST_LOOKUP) { printf("table(%u", ((ipfw_insn *)cmd)->arg1); if (len == F_INSN_SIZE(ipfw_insn_u32)) printf(",%u", *a); printf(")"); return; } if (cmd->o.opcode == O_IP_SRC_SET || cmd->o.opcode == O_IP_DST_SET) { uint32_t x, *map = (uint32_t *)&(cmd->mask); int i, j; char comma = '{'; x = cmd->o.arg1 - 1; x = htonl( ~x ); cmd->addr.s_addr = htonl(cmd->addr.s_addr); printf("%s/%d", inet_ntoa(cmd->addr), contigmask((uint8_t *)&x, 32)); x = cmd->addr.s_addr = htonl(cmd->addr.s_addr); x &= 0xff; /* base */ /* * Print bits and ranges. * Locate first bit set (i), then locate first bit unset (j). * If we have 3+ consecutive bits set, then print them as a * range, otherwise only print the initial bit and rescan. */ for (i=0; i < cmd->o.arg1; i++) if (map[i/32] & (1<<(i & 31))) { for (j=i+1; j < cmd->o.arg1; j++) if (!(map[ j/32] & (1<<(j & 31)))) break; printf("%c%d", comma, i+x); if (j>i+2) { /* range has at least 3 elements */ printf("-%d", j-1+x); i = j-1; } comma = ','; } printf("}"); return; } /* * len == 2 indicates a single IP, whereas lists of 1 or more * addr/mask pairs have len = (2n+1). We convert len to n so we * use that to count the number of entries. */ for (len = len / 2; len > 0; len--, a += 2) { int mb = /* mask length */ (cmd->o.opcode == O_IP_SRC || cmd->o.opcode == O_IP_DST) ? 32 : contigmask((uint8_t *)&(a[1]), 32); if (mb == 32 && co.do_resolv) he = gethostbyaddr((char *)&(a[0]), sizeof(u_long), AF_INET); if (he != NULL) /* resolved to name */ printf("%s", he->h_name); else if (mb == 0) /* any */ printf("any"); else { /* numeric IP followed by some kind of mask */ printf("%s", inet_ntoa( *((struct in_addr *)&a[0]) ) ); if (mb < 0) printf(":%s", inet_ntoa( *((struct in_addr *)&a[1]) ) ); else if (mb < 32) printf("/%d", mb); } if (len > 1) printf(","); } } /* * prints a MAC address/mask pair */ static void print_mac(uint8_t *addr, uint8_t *mask) { int l = contigmask(mask, 48); if (l == 0) printf(" any"); else { printf(" %02x:%02x:%02x:%02x:%02x:%02x", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); if (l == -1) printf("&%02x:%02x:%02x:%02x:%02x:%02x", mask[0], mask[1], mask[2], mask[3], mask[4], mask[5]); else if (l < 48) printf("/%d", l); } } static void fill_icmptypes(ipfw_insn_u32 *cmd, char *av) { uint8_t type; cmd->d[0] = 0; while (*av) { if (*av == ',') av++; type = strtoul(av, &av, 0); if (*av != ',' && *av != '\0') errx(EX_DATAERR, "invalid ICMP type"); if (type > 31) errx(EX_DATAERR, "ICMP type out of range"); cmd->d[0] |= 1 << type; } cmd->o.opcode = O_ICMPTYPE; cmd->o.len |= F_INSN_SIZE(ipfw_insn_u32); } static void print_icmptypes(ipfw_insn_u32 *cmd) { int i; char sep= ' '; printf(" icmptypes"); for (i = 0; i < 32; i++) { if ( (cmd->d[0] & (1 << (i))) == 0) continue; printf("%c%d", sep, i); sep = ','; } } /* * show_ipfw() prints the body of an ipfw rule. * Because the standard rule has at least proto src_ip dst_ip, we use * a helper function to produce these entries if not provided explicitly. * The first argument is the list of fields we have, the second is * the list of fields we want to be printed. * * Special cases if we have provided a MAC header: * + if the rule does not contain IP addresses/ports, do not print them; * + if the rule does not contain an IP proto, print "all" instead of "ip"; * * Once we have 'have_options', IP header fields are printed as options. */ #define HAVE_PROTO 0x0001 #define HAVE_SRCIP 0x0002 #define HAVE_DSTIP 0x0004 #define HAVE_PROTO4 0x0008 #define HAVE_PROTO6 0x0010 #define HAVE_IP 0x0100 #define HAVE_OPTIONS 0x8000 static void show_prerequisites(int *flags, int want, int cmd) { (void)cmd; /* UNUSED */ if (co.comment_only) return; if ( (*flags & HAVE_IP) == HAVE_IP) *flags |= HAVE_OPTIONS; if ( !(*flags & HAVE_OPTIONS)) { if ( !(*flags & HAVE_PROTO) && (want & HAVE_PROTO)) { if ( (*flags & HAVE_PROTO4)) printf(" ip4"); else if ( (*flags & HAVE_PROTO6)) printf(" ip6"); else printf(" ip"); } if ( !(*flags & HAVE_SRCIP) && (want & HAVE_SRCIP)) printf(" from any"); if ( !(*flags & HAVE_DSTIP) && (want & HAVE_DSTIP)) printf(" to any"); } *flags |= want; } static void show_ipfw(struct ip_fw *rule, int pcwidth, int bcwidth) { static int twidth = 0; int l; ipfw_insn *cmd, *tagptr = NULL; const char *comment = NULL; /* ptr to comment if we have one */ int proto = 0; /* default */ int flags = 0; /* prerequisites */ ipfw_insn_log *logptr = NULL; /* set if we find an O_LOG */ ipfw_insn_altq *altqptr = NULL; /* set if we find an O_ALTQ */ int or_block = 0; /* we are in an or block */ uint32_t set_disable; bcopy(&rule->next_rule, &set_disable, sizeof(set_disable)); if (set_disable & (1 << rule->set)) { /* disabled */ if (!co.show_sets) return; else printf("# DISABLED "); } printf("%05u ", rule->rulenum); if (pcwidth > 0 || bcwidth > 0) { pr_u64(&rule->pcnt, pcwidth); pr_u64(&rule->bcnt, bcwidth); } if (co.do_time == 2) printf("%10u ", rule->timestamp); else if (co.do_time == 1) { char timestr[30]; time_t t = (time_t)0; if (twidth == 0) { strcpy(timestr, ctime(&t)); *strchr(timestr, '\n') = '\0'; twidth = strlen(timestr); } if (rule->timestamp) { t = _long_to_time(rule->timestamp); strcpy(timestr, ctime(&t)); *strchr(timestr, '\n') = '\0'; printf("%s ", timestr); } else { printf("%*s", twidth, " "); } } if (co.show_sets) printf("set %d ", rule->set); /* * print the optional "match probability" */ if (rule->cmd_len > 0) { cmd = rule->cmd ; if (cmd->opcode == O_PROB) { ipfw_insn_u32 *p = (ipfw_insn_u32 *)cmd; double d = 1.0 * p->d[0]; d = (d / 0x7fffffff); printf("prob %f ", d); } } /* * first print actions */ for (l = rule->cmd_len - rule->act_ofs, cmd = ACTION_PTR(rule); l > 0 ; l -= F_LEN(cmd), cmd += F_LEN(cmd)) { switch(cmd->opcode) { case O_CHECK_STATE: printf("check-state"); /* avoid printing anything else */ flags = HAVE_PROTO | HAVE_SRCIP | HAVE_DSTIP | HAVE_IP; break; case O_ACCEPT: printf("allow"); break; case O_COUNT: printf("count"); break; case O_DENY: printf("deny"); break; case O_REJECT: if (cmd->arg1 == ICMP_REJECT_RST) printf("reset"); else if (cmd->arg1 == ICMP_UNREACH_HOST) printf("reject"); else print_reject_code(cmd->arg1); break; case O_UNREACH6: if (cmd->arg1 == ICMP6_UNREACH_RST) printf("reset6"); else print_unreach6_code(cmd->arg1); break; case O_SKIPTO: PRINT_UINT_ARG("skipto ", cmd->arg1); break; case O_PIPE: PRINT_UINT_ARG("pipe ", cmd->arg1); break; case O_QUEUE: PRINT_UINT_ARG("queue ", cmd->arg1); break; case O_DIVERT: PRINT_UINT_ARG("divert ", cmd->arg1); break; case O_TEE: PRINT_UINT_ARG("tee ", cmd->arg1); break; case O_NETGRAPH: PRINT_UINT_ARG("netgraph ", cmd->arg1); break; case O_NGTEE: PRINT_UINT_ARG("ngtee ", cmd->arg1); break; case O_FORWARD_IP: { ipfw_insn_sa *s = (ipfw_insn_sa *)cmd; if (s->sa.sin_addr.s_addr == INADDR_ANY) { printf("fwd tablearg"); } else { printf("fwd %s", inet_ntoa(s->sa.sin_addr)); } if (s->sa.sin_port) printf(",%d", s->sa.sin_port); } break; #if 0 // XXX unused yet case O_FORWARD_IP6: { char buf[4 + INET6_ADDRSTRLEN + 1]; ipfw_insn_sa6 *s = (ipfw_insn_sa6 *)cmd; printf("fwd %s", inet_ntop(AF_INET6, &s->sa.sin6_addr, buf, sizeof(buf))); if (s->sa.sin6_port) printf(",%d", s->sa.sin6_port); } break; #endif // XXX unused yet case O_LOG: /* O_LOG is printed last */ logptr = (ipfw_insn_log *)cmd; break; case O_ALTQ: /* O_ALTQ is printed after O_LOG */ altqptr = (ipfw_insn_altq *)cmd; break; case O_TAG: tagptr = cmd; break; case O_NAT: if (cmd->arg1 != 0) PRINT_UINT_ARG("nat ", cmd->arg1); else printf("nat global"); break; case O_SETFIB: PRINT_UINT_ARG("setfib ", cmd->arg1); break; case O_REASS: printf("reass"); break; case O_CALLRETURN: if (cmd->len & F_NOT) printf("return"); else PRINT_UINT_ARG("call ", cmd->arg1); break; default: printf("** unrecognized action %d len %d ", cmd->opcode, cmd->len); } } if (logptr) { if (logptr->max_log > 0) printf(" log logamount %d", logptr->max_log); else printf(" log"); } #ifndef NO_ALTQ if (altqptr) { print_altq_cmd(altqptr); } #endif if (tagptr) { if (tagptr->len & F_NOT) PRINT_UINT_ARG(" untag ", tagptr->arg1); else PRINT_UINT_ARG(" tag ", tagptr->arg1); } /* * then print the body. */ for (l = rule->act_ofs, cmd = rule->cmd ; l > 0 ; l -= F_LEN(cmd) , cmd += F_LEN(cmd)) { if ((cmd->len & F_OR) || (cmd->len & F_NOT)) continue; if (cmd->opcode == O_IP4) { flags |= HAVE_PROTO4; break; } else if (cmd->opcode == O_IP6) { flags |= HAVE_PROTO6; break; } } if (rule->_pad & 1) { /* empty rules before options */ if (!co.do_compact) { show_prerequisites(&flags, HAVE_PROTO, 0); printf(" from any to any"); } flags |= HAVE_IP | HAVE_OPTIONS | HAVE_PROTO | HAVE_SRCIP | HAVE_DSTIP; } if (co.comment_only) comment = "..."; for (l = rule->act_ofs, cmd = rule->cmd ; l > 0 ; l -= F_LEN(cmd) , cmd += F_LEN(cmd)) { /* useful alias */ ipfw_insn_u32 *cmd32 = (ipfw_insn_u32 *)cmd; if (co.comment_only) { if (cmd->opcode != O_NOP) continue; printf(" // %s\n", (char *)(cmd + 1)); return; } show_prerequisites(&flags, 0, cmd->opcode); switch(cmd->opcode) { case O_PROB: break; /* done already */ case O_PROBE_STATE: break; /* no need to print anything here */ case O_IP_SRC: case O_IP_SRC_LOOKUP: case O_IP_SRC_MASK: case O_IP_SRC_ME: case O_IP_SRC_SET: show_prerequisites(&flags, HAVE_PROTO, 0); if (!(flags & HAVE_SRCIP)) printf(" from"); if ((cmd->len & F_OR) && !or_block) printf(" {"); print_ip((ipfw_insn_ip *)cmd, (flags & HAVE_OPTIONS) ? " src-ip" : ""); flags |= HAVE_SRCIP; break; case O_IP_DST: case O_IP_DST_LOOKUP: case O_IP_DST_MASK: case O_IP_DST_ME: case O_IP_DST_SET: show_prerequisites(&flags, HAVE_PROTO|HAVE_SRCIP, 0); if (!(flags & HAVE_DSTIP)) printf(" to"); if ((cmd->len & F_OR) && !or_block) printf(" {"); print_ip((ipfw_insn_ip *)cmd, (flags & HAVE_OPTIONS) ? " dst-ip" : ""); flags |= HAVE_DSTIP; break; case O_IP6_SRC: case O_IP6_SRC_MASK: case O_IP6_SRC_ME: show_prerequisites(&flags, HAVE_PROTO, 0); if (!(flags & HAVE_SRCIP)) printf(" from"); if ((cmd->len & F_OR) && !or_block) printf(" {"); print_ip6((ipfw_insn_ip6 *)cmd, (flags & HAVE_OPTIONS) ? " src-ip6" : ""); flags |= HAVE_SRCIP | HAVE_PROTO; break; case O_IP6_DST: case O_IP6_DST_MASK: case O_IP6_DST_ME: show_prerequisites(&flags, HAVE_PROTO|HAVE_SRCIP, 0); if (!(flags & HAVE_DSTIP)) printf(" to"); if ((cmd->len & F_OR) && !or_block) printf(" {"); print_ip6((ipfw_insn_ip6 *)cmd, (flags & HAVE_OPTIONS) ? " dst-ip6" : ""); flags |= HAVE_DSTIP; break; case O_FLOW6ID: print_flow6id( (ipfw_insn_u32 *) cmd ); flags |= HAVE_OPTIONS; break; case O_IP_DSTPORT: show_prerequisites(&flags, HAVE_PROTO | HAVE_SRCIP | HAVE_DSTIP | HAVE_IP, 0); case O_IP_SRCPORT: if (flags & HAVE_DSTIP) flags |= HAVE_IP; show_prerequisites(&flags, HAVE_PROTO | HAVE_SRCIP, 0); if ((cmd->len & F_OR) && !or_block) printf(" {"); if (cmd->len & F_NOT) printf(" not"); print_newports((ipfw_insn_u16 *)cmd, proto, (flags & HAVE_OPTIONS) ? cmd->opcode : 0); break; case O_PROTO: { struct protoent *pe = NULL; if ((cmd->len & F_OR) && !or_block) printf(" {"); if (cmd->len & F_NOT) printf(" not"); proto = cmd->arg1; pe = getprotobynumber(cmd->arg1); if ((flags & (HAVE_PROTO4 | HAVE_PROTO6)) && !(flags & HAVE_PROTO)) show_prerequisites(&flags, HAVE_PROTO | HAVE_IP | HAVE_SRCIP | HAVE_DSTIP | HAVE_OPTIONS, 0); if (flags & HAVE_OPTIONS) printf(" proto"); if (pe) printf(" %s", pe->p_name); else printf(" %u", cmd->arg1); } flags |= HAVE_PROTO; break; default: /*options ... */ if (!(cmd->len & (F_OR|F_NOT))) if (((cmd->opcode == O_IP6) && (flags & HAVE_PROTO6)) || ((cmd->opcode == O_IP4) && (flags & HAVE_PROTO4))) break; show_prerequisites(&flags, HAVE_PROTO | HAVE_SRCIP | HAVE_DSTIP | HAVE_IP | HAVE_OPTIONS, 0); if ((cmd->len & F_OR) && !or_block) printf(" {"); if (cmd->len & F_NOT && cmd->opcode != O_IN) printf(" not"); switch(cmd->opcode) { case O_MACADDR2: { ipfw_insn_mac *m = (ipfw_insn_mac *)cmd; printf(" MAC"); print_mac(m->addr, m->mask); print_mac(m->addr + 6, m->mask + 6); } break; case O_MAC_TYPE: print_newports((ipfw_insn_u16 *)cmd, IPPROTO_ETHERTYPE, cmd->opcode); break; case O_FRAG: printf(" frag"); break; case O_FIB: printf(" fib %u", cmd->arg1 ); break; case O_SOCKARG: printf(" sockarg"); break; case O_IN: printf(cmd->len & F_NOT ? " out" : " in"); break; case O_DIVERTED: switch (cmd->arg1) { case 3: printf(" diverted"); break; case 1: printf(" diverted-loopback"); break; case 2: printf(" diverted-output"); break; default: printf(" diverted-?<%u>", cmd->arg1); break; } break; case O_LAYER2: printf(" layer2"); break; case O_XMIT: case O_RECV: case O_VIA: { char const *s; ipfw_insn_if *cmdif = (ipfw_insn_if *)cmd; if (cmd->opcode == O_XMIT) s = "xmit"; else if (cmd->opcode == O_RECV) s = "recv"; else /* if (cmd->opcode == O_VIA) */ s = "via"; if (cmdif->name[0] == '\0') printf(" %s %s", s, inet_ntoa(cmdif->p.ip)); else printf(" %s %s", s, cmdif->name); break; } case O_IPID: if (F_LEN(cmd) == 1) printf(" ipid %u", cmd->arg1 ); else print_newports((ipfw_insn_u16 *)cmd, 0, O_IPID); break; case O_IPTTL: if (F_LEN(cmd) == 1) printf(" ipttl %u", cmd->arg1 ); else print_newports((ipfw_insn_u16 *)cmd, 0, O_IPTTL); break; case O_IPVER: printf(" ipver %u", cmd->arg1 ); break; case O_IPPRECEDENCE: printf(" ipprecedence %u", (cmd->arg1) >> 5 ); break; case O_IPLEN: if (F_LEN(cmd) == 1) printf(" iplen %u", cmd->arg1 ); else print_newports((ipfw_insn_u16 *)cmd, 0, O_IPLEN); break; case O_IPOPT: print_flags("ipoptions", cmd, f_ipopts); break; case O_IPTOS: print_flags("iptos", cmd, f_iptos); break; case O_ICMPTYPE: print_icmptypes((ipfw_insn_u32 *)cmd); break; case O_ESTAB: printf(" established"); break; case O_TCPDATALEN: if (F_LEN(cmd) == 1) printf(" tcpdatalen %u", cmd->arg1 ); else print_newports((ipfw_insn_u16 *)cmd, 0, O_TCPDATALEN); break; case O_TCPFLAGS: print_flags("tcpflags", cmd, f_tcpflags); break; case O_TCPOPTS: print_flags("tcpoptions", cmd, f_tcpopts); break; case O_TCPWIN: printf(" tcpwin %d", ntohs(cmd->arg1)); break; case O_TCPACK: printf(" tcpack %d", ntohl(cmd32->d[0])); break; case O_TCPSEQ: printf(" tcpseq %d", ntohl(cmd32->d[0])); break; case O_UID: { struct passwd *pwd = getpwuid(cmd32->d[0]); if (pwd) printf(" uid %s", pwd->pw_name); else printf(" uid %u", cmd32->d[0]); } break; case O_GID: { struct group *grp = getgrgid(cmd32->d[0]); if (grp) printf(" gid %s", grp->gr_name); else printf(" gid %u", cmd32->d[0]); } break; case O_JAIL: printf(" jail %d", cmd32->d[0]); break; case O_VERREVPATH: printf(" verrevpath"); break; case O_VERSRCREACH: printf(" versrcreach"); break; case O_ANTISPOOF: printf(" antispoof"); break; case O_IPSEC: printf(" ipsec"); break; case O_NOP: comment = (char *)(cmd + 1); break; case O_KEEP_STATE: printf(" keep-state"); break; case O_LIMIT: { struct _s_x *p = limit_masks; ipfw_insn_limit *c = (ipfw_insn_limit *)cmd; uint8_t x = c->limit_mask; char const *comma = " "; printf(" limit"); for (; p->x != 0 ; p++) if ((x & p->x) == p->x) { x &= ~p->x; printf("%s%s", comma, p->s); comma = ","; } PRINT_UINT_ARG(" ", c->conn_limit); break; } case O_IP6: printf(" ip6"); break; case O_IP4: printf(" ip4"); break; case O_ICMP6TYPE: print_icmp6types((ipfw_insn_u32 *)cmd); break; case O_EXT_HDR: print_ext6hdr( (ipfw_insn *) cmd ); break; case O_TAGGED: if (F_LEN(cmd) == 1) PRINT_UINT_ARG(" tagged ", cmd->arg1); else print_newports((ipfw_insn_u16 *)cmd, 0, O_TAGGED); break; default: printf(" [opcode %d len %d]", cmd->opcode, cmd->len); } } if (cmd->len & F_OR) { printf(" or"); or_block = 1; } else if (or_block) { printf(" }"); or_block = 0; } } show_prerequisites(&flags, HAVE_PROTO | HAVE_SRCIP | HAVE_DSTIP | HAVE_IP, 0); if (comment) printf(" // %s", comment); printf("\n"); } static void show_dyn_ipfw(ipfw_dyn_rule *d, int pcwidth, int bcwidth) { struct protoent *pe; struct in_addr a; uint16_t rulenum; char buf[INET6_ADDRSTRLEN]; if (!co.do_expired) { if (!d->expire && !(d->dyn_type == O_LIMIT_PARENT)) return; } bcopy(&d->rule, &rulenum, sizeof(rulenum)); printf("%05d", rulenum); if (pcwidth > 0 || bcwidth > 0) { printf(" "); pr_u64(&d->pcnt, pcwidth); pr_u64(&d->bcnt, bcwidth); printf("(%ds)", d->expire); } switch (d->dyn_type) { case O_LIMIT_PARENT: printf(" PARENT %d", d->count); break; case O_LIMIT: printf(" LIMIT"); break; case O_KEEP_STATE: /* bidir, no mask */ printf(" STATE"); break; } if ((pe = getprotobynumber(d->id.proto)) != NULL) printf(" %s", pe->p_name); else printf(" proto %u", d->id.proto); if (d->id.addr_type == 4) { a.s_addr = htonl(d->id.src_ip); printf(" %s %d", inet_ntoa(a), d->id.src_port); a.s_addr = htonl(d->id.dst_ip); printf(" <-> %s %d", inet_ntoa(a), d->id.dst_port); } else if (d->id.addr_type == 6) { printf(" %s %d", inet_ntop(AF_INET6, &d->id.src_ip6, buf, sizeof(buf)), d->id.src_port); printf(" <-> %s %d", inet_ntop(AF_INET6, &d->id.dst_ip6, buf, sizeof(buf)), d->id.dst_port); } else printf(" UNKNOWN <-> UNKNOWN\n"); printf("\n"); } /* * This one handles all set-related commands * ipfw set { show | enable | disable } * ipfw set swap X Y * ipfw set move X to Y * ipfw set move rule X to Y */ void ipfw_sets_handler(char *av[]) { uint32_t set_disable, masks[2]; int i, nbytes; uint16_t rulenum; uint8_t cmd, new_set; av++; if (av[0] == NULL) errx(EX_USAGE, "set needs command"); if (_substrcmp(*av, "show") == 0) { void *data = NULL; char const *msg; int nalloc; nalloc = nbytes = sizeof(struct ip_fw); while (nbytes >= nalloc) { if (data) free(data); nalloc = nalloc * 2 + 200; nbytes = nalloc; data = safe_calloc(1, nbytes); if (do_cmd(IP_FW_GET, data, (uintptr_t)&nbytes) < 0) err(EX_OSERR, "getsockopt(IP_FW_GET)"); } bcopy(&((struct ip_fw *)data)->next_rule, &set_disable, sizeof(set_disable)); for (i = 0, msg = "disable" ; i < RESVD_SET; i++) if ((set_disable & (1< RESVD_SET) errx(EX_DATAERR, "invalid set number %s\n", av[0]); if (!isdigit(*(av[1])) || new_set > RESVD_SET) errx(EX_DATAERR, "invalid set number %s\n", av[1]); masks[0] = (4 << 24) | (new_set << 16) | (rulenum); i = do_cmd(IP_FW_DEL, masks, sizeof(uint32_t)); } else if (_substrcmp(*av, "move") == 0) { av++; if (av[0] && _substrcmp(*av, "rule") == 0) { cmd = 2; av++; } else cmd = 3; if (av[0] == NULL || av[1] == NULL || av[2] == NULL || av[3] != NULL || _substrcmp(av[1], "to") != 0) errx(EX_USAGE, "syntax: set move [rule] X to Y\n"); rulenum = atoi(av[0]); new_set = atoi(av[2]); if (!isdigit(*(av[0])) || (cmd == 3 && rulenum > RESVD_SET) || (cmd == 2 && rulenum == IPFW_DEFAULT_RULE) ) errx(EX_DATAERR, "invalid source number %s\n", av[0]); if (!isdigit(*(av[2])) || new_set > RESVD_SET) errx(EX_DATAERR, "invalid dest. set %s\n", av[1]); masks[0] = (cmd << 24) | (new_set << 16) | (rulenum); i = do_cmd(IP_FW_DEL, masks, sizeof(uint32_t)); } else if (_substrcmp(*av, "disable") == 0 || _substrcmp(*av, "enable") == 0 ) { int which = _substrcmp(*av, "enable") == 0 ? 1 : 0; av++; masks[0] = masks[1] = 0; while (av[0]) { if (isdigit(**av)) { i = atoi(*av); if (i < 0 || i > RESVD_SET) errx(EX_DATAERR, "invalid set number %d\n", i); masks[which] |= (1<= nalloc) { nalloc = nalloc * 2 + 200; nbytes = nalloc; data = safe_realloc(data, nbytes); if (do_cmd(ocmd, data, (uintptr_t)&nbytes) < 0) err(EX_OSERR, "getsockopt(IP_%s_GET)", co.do_pipe ? "DUMMYNET" : "FW"); } /* * Count static rules. They have variable size so we * need to scan the list to count them. */ for (nstat = 1, r = data, lim = (char *)data + nbytes; r->rulenum < IPFW_DEFAULT_RULE && (char *)r < lim; ++nstat, r = NEXT(r) ) ; /* nothing */ /* * Count dynamic rules. This is easier as they have * fixed size. */ r = NEXT(r); dynrules = (ipfw_dyn_rule *)r ; n = (char *)r - (char *)data; ndyn = (nbytes - n) / sizeof *dynrules; /* if showing stats, figure out column widths ahead of time */ bcwidth = pcwidth = 0; if (show_counters) { for (n = 0, r = data; n < nstat; n++, r = NEXT(r)) { /* skip rules from another set */ if (co.use_set && r->set != co.use_set - 1) continue; /* packet counter */ width = pr_u64(&r->pcnt, 0); if (width > pcwidth) pcwidth = width; /* byte counter */ width = pr_u64(&r->bcnt, 0); if (width > bcwidth) bcwidth = width; } } if (co.do_dynamic && ndyn) { for (n = 0, d = dynrules; n < ndyn; n++, d++) { if (co.use_set) { /* skip rules from another set */ bcopy((char *)&d->rule + sizeof(uint16_t), &set, sizeof(uint8_t)); if (set != co.use_set - 1) continue; } width = pr_u64(&d->pcnt, 0); if (width > pcwidth) pcwidth = width; width = pr_u64(&d->bcnt, 0); if (width > bcwidth) bcwidth = width; } } /* if no rule numbers were specified, list all rules */ if (ac == 0) { for (n = 0, r = data; n < nstat; n++, r = NEXT(r)) { if (co.use_set && r->set != co.use_set - 1) continue; show_ipfw(r, pcwidth, bcwidth); } if (co.do_dynamic && ndyn) { printf("## Dynamic rules (%d):\n", ndyn); for (n = 0, d = dynrules; n < ndyn; n++, d++) { if (co.use_set) { bcopy((char *)&d->rule + sizeof(uint16_t), &set, sizeof(uint8_t)); if (set != co.use_set - 1) continue; } show_dyn_ipfw(d, pcwidth, bcwidth); } } goto done; } /* display specific rules requested on command line */ for (lac = ac, lav = av; lac != 0; lac--) { /* convert command line rule # */ last = rnum = strtoul(*lav++, &endptr, 10); if (*endptr == '-') last = strtoul(endptr+1, &endptr, 10); if (*endptr) { exitval = EX_USAGE; warnx("invalid rule number: %s", *(lav - 1)); continue; } for (n = seen = 0, r = data; n < nstat; n++, r = NEXT(r) ) { if (r->rulenum > last) break; if (co.use_set && r->set != co.use_set - 1) continue; if (r->rulenum >= rnum && r->rulenum <= last) { show_ipfw(r, pcwidth, bcwidth); seen = 1; } } if (!seen) { /* give precedence to other error(s) */ if (exitval == EX_OK) exitval = EX_UNAVAILABLE; warnx("rule %lu does not exist", rnum); } } if (co.do_dynamic && ndyn) { printf("## Dynamic rules:\n"); for (lac = ac, lav = av; lac != 0; lac--) { last = rnum = strtoul(*lav++, &endptr, 10); if (*endptr == '-') last = strtoul(endptr+1, &endptr, 10); if (*endptr) /* already warned */ continue; for (n = 0, d = dynrules; n < ndyn; n++, d++) { uint16_t rulenum; bcopy(&d->rule, &rulenum, sizeof(rulenum)); if (rulenum > rnum) break; if (co.use_set) { bcopy((char *)&d->rule + sizeof(uint16_t), &set, sizeof(uint8_t)); if (set != co.use_set - 1) continue; } if (r->rulenum >= rnum && r->rulenum <= last) show_dyn_ipfw(d, pcwidth, bcwidth); } } } ac = 0; done: free(data); if (exitval != EX_OK) exit(exitval); #undef NEXT } static int lookup_host (char *host, struct in_addr *ipaddr) { struct hostent *he; if (!inet_aton(host, ipaddr)) { if ((he = gethostbyname(host)) == NULL) return(-1); *ipaddr = *(struct in_addr *)he->h_addr_list[0]; } return(0); } /* * fills the addr and mask fields in the instruction as appropriate from av. * Update length as appropriate. * The following formats are allowed: * me returns O_IP_*_ME * 1.2.3.4 single IP address * 1.2.3.4:5.6.7.8 address:mask * 1.2.3.4/24 address/mask * 1.2.3.4/26{1,6,5,4,23} set of addresses in a subnet * We can have multiple comma-separated address/mask entries. */ static void fill_ip(ipfw_insn_ip *cmd, char *av) { int len = 0; uint32_t *d = ((ipfw_insn_u32 *)cmd)->d; cmd->o.len &= ~F_LEN_MASK; /* zero len */ if (_substrcmp(av, "any") == 0) return; if (_substrcmp(av, "me") == 0) { cmd->o.len |= F_INSN_SIZE(ipfw_insn); return; } if (strncmp(av, "table(", 6) == 0) { char *p = strchr(av + 6, ','); if (p) *p++ = '\0'; cmd->o.opcode = O_IP_DST_LOOKUP; cmd->o.arg1 = strtoul(av + 6, NULL, 0); if (p) { cmd->o.len |= F_INSN_SIZE(ipfw_insn_u32); d[0] = strtoul(p, NULL, 0); } else cmd->o.len |= F_INSN_SIZE(ipfw_insn); return; } while (av) { /* * After the address we can have '/' or ':' indicating a mask, * ',' indicating another address follows, '{' indicating a * set of addresses of unspecified size. */ char *t = NULL, *p = strpbrk(av, "/:,{"); int masklen; char md, nd = '\0'; if (p) { md = *p; *p++ = '\0'; if ((t = strpbrk(p, ",{")) != NULL) { nd = *t; *t = '\0'; } } else md = '\0'; if (lookup_host(av, (struct in_addr *)&d[0]) != 0) errx(EX_NOHOST, "hostname ``%s'' unknown", av); switch (md) { case ':': if (!inet_aton(p, (struct in_addr *)&d[1])) errx(EX_DATAERR, "bad netmask ``%s''", p); break; case '/': masklen = atoi(p); if (masklen == 0) d[1] = htonl(0); /* mask */ else if (masklen > 32) errx(EX_DATAERR, "bad width ``%s''", p); else d[1] = htonl(~0 << (32 - masklen)); break; case '{': /* no mask, assume /24 and put back the '{' */ d[1] = htonl(~0 << (32 - 24)); *(--p) = md; break; case ',': /* single address plus continuation */ *(--p) = md; /* FALLTHROUGH */ case 0: /* initialization value */ default: d[1] = htonl(~0); /* force /32 */ break; } d[0] &= d[1]; /* mask base address with mask */ if (t) *t = nd; /* find next separator */ if (p) p = strpbrk(p, ",{"); if (p && *p == '{') { /* * We have a set of addresses. They are stored as follows: * arg1 is the set size (powers of 2, 2..256) * addr is the base address IN HOST FORMAT * mask.. is an array of arg1 bits (rounded up to * the next multiple of 32) with bits set * for each host in the map. */ uint32_t *map = (uint32_t *)&cmd->mask; int low, high; int i = contigmask((uint8_t *)&(d[1]), 32); if (len > 0) errx(EX_DATAERR, "address set cannot be in a list"); if (i < 24 || i > 31) errx(EX_DATAERR, "invalid set with mask %d\n", i); cmd->o.arg1 = 1<<(32-i); /* map length */ d[0] = ntohl(d[0]); /* base addr in host format */ cmd->o.opcode = O_IP_DST_SET; /* default */ cmd->o.len |= F_INSN_SIZE(ipfw_insn_u32) + (cmd->o.arg1+31)/32; for (i = 0; i < (cmd->o.arg1+31)/32 ; i++) map[i] = 0; /* clear map */ av = p + 1; low = d[0] & 0xff; high = low + cmd->o.arg1 - 1; /* * Here, i stores the previous value when we specify a range * of addresses within a mask, e.g. 45-63. i = -1 means we * have no previous value. */ i = -1; /* previous value in a range */ while (isdigit(*av)) { char *s; int a = strtol(av, &s, 0); if (s == av) { /* no parameter */ if (*av != '}') errx(EX_DATAERR, "set not closed\n"); if (i != -1) errx(EX_DATAERR, "incomplete range %d-", i); break; } if (a < low || a > high) errx(EX_DATAERR, "addr %d out of range [%d-%d]\n", a, low, high); a -= low; if (i == -1) /* no previous in range */ i = a; else { /* check that range is valid */ if (i > a) errx(EX_DATAERR, "invalid range %d-%d", i+low, a+low); if (*s == '-') errx(EX_DATAERR, "double '-' in range"); } for (; i <= a; i++) map[i/32] |= 1<<(i & 31); i = -1; if (*s == '-') i = a; else if (*s == '}') break; av = s+1; } return; } av = p; if (av) /* then *av must be a ',' */ av++; /* Check this entry */ if (d[1] == 0) { /* "any", specified as x.x.x.x/0 */ /* * 'any' turns the entire list into a NOP. * 'not any' never matches, so it is removed from the * list unless it is the only item, in which case we * report an error. */ if (cmd->o.len & F_NOT) { /* "not any" never matches */ if (av == NULL && len == 0) /* only this entry */ errx(EX_DATAERR, "not any never matches"); } /* else do nothing and skip this entry */ return; } /* A single IP can be stored in an optimized format */ if (d[1] == (uint32_t)~0 && av == NULL && len == 0) { cmd->o.len |= F_INSN_SIZE(ipfw_insn_u32); return; } len += 2; /* two words... */ d += 2; } /* end while */ if (len + 1 > F_LEN_MASK) errx(EX_DATAERR, "address list too long"); cmd->o.len |= len+1; } /* n2mask sets n bits of the mask */ void n2mask(struct in6_addr *mask, int n) { static int minimask[9] = { 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff }; u_char *p; memset(mask, 0, sizeof(struct in6_addr)); p = (u_char *) mask; for (; n > 0; p++, n -= 8) { if (n >= 8) *p = 0xff; else *p = minimask[n]; } return; } /* * helper function to process a set of flags and set bits in the * appropriate masks. */ static void fill_flags(ipfw_insn *cmd, enum ipfw_opcodes opcode, struct _s_x *flags, char *p) { uint8_t set=0, clear=0; while (p && *p) { char *q; /* points to the separator */ int val; uint8_t *which; /* mask we are working on */ if (*p == '!') { p++; which = &clear; } else which = &set; q = strchr(p, ','); if (q) *q++ = '\0'; val = match_token(flags, p); if (val <= 0) errx(EX_DATAERR, "invalid flag %s", p); *which |= (uint8_t)val; p = q; } cmd->opcode = opcode; cmd->len = (cmd->len & (F_NOT | F_OR)) | 1; cmd->arg1 = (set & 0xff) | ( (clear & 0xff) << 8); } void ipfw_delete(char *av[]) { uint32_t rulenum; int i; int exitval = EX_OK; int do_set = 0; av++; NEED1("missing rule specification"); if ( *av && _substrcmp(*av, "set") == 0) { /* Do not allow using the following syntax: * ipfw set N delete set M */ if (co.use_set) errx(EX_DATAERR, "invalid syntax"); do_set = 1; /* delete set */ av++; } /* Rule number */ while (*av && isdigit(**av)) { i = atoi(*av); av++; if (co.do_nat) { exitval = do_cmd(IP_FW_NAT_DEL, &i, sizeof i); if (exitval) { exitval = EX_UNAVAILABLE; warn("rule %u not available", i); } } else if (co.do_pipe) { exitval = ipfw_delete_pipe(co.do_pipe, i); } else { if (co.use_set) rulenum = (i & 0xffff) | (5 << 24) | ((co.use_set - 1) << 16); else rulenum = (i & 0xffff) | (do_set << 24); i = do_cmd(IP_FW_DEL, &rulenum, sizeof rulenum); if (i) { exitval = EX_UNAVAILABLE; warn("rule %u: setsockopt(IP_FW_DEL)", rulenum); } } } if (exitval != EX_OK) exit(exitval); } /* * fill the interface structure. We do not check the name as we can * create interfaces dynamically, so checking them at insert time * makes relatively little sense. * Interface names containing '*', '?', or '[' are assumed to be shell * patterns which match interfaces. */ static void fill_iface(ipfw_insn_if *cmd, char *arg) { cmd->name[0] = '\0'; cmd->o.len |= F_INSN_SIZE(ipfw_insn_if); /* Parse the interface or address */ if (strcmp(arg, "any") == 0) cmd->o.len = 0; /* effectively ignore this command */ else if (!isdigit(*arg)) { strlcpy(cmd->name, arg, sizeof(cmd->name)); cmd->p.glob = strpbrk(arg, "*?[") != NULL ? 1 : 0; } else if (!inet_aton(arg, &cmd->p.ip)) errx(EX_DATAERR, "bad ip address ``%s''", arg); } static void get_mac_addr_mask(const char *p, uint8_t *addr, uint8_t *mask) { int i; size_t l; char *ap, *ptr, *optr; struct ether_addr *mac; const char *macset = "0123456789abcdefABCDEF:"; if (strcmp(p, "any") == 0) { for (i = 0; i < ETHER_ADDR_LEN; i++) addr[i] = mask[i] = 0; return; } optr = ptr = strdup(p); if ((ap = strsep(&ptr, "&/")) != NULL && *ap != 0) { l = strlen(ap); if (strspn(ap, macset) != l || (mac = ether_aton(ap)) == NULL) errx(EX_DATAERR, "Incorrect MAC address"); bcopy(mac, addr, ETHER_ADDR_LEN); } else errx(EX_DATAERR, "Incorrect MAC address"); if (ptr != NULL) { /* we have mask? */ if (p[ptr - optr - 1] == '/') { /* mask len */ long ml = strtol(ptr, &ap, 10); if (*ap != 0 || ml > ETHER_ADDR_LEN * 8 || ml < 0) errx(EX_DATAERR, "Incorrect mask length"); for (i = 0; ml > 0 && i < ETHER_ADDR_LEN; ml -= 8, i++) mask[i] = (ml >= 8) ? 0xff: (~0) << (8 - ml); } else { /* mask */ l = strlen(ptr); if (strspn(ptr, macset) != l || (mac = ether_aton(ptr)) == NULL) errx(EX_DATAERR, "Incorrect mask"); bcopy(mac, mask, ETHER_ADDR_LEN); } } else { /* default mask: ff:ff:ff:ff:ff:ff */ for (i = 0; i < ETHER_ADDR_LEN; i++) mask[i] = 0xff; } for (i = 0; i < ETHER_ADDR_LEN; i++) addr[i] &= mask[i]; free(optr); } /* * helper function, updates the pointer to cmd with the length * of the current command, and also cleans up the first word of * the new command in case it has been clobbered before. */ static ipfw_insn * next_cmd(ipfw_insn *cmd) { cmd += F_LEN(cmd); bzero(cmd, sizeof(*cmd)); return cmd; } /* * Takes arguments and copies them into a comment */ static void fill_comment(ipfw_insn *cmd, char **av) { int i, l; char *p = (char *)(cmd + 1); cmd->opcode = O_NOP; cmd->len = (cmd->len & (F_NOT | F_OR)); /* Compute length of comment string. */ for (i = 0, l = 0; av[i] != NULL; i++) l += strlen(av[i]) + 1; if (l == 0) return; if (l > 84) errx(EX_DATAERR, "comment too long (max 80 chars)"); l = 1 + (l+3)/4; cmd->len = (cmd->len & (F_NOT | F_OR)) | l; for (i = 0; av[i] != NULL; i++) { strcpy(p, av[i]); p += strlen(av[i]); *p++ = ' '; } *(--p) = '\0'; } /* * A function to fill simple commands of size 1. * Existing flags are preserved. */ static void fill_cmd(ipfw_insn *cmd, enum ipfw_opcodes opcode, int flags, uint16_t arg) { cmd->opcode = opcode; cmd->len = ((cmd->len | flags) & (F_NOT | F_OR)) | 1; cmd->arg1 = arg; } /* * Fetch and add the MAC address and type, with masks. This generates one or * two microinstructions, and returns the pointer to the last one. */ static ipfw_insn * add_mac(ipfw_insn *cmd, char *av[]) { ipfw_insn_mac *mac; if ( ( av[0] == NULL ) || ( av[1] == NULL ) ) errx(EX_DATAERR, "MAC dst src"); cmd->opcode = O_MACADDR2; cmd->len = (cmd->len & (F_NOT | F_OR)) | F_INSN_SIZE(ipfw_insn_mac); mac = (ipfw_insn_mac *)cmd; get_mac_addr_mask(av[0], mac->addr, mac->mask); /* dst */ get_mac_addr_mask(av[1], &(mac->addr[ETHER_ADDR_LEN]), &(mac->mask[ETHER_ADDR_LEN])); /* src */ return cmd; } static ipfw_insn * add_mactype(ipfw_insn *cmd, char *av) { if (!av) errx(EX_DATAERR, "missing MAC type"); if (strcmp(av, "any") != 0) { /* we have a non-null type */ fill_newports((ipfw_insn_u16 *)cmd, av, IPPROTO_ETHERTYPE); cmd->opcode = O_MAC_TYPE; return cmd; } else return NULL; } static ipfw_insn * add_proto0(ipfw_insn *cmd, char *av, u_char *protop) { struct protoent *pe; char *ep; int proto; proto = strtol(av, &ep, 10); if (*ep != '\0' || proto <= 0) { if ((pe = getprotobyname(av)) == NULL) return NULL; proto = pe->p_proto; } fill_cmd(cmd, O_PROTO, 0, proto); *protop = proto; return cmd; } static ipfw_insn * add_proto(ipfw_insn *cmd, char *av, u_char *protop) { u_char proto = IPPROTO_IP; if (_substrcmp(av, "all") == 0 || strcmp(av, "ip") == 0) ; /* do not set O_IP4 nor O_IP6 */ else if (strcmp(av, "ip4") == 0) /* explicit "just IPv4" rule */ fill_cmd(cmd, O_IP4, 0, 0); else if (strcmp(av, "ip6") == 0) { /* explicit "just IPv6" rule */ proto = IPPROTO_IPV6; fill_cmd(cmd, O_IP6, 0, 0); } else return add_proto0(cmd, av, protop); *protop = proto; return cmd; } static ipfw_insn * add_proto_compat(ipfw_insn *cmd, char *av, u_char *protop) { u_char proto = IPPROTO_IP; if (_substrcmp(av, "all") == 0 || strcmp(av, "ip") == 0) ; /* do not set O_IP4 nor O_IP6 */ else if (strcmp(av, "ipv4") == 0 || strcmp(av, "ip4") == 0) /* explicit "just IPv4" rule */ fill_cmd(cmd, O_IP4, 0, 0); else if (strcmp(av, "ipv6") == 0 || strcmp(av, "ip6") == 0) { /* explicit "just IPv6" rule */ proto = IPPROTO_IPV6; fill_cmd(cmd, O_IP6, 0, 0); } else return add_proto0(cmd, av, protop); *protop = proto; return cmd; } static ipfw_insn * add_srcip(ipfw_insn *cmd, char *av) { fill_ip((ipfw_insn_ip *)cmd, av); if (cmd->opcode == O_IP_DST_SET) /* set */ cmd->opcode = O_IP_SRC_SET; else if (cmd->opcode == O_IP_DST_LOOKUP) /* table */ cmd->opcode = O_IP_SRC_LOOKUP; else if (F_LEN(cmd) == F_INSN_SIZE(ipfw_insn)) /* me */ cmd->opcode = O_IP_SRC_ME; else if (F_LEN(cmd) == F_INSN_SIZE(ipfw_insn_u32)) /* one IP */ cmd->opcode = O_IP_SRC; else /* addr/mask */ cmd->opcode = O_IP_SRC_MASK; return cmd; } static ipfw_insn * add_dstip(ipfw_insn *cmd, char *av) { fill_ip((ipfw_insn_ip *)cmd, av); if (cmd->opcode == O_IP_DST_SET) /* set */ ; else if (cmd->opcode == O_IP_DST_LOOKUP) /* table */ ; else if (F_LEN(cmd) == F_INSN_SIZE(ipfw_insn)) /* me */ cmd->opcode = O_IP_DST_ME; else if (F_LEN(cmd) == F_INSN_SIZE(ipfw_insn_u32)) /* one IP */ cmd->opcode = O_IP_DST; else /* addr/mask */ cmd->opcode = O_IP_DST_MASK; return cmd; } static ipfw_insn * add_ports(ipfw_insn *cmd, char *av, u_char proto, int opcode) { /* XXX "any" is trapped before. Perhaps "to" */ if (_substrcmp(av, "any") == 0) { return NULL; } else if (fill_newports((ipfw_insn_u16 *)cmd, av, proto)) { /* XXX todo: check that we have a protocol with ports */ cmd->opcode = opcode; return cmd; } return NULL; } static ipfw_insn * add_src(ipfw_insn *cmd, char *av, u_char proto) { struct in6_addr a; char *host, *ch; ipfw_insn *ret = NULL; if ((host = strdup(av)) == NULL) return NULL; if ((ch = strrchr(host, '/')) != NULL) *ch = '\0'; if (proto == IPPROTO_IPV6 || strcmp(av, "me6") == 0 || inet_pton(AF_INET6, host, &a) == 1) ret = add_srcip6(cmd, av); /* XXX: should check for IPv4, not !IPv6 */ if (ret == NULL && (proto == IPPROTO_IP || strcmp(av, "me") == 0 || inet_pton(AF_INET6, host, &a) != 1)) ret = add_srcip(cmd, av); if (ret == NULL && strcmp(av, "any") != 0) ret = cmd; free(host); return ret; } static ipfw_insn * add_dst(ipfw_insn *cmd, char *av, u_char proto) { struct in6_addr a; char *host, *ch; ipfw_insn *ret = NULL; if ((host = strdup(av)) == NULL) return NULL; if ((ch = strrchr(host, '/')) != NULL) *ch = '\0'; if (proto == IPPROTO_IPV6 || strcmp(av, "me6") == 0 || inet_pton(AF_INET6, host, &a) == 1) ret = add_dstip6(cmd, av); /* XXX: should check for IPv4, not !IPv6 */ if (ret == NULL && (proto == IPPROTO_IP || strcmp(av, "me") == 0 || inet_pton(AF_INET6, host, &a) != 1)) ret = add_dstip(cmd, av); if (ret == NULL && strcmp(av, "any") != 0) ret = cmd; free(host); return ret; } /* * Parse arguments and assemble the microinstructions which make up a rule. * Rules are added into the 'rulebuf' and then copied in the correct order * into the actual rule. * * The syntax for a rule starts with the action, followed by * optional action parameters, and the various match patterns. * In the assembled microcode, the first opcode must be an O_PROBE_STATE * (generated if the rule includes a keep-state option), then the * various match patterns, log/altq actions, and the actual action. * */ void ipfw_add(char *av[]) { /* * rules are added into the 'rulebuf' and then copied in * the correct order into the actual rule. * Some things that need to go out of order (prob, action etc.) * go into actbuf[]. */ static uint32_t rulebuf[255], actbuf[255], cmdbuf[255]; ipfw_insn *src, *dst, *cmd, *action, *prev=NULL; ipfw_insn *first_cmd; /* first match pattern */ struct ip_fw *rule; /* * various flags used to record that we entered some fields. */ ipfw_insn *have_state = NULL; /* check-state or keep-state */ ipfw_insn *have_log = NULL, *have_altq = NULL, *have_tag = NULL; size_t len; int i; int open_par = 0; /* open parenthesis ( */ /* proto is here because it is used to fetch ports */ u_char proto = IPPROTO_IP; /* default protocol */ double match_prob = 1; /* match probability, default is always match */ bzero(actbuf, sizeof(actbuf)); /* actions go here */ bzero(cmdbuf, sizeof(cmdbuf)); bzero(rulebuf, sizeof(rulebuf)); rule = (struct ip_fw *)rulebuf; cmd = (ipfw_insn *)cmdbuf; action = (ipfw_insn *)actbuf; av++; /* [rule N] -- Rule number optional */ if (av[0] && isdigit(**av)) { rule->rulenum = atoi(*av); av++; } /* [set N] -- set number (0..RESVD_SET), optional */ if (av[0] && av[1] && _substrcmp(*av, "set") == 0) { int set = strtoul(av[1], NULL, 10); if (set < 0 || set > RESVD_SET) errx(EX_DATAERR, "illegal set %s", av[1]); rule->set = set; av += 2; } /* [prob D] -- match probability, optional */ if (av[0] && av[1] && _substrcmp(*av, "prob") == 0) { match_prob = strtod(av[1], NULL); if (match_prob <= 0 || match_prob > 1) errx(EX_DATAERR, "illegal match prob. %s", av[1]); av += 2; } /* action -- mandatory */ NEED1("missing action"); i = match_token(rule_actions, *av); av++; action->len = 1; /* default */ switch(i) { case TOK_CHECKSTATE: have_state = action; action->opcode = O_CHECK_STATE; break; case TOK_ACCEPT: action->opcode = O_ACCEPT; break; case TOK_DENY: action->opcode = O_DENY; action->arg1 = 0; break; case TOK_REJECT: action->opcode = O_REJECT; action->arg1 = ICMP_UNREACH_HOST; break; case TOK_RESET: action->opcode = O_REJECT; action->arg1 = ICMP_REJECT_RST; break; case TOK_RESET6: action->opcode = O_UNREACH6; action->arg1 = ICMP6_UNREACH_RST; break; case TOK_UNREACH: action->opcode = O_REJECT; NEED1("missing reject code"); fill_reject_code(&action->arg1, *av); av++; break; case TOK_UNREACH6: action->opcode = O_UNREACH6; NEED1("missing unreach code"); fill_unreach6_code(&action->arg1, *av); av++; break; case TOK_COUNT: action->opcode = O_COUNT; break; case TOK_NAT: action->opcode = O_NAT; action->len = F_INSN_SIZE(ipfw_insn_nat); goto chkarg; case TOK_QUEUE: action->opcode = O_QUEUE; goto chkarg; case TOK_PIPE: action->opcode = O_PIPE; goto chkarg; case TOK_SKIPTO: action->opcode = O_SKIPTO; goto chkarg; case TOK_NETGRAPH: action->opcode = O_NETGRAPH; goto chkarg; case TOK_NGTEE: action->opcode = O_NGTEE; goto chkarg; case TOK_DIVERT: action->opcode = O_DIVERT; goto chkarg; case TOK_TEE: action->opcode = O_TEE; goto chkarg; case TOK_CALL: action->opcode = O_CALLRETURN; chkarg: if (!av[0]) errx(EX_USAGE, "missing argument for %s", *(av - 1)); if (isdigit(**av)) { action->arg1 = strtoul(*av, NULL, 10); if (action->arg1 <= 0 || action->arg1 >= IP_FW_TABLEARG) errx(EX_DATAERR, "illegal argument for %s", *(av - 1)); } else if (_substrcmp(*av, "tablearg") == 0) { action->arg1 = IP_FW_TABLEARG; } else if (i == TOK_DIVERT || i == TOK_TEE) { struct servent *s; setservent(1); s = getservbyname(av[0], "divert"); if (s != NULL) action->arg1 = ntohs(s->s_port); else errx(EX_DATAERR, "illegal divert/tee port"); } else errx(EX_DATAERR, "illegal argument for %s", *(av - 1)); av++; break; case TOK_FORWARD: { ipfw_insn_sa *p = (ipfw_insn_sa *)action; char *s, *end; NEED1("missing forward address[:port]"); action->opcode = O_FORWARD_IP; action->len = F_INSN_SIZE(ipfw_insn_sa); /* * In the kernel we assume AF_INET and use only * sin_port and sin_addr. Remember to set sin_len as * the routing code seems to use it too. */ p->sa.sin_family = AF_INET; p->sa.sin_len = sizeof(struct sockaddr_in); p->sa.sin_port = 0; /* * locate the address-port separator (':' or ',') */ s = strchr(*av, ':'); if (s == NULL) s = strchr(*av, ','); if (s != NULL) { *(s++) = '\0'; i = strtoport(s, &end, 0 /* base */, 0 /* proto */); if (s == end) errx(EX_DATAERR, "illegal forwarding port ``%s''", s); p->sa.sin_port = (u_short)i; } if (_substrcmp(*av, "tablearg") == 0) p->sa.sin_addr.s_addr = INADDR_ANY; else lookup_host(*av, &(p->sa.sin_addr)); av++; break; } case TOK_COMMENT: /* pretend it is a 'count' rule followed by the comment */ action->opcode = O_COUNT; av--; /* go back... */ break; case TOK_SETFIB: { int numfibs; size_t intsize = sizeof(int); action->opcode = O_SETFIB; NEED1("missing fib number"); action->arg1 = strtoul(*av, NULL, 10); if (sysctlbyname("net.fibs", &numfibs, &intsize, NULL, 0) == -1) errx(EX_DATAERR, "fibs not suported.\n"); if (action->arg1 >= numfibs) /* Temporary */ errx(EX_DATAERR, "fib too large.\n"); av++; break; } case TOK_REASS: action->opcode = O_REASS; break; case TOK_RETURN: fill_cmd(action, O_CALLRETURN, F_NOT, 0); break; default: errx(EX_DATAERR, "invalid action %s\n", av[-1]); } action = next_cmd(action); /* * [altq queuename] -- altq tag, optional * [log [logamount N]] -- log, optional * * If they exist, it go first in the cmdbuf, but then it is * skipped in the copy section to the end of the buffer. */ while (av[0] != NULL && (i = match_token(rule_action_params, *av)) != -1) { av++; switch (i) { case TOK_LOG: { ipfw_insn_log *c = (ipfw_insn_log *)cmd; int l; if (have_log) errx(EX_DATAERR, "log cannot be specified more than once"); have_log = (ipfw_insn *)c; cmd->len = F_INSN_SIZE(ipfw_insn_log); cmd->opcode = O_LOG; if (av[0] && _substrcmp(*av, "logamount") == 0) { av++; NEED1("logamount requires argument"); l = atoi(*av); if (l < 0) errx(EX_DATAERR, "logamount must be positive"); c->max_log = l; av++; } else { len = sizeof(c->max_log); if (sysctlbyname("net.inet.ip.fw.verbose_limit", &c->max_log, &len, NULL, 0) == -1) errx(1, "sysctlbyname(\"%s\")", "net.inet.ip.fw.verbose_limit"); } } break; #ifndef NO_ALTQ case TOK_ALTQ: { ipfw_insn_altq *a = (ipfw_insn_altq *)cmd; NEED1("missing altq queue name"); if (have_altq) errx(EX_DATAERR, "altq cannot be specified more than once"); have_altq = (ipfw_insn *)a; cmd->len = F_INSN_SIZE(ipfw_insn_altq); cmd->opcode = O_ALTQ; a->qid = altq_name_to_qid(*av); av++; } break; #endif case TOK_TAG: case TOK_UNTAG: { uint16_t tag; if (have_tag) errx(EX_USAGE, "tag and untag cannot be " "specified more than once"); GET_UINT_ARG(tag, IPFW_ARG_MIN, IPFW_ARG_MAX, i, rule_action_params); have_tag = cmd; fill_cmd(cmd, O_TAG, (i == TOK_TAG) ? 0: F_NOT, tag); av++; break; } default: abort(); } cmd = next_cmd(cmd); } if (have_state) /* must be a check-state, we are done */ goto done; #define OR_START(target) \ if (av[0] && (*av[0] == '(' || *av[0] == '{')) { \ if (open_par) \ errx(EX_USAGE, "nested \"(\" not allowed\n"); \ prev = NULL; \ open_par = 1; \ if ( (av[0])[1] == '\0') { \ av++; \ } else \ (*av)++; \ } \ target: \ #define CLOSE_PAR \ if (open_par) { \ if (av[0] && ( \ strcmp(*av, ")") == 0 || \ strcmp(*av, "}") == 0)) { \ prev = NULL; \ open_par = 0; \ av++; \ } else \ errx(EX_USAGE, "missing \")\"\n"); \ } #define NOT_BLOCK \ if (av[0] && _substrcmp(*av, "not") == 0) { \ if (cmd->len & F_NOT) \ errx(EX_USAGE, "double \"not\" not allowed\n"); \ cmd->len |= F_NOT; \ av++; \ } #define OR_BLOCK(target) \ if (av[0] && _substrcmp(*av, "or") == 0) { \ if (prev == NULL || open_par == 0) \ errx(EX_DATAERR, "invalid OR block"); \ prev->len |= F_OR; \ av++; \ goto target; \ } \ CLOSE_PAR; first_cmd = cmd; #if 0 /* * MAC addresses, optional. * If we have this, we skip the part "proto from src to dst" * and jump straight to the option parsing. */ NOT_BLOCK; NEED1("missing protocol"); if (_substrcmp(*av, "MAC") == 0 || _substrcmp(*av, "mac") == 0) { av++; /* the "MAC" keyword */ add_mac(cmd, av); /* exits in case of errors */ cmd = next_cmd(cmd); av += 2; /* dst-mac and src-mac */ NOT_BLOCK; NEED1("missing mac type"); if (add_mactype(cmd, av[0])) cmd = next_cmd(cmd); av++; /* any or mac-type */ goto read_options; } #endif /* * protocol, mandatory */ OR_START(get_proto); NOT_BLOCK; NEED1("missing protocol"); if (add_proto_compat(cmd, *av, &proto)) { av++; if (F_LEN(cmd) != 0) { prev = cmd; cmd = next_cmd(cmd); } } else if (first_cmd != cmd) { errx(EX_DATAERR, "invalid protocol ``%s''", *av); } else goto read_options; OR_BLOCK(get_proto); /* * "from", mandatory */ if ((av[0] == NULL) || _substrcmp(*av, "from") != 0) errx(EX_USAGE, "missing ``from''"); av++; /* * source IP, mandatory */ OR_START(source_ip); NOT_BLOCK; /* optional "not" */ NEED1("missing source address"); if (add_src(cmd, *av, proto)) { av++; if (F_LEN(cmd) != 0) { /* ! any */ prev = cmd; cmd = next_cmd(cmd); } } else errx(EX_USAGE, "bad source address %s", *av); OR_BLOCK(source_ip); /* * source ports, optional */ NOT_BLOCK; /* optional "not" */ if ( av[0] != NULL ) { if (_substrcmp(*av, "any") == 0 || add_ports(cmd, *av, proto, O_IP_SRCPORT)) { av++; if (F_LEN(cmd) != 0) cmd = next_cmd(cmd); } } /* * "to", mandatory */ if ( (av[0] == NULL) || _substrcmp(*av, "to") != 0 ) errx(EX_USAGE, "missing ``to''"); av++; /* * destination, mandatory */ OR_START(dest_ip); NOT_BLOCK; /* optional "not" */ NEED1("missing dst address"); if (add_dst(cmd, *av, proto)) { av++; if (F_LEN(cmd) != 0) { /* ! any */ prev = cmd; cmd = next_cmd(cmd); } } else errx( EX_USAGE, "bad destination address %s", *av); OR_BLOCK(dest_ip); /* * dest. ports, optional */ NOT_BLOCK; /* optional "not" */ if (av[0]) { if (_substrcmp(*av, "any") == 0 || add_ports(cmd, *av, proto, O_IP_DSTPORT)) { av++; if (F_LEN(cmd) != 0) cmd = next_cmd(cmd); } } read_options: if (av[0] && first_cmd == cmd) { /* * nothing specified so far, store in the rule to ease * printout later. */ rule->_pad = 1; } prev = NULL; while ( av[0] != NULL ) { char *s; ipfw_insn_u32 *cmd32; /* alias for cmd */ s = *av; cmd32 = (ipfw_insn_u32 *)cmd; if (*s == '!') { /* alternate syntax for NOT */ if (cmd->len & F_NOT) errx(EX_USAGE, "double \"not\" not allowed\n"); cmd->len = F_NOT; s++; } i = match_token(rule_options, s); av++; switch(i) { case TOK_NOT: if (cmd->len & F_NOT) errx(EX_USAGE, "double \"not\" not allowed\n"); cmd->len = F_NOT; break; case TOK_OR: if (open_par == 0 || prev == NULL) errx(EX_USAGE, "invalid \"or\" block\n"); prev->len |= F_OR; break; case TOK_STARTBRACE: if (open_par) errx(EX_USAGE, "+nested \"(\" not allowed\n"); open_par = 1; break; case TOK_ENDBRACE: if (!open_par) errx(EX_USAGE, "+missing \")\"\n"); open_par = 0; prev = NULL; break; case TOK_IN: fill_cmd(cmd, O_IN, 0, 0); break; case TOK_OUT: cmd->len ^= F_NOT; /* toggle F_NOT */ fill_cmd(cmd, O_IN, 0, 0); break; case TOK_DIVERTED: fill_cmd(cmd, O_DIVERTED, 0, 3); break; case TOK_DIVERTEDLOOPBACK: fill_cmd(cmd, O_DIVERTED, 0, 1); break; case TOK_DIVERTEDOUTPUT: fill_cmd(cmd, O_DIVERTED, 0, 2); break; case TOK_FRAG: fill_cmd(cmd, O_FRAG, 0, 0); break; case TOK_LAYER2: fill_cmd(cmd, O_LAYER2, 0, 0); break; case TOK_XMIT: case TOK_RECV: case TOK_VIA: NEED1("recv, xmit, via require interface name" " or address"); fill_iface((ipfw_insn_if *)cmd, av[0]); av++; if (F_LEN(cmd) == 0) /* not a valid address */ break; if (i == TOK_XMIT) cmd->opcode = O_XMIT; else if (i == TOK_RECV) cmd->opcode = O_RECV; else if (i == TOK_VIA) cmd->opcode = O_VIA; break; case TOK_ICMPTYPES: NEED1("icmptypes requires list of types"); fill_icmptypes((ipfw_insn_u32 *)cmd, *av); av++; break; case TOK_ICMP6TYPES: NEED1("icmptypes requires list of types"); fill_icmp6types((ipfw_insn_icmp6 *)cmd, *av); av++; break; case TOK_IPTTL: NEED1("ipttl requires TTL"); if (strpbrk(*av, "-,")) { if (!add_ports(cmd, *av, 0, O_IPTTL)) errx(EX_DATAERR, "invalid ipttl %s", *av); } else fill_cmd(cmd, O_IPTTL, 0, strtoul(*av, NULL, 0)); av++; break; case TOK_IPID: NEED1("ipid requires id"); if (strpbrk(*av, "-,")) { if (!add_ports(cmd, *av, 0, O_IPID)) errx(EX_DATAERR, "invalid ipid %s", *av); } else fill_cmd(cmd, O_IPID, 0, strtoul(*av, NULL, 0)); av++; break; case TOK_IPLEN: NEED1("iplen requires length"); if (strpbrk(*av, "-,")) { if (!add_ports(cmd, *av, 0, O_IPLEN)) errx(EX_DATAERR, "invalid ip len %s", *av); } else fill_cmd(cmd, O_IPLEN, 0, strtoul(*av, NULL, 0)); av++; break; case TOK_IPVER: NEED1("ipver requires version"); fill_cmd(cmd, O_IPVER, 0, strtoul(*av, NULL, 0)); av++; break; case TOK_IPPRECEDENCE: NEED1("ipprecedence requires value"); fill_cmd(cmd, O_IPPRECEDENCE, 0, (strtoul(*av, NULL, 0) & 7) << 5); av++; break; case TOK_IPOPTS: NEED1("missing argument for ipoptions"); fill_flags(cmd, O_IPOPT, f_ipopts, *av); av++; break; case TOK_IPTOS: NEED1("missing argument for iptos"); fill_flags(cmd, O_IPTOS, f_iptos, *av); av++; break; case TOK_UID: NEED1("uid requires argument"); { char *end; uid_t uid; struct passwd *pwd; cmd->opcode = O_UID; uid = strtoul(*av, &end, 0); pwd = (*end == '\0') ? getpwuid(uid) : getpwnam(*av); if (pwd == NULL) errx(EX_DATAERR, "uid \"%s\" nonexistent", *av); cmd32->d[0] = pwd->pw_uid; cmd->len |= F_INSN_SIZE(ipfw_insn_u32); av++; } break; case TOK_GID: NEED1("gid requires argument"); { char *end; gid_t gid; struct group *grp; cmd->opcode = O_GID; gid = strtoul(*av, &end, 0); grp = (*end == '\0') ? getgrgid(gid) : getgrnam(*av); if (grp == NULL) errx(EX_DATAERR, "gid \"%s\" nonexistent", *av); cmd32->d[0] = grp->gr_gid; cmd->len |= F_INSN_SIZE(ipfw_insn_u32); av++; } break; case TOK_JAIL: NEED1("jail requires argument"); { char *end; int jid; cmd->opcode = O_JAIL; jid = (int)strtol(*av, &end, 0); if (jid < 0 || *end != '\0') errx(EX_DATAERR, "jail requires prison ID"); cmd32->d[0] = (uint32_t)jid; cmd->len |= F_INSN_SIZE(ipfw_insn_u32); av++; } break; case TOK_ESTAB: fill_cmd(cmd, O_ESTAB, 0, 0); break; case TOK_SETUP: fill_cmd(cmd, O_TCPFLAGS, 0, (TH_SYN) | ( (TH_ACK) & 0xff) <<8 ); break; case TOK_TCPDATALEN: NEED1("tcpdatalen requires length"); if (strpbrk(*av, "-,")) { if (!add_ports(cmd, *av, 0, O_TCPDATALEN)) errx(EX_DATAERR, "invalid tcpdata len %s", *av); } else fill_cmd(cmd, O_TCPDATALEN, 0, strtoul(*av, NULL, 0)); av++; break; case TOK_TCPOPTS: NEED1("missing argument for tcpoptions"); fill_flags(cmd, O_TCPOPTS, f_tcpopts, *av); av++; break; case TOK_TCPSEQ: case TOK_TCPACK: NEED1("tcpseq/tcpack requires argument"); cmd->len = F_INSN_SIZE(ipfw_insn_u32); cmd->opcode = (i == TOK_TCPSEQ) ? O_TCPSEQ : O_TCPACK; cmd32->d[0] = htonl(strtoul(*av, NULL, 0)); av++; break; case TOK_TCPWIN: NEED1("tcpwin requires length"); fill_cmd(cmd, O_TCPWIN, 0, htons(strtoul(*av, NULL, 0))); av++; break; case TOK_TCPFLAGS: NEED1("missing argument for tcpflags"); cmd->opcode = O_TCPFLAGS; fill_flags(cmd, O_TCPFLAGS, f_tcpflags, *av); av++; break; case TOK_KEEPSTATE: if (open_par) errx(EX_USAGE, "keep-state cannot be part " "of an or block"); if (have_state) errx(EX_USAGE, "only one of keep-state " "and limit is allowed"); have_state = cmd; fill_cmd(cmd, O_KEEP_STATE, 0, 0); break; case TOK_LIMIT: { ipfw_insn_limit *c = (ipfw_insn_limit *)cmd; int val; if (open_par) errx(EX_USAGE, "limit cannot be part of an or block"); if (have_state) errx(EX_USAGE, "only one of keep-state and " "limit is allowed"); have_state = cmd; cmd->len = F_INSN_SIZE(ipfw_insn_limit); cmd->opcode = O_LIMIT; c->limit_mask = c->conn_limit = 0; while ( av[0] != NULL ) { if ((val = match_token(limit_masks, *av)) <= 0) break; c->limit_mask |= val; av++; } if (c->limit_mask == 0) errx(EX_USAGE, "limit: missing limit mask"); GET_UINT_ARG(c->conn_limit, IPFW_ARG_MIN, IPFW_ARG_MAX, TOK_LIMIT, rule_options); av++; break; } case TOK_PROTO: NEED1("missing protocol"); if (add_proto(cmd, *av, &proto)) { av++; } else errx(EX_DATAERR, "invalid protocol ``%s''", *av); break; case TOK_SRCIP: NEED1("missing source IP"); if (add_srcip(cmd, *av)) { av++; } break; case TOK_DSTIP: NEED1("missing destination IP"); if (add_dstip(cmd, *av)) { av++; } break; case TOK_SRCIP6: NEED1("missing source IP6"); if (add_srcip6(cmd, *av)) { av++; } break; case TOK_DSTIP6: NEED1("missing destination IP6"); if (add_dstip6(cmd, *av)) { av++; } break; case TOK_SRCPORT: NEED1("missing source port"); if (_substrcmp(*av, "any") == 0 || add_ports(cmd, *av, proto, O_IP_SRCPORT)) { av++; } else errx(EX_DATAERR, "invalid source port %s", *av); break; case TOK_DSTPORT: NEED1("missing destination port"); if (_substrcmp(*av, "any") == 0 || add_ports(cmd, *av, proto, O_IP_DSTPORT)) { av++; } else errx(EX_DATAERR, "invalid destination port %s", *av); break; case TOK_MAC: if (add_mac(cmd, av)) av += 2; break; case TOK_MACTYPE: NEED1("missing mac type"); if (!add_mactype(cmd, *av)) errx(EX_DATAERR, "invalid mac type %s", *av); av++; break; case TOK_VERREVPATH: fill_cmd(cmd, O_VERREVPATH, 0, 0); break; case TOK_VERSRCREACH: fill_cmd(cmd, O_VERSRCREACH, 0, 0); break; case TOK_ANTISPOOF: fill_cmd(cmd, O_ANTISPOOF, 0, 0); break; case TOK_IPSEC: fill_cmd(cmd, O_IPSEC, 0, 0); break; case TOK_IPV6: fill_cmd(cmd, O_IP6, 0, 0); break; case TOK_IPV4: fill_cmd(cmd, O_IP4, 0, 0); break; case TOK_EXT6HDR: fill_ext6hdr( cmd, *av ); av++; break; case TOK_FLOWID: if (proto != IPPROTO_IPV6 ) errx( EX_USAGE, "flow-id filter is active " "only for ipv6 protocol\n"); fill_flow6( (ipfw_insn_u32 *) cmd, *av ); av++; break; case TOK_COMMENT: fill_comment(cmd, av); av[0]=NULL; break; case TOK_TAGGED: if (av[0] && strpbrk(*av, "-,")) { if (!add_ports(cmd, *av, 0, O_TAGGED)) errx(EX_DATAERR, "tagged: invalid tag" " list: %s", *av); } else { uint16_t tag; GET_UINT_ARG(tag, IPFW_ARG_MIN, IPFW_ARG_MAX, TOK_TAGGED, rule_options); fill_cmd(cmd, O_TAGGED, 0, tag); } av++; break; case TOK_FIB: NEED1("fib requires fib number"); fill_cmd(cmd, O_FIB, 0, strtoul(*av, NULL, 0)); av++; break; case TOK_SOCKARG: fill_cmd(cmd, O_SOCKARG, 0, 0); break; case TOK_LOOKUP: { ipfw_insn_u32 *c = (ipfw_insn_u32 *)cmd; char *p; int j; if (!av[0] || !av[1]) errx(EX_USAGE, "format: lookup argument tablenum"); cmd->opcode = O_IP_DST_LOOKUP; cmd->len |= F_INSN_SIZE(ipfw_insn) + 2; i = match_token(rule_options, *av); for (j = 0; lookup_key[j] >= 0 ; j++) { if (i == lookup_key[j]) break; } if (lookup_key[j] <= 0) errx(EX_USAGE, "format: cannot lookup on %s", *av); __PAST_END(c->d, 1) = j; // i converted to option av++; cmd->arg1 = strtoul(*av, &p, 0); if (p && *p) errx(EX_USAGE, "format: lookup argument tablenum"); av++; } break; default: errx(EX_USAGE, "unrecognised option [%d] %s\n", i, s); } if (F_LEN(cmd) > 0) { /* prepare to advance */ prev = cmd; cmd = next_cmd(cmd); } } done: /* * Now copy stuff into the rule. * If we have a keep-state option, the first instruction * must be a PROBE_STATE (which is generated here). * If we have a LOG option, it was stored as the first command, * and now must be moved to the top of the action part. */ dst = (ipfw_insn *)rule->cmd; /* * First thing to write into the command stream is the match probability. */ if (match_prob != 1) { /* 1 means always match */ dst->opcode = O_PROB; dst->len = 2; *((int32_t *)(dst+1)) = (int32_t)(match_prob * 0x7fffffff); dst += dst->len; } /* * generate O_PROBE_STATE if necessary */ if (have_state && have_state->opcode != O_CHECK_STATE) { fill_cmd(dst, O_PROBE_STATE, 0, 0); dst = next_cmd(dst); } /* copy all commands but O_LOG, O_KEEP_STATE, O_LIMIT, O_ALTQ, O_TAG */ for (src = (ipfw_insn *)cmdbuf; src != cmd; src += i) { i = F_LEN(src); switch (src->opcode) { case O_LOG: case O_KEEP_STATE: case O_LIMIT: case O_ALTQ: case O_TAG: break; default: bcopy(src, dst, i * sizeof(uint32_t)); dst += i; } } /* * put back the have_state command as last opcode */ if (have_state && have_state->opcode != O_CHECK_STATE) { i = F_LEN(have_state); bcopy(have_state, dst, i * sizeof(uint32_t)); dst += i; } /* * start action section */ rule->act_ofs = dst - rule->cmd; /* put back O_LOG, O_ALTQ, O_TAG if necessary */ if (have_log) { i = F_LEN(have_log); bcopy(have_log, dst, i * sizeof(uint32_t)); dst += i; } if (have_altq) { i = F_LEN(have_altq); bcopy(have_altq, dst, i * sizeof(uint32_t)); dst += i; } if (have_tag) { i = F_LEN(have_tag); bcopy(have_tag, dst, i * sizeof(uint32_t)); dst += i; } /* * copy all other actions */ for (src = (ipfw_insn *)actbuf; src != action; src += i) { i = F_LEN(src); bcopy(src, dst, i * sizeof(uint32_t)); dst += i; } rule->cmd_len = (uint32_t *)dst - (uint32_t *)(rule->cmd); i = (char *)dst - (char *)rule; if (do_cmd(IP_FW_ADD, rule, (uintptr_t)&i) == -1) err(EX_UNAVAILABLE, "getsockopt(%s)", "IP_FW_ADD"); if (!co.do_quiet) show_ipfw(rule, 0, 0); } /* * clear the counters or the log counters. */ void ipfw_zero(int ac, char *av[], int optname /* 0 = IP_FW_ZERO, 1 = IP_FW_RESETLOG */) { uint32_t arg, saved_arg; int failed = EX_OK; char const *errstr; char const *name = optname ? "RESETLOG" : "ZERO"; optname = optname ? IP_FW_RESETLOG : IP_FW_ZERO; av++; ac--; if (!ac) { /* clear all entries */ if (do_cmd(optname, NULL, 0) < 0) err(EX_UNAVAILABLE, "setsockopt(IP_FW_%s)", name); if (!co.do_quiet) printf("%s.\n", optname == IP_FW_ZERO ? "Accounting cleared":"Logging counts reset"); return; } while (ac) { /* Rule number */ if (isdigit(**av)) { arg = strtonum(*av, 0, 0xffff, &errstr); if (errstr) errx(EX_DATAERR, "invalid rule number %s\n", *av); saved_arg = arg; if (co.use_set) arg |= (1 << 24) | ((co.use_set - 1) << 16); av++; ac--; if (do_cmd(optname, &arg, sizeof(arg))) { warn("rule %u: setsockopt(IP_FW_%s)", saved_arg, name); failed = EX_UNAVAILABLE; } else if (!co.do_quiet) printf("Entry %d %s.\n", saved_arg, optname == IP_FW_ZERO ? "cleared" : "logging count reset"); } else { errx(EX_USAGE, "invalid rule number ``%s''", *av); } } if (failed != EX_OK) exit(failed); } void ipfw_flush(int force) { int cmd = co.do_pipe ? IP_DUMMYNET_FLUSH : IP_FW_FLUSH; if (!force && !co.do_quiet) { /* need to ask user */ int c; printf("Are you sure? [yn] "); fflush(stdout); do { c = toupper(getc(stdin)); while (c != '\n' && getc(stdin) != '\n') if (feof(stdin)) return; /* and do not flush */ } while (c != 'Y' && c != 'N'); printf("\n"); if (c == 'N') /* user said no */ return; } if (co.do_pipe) { dummynet_flush(); return; } /* `ipfw set N flush` - is the same that `ipfw delete set N` */ if (co.use_set) { uint32_t arg = ((co.use_set - 1) & 0xffff) | (1 << 24); if (do_cmd(IP_FW_DEL, &arg, sizeof(arg)) < 0) err(EX_UNAVAILABLE, "setsockopt(IP_FW_DEL)"); } else if (do_cmd(cmd, NULL, 0) < 0) err(EX_UNAVAILABLE, "setsockopt(IP_%s_FLUSH)", co.do_pipe ? "DUMMYNET" : "FW"); if (!co.do_quiet) printf("Flushed all %s.\n", co.do_pipe ? "pipes" : "rules"); } static void table_list(ipfw_table_entry ent, int need_header); /* * This one handles all table-related commands * ipfw table N add addr[/masklen] [value] * ipfw table N delete addr[/masklen] * ipfw table {N | all} flush * ipfw table {N | all} list */ void ipfw_table_handler(int ac, char *av[]) { ipfw_table_entry ent; int do_add; int is_all; size_t len; char *p; uint32_t a; uint32_t tables_max; len = sizeof(tables_max); if (sysctlbyname("net.inet.ip.fw.tables_max", &tables_max, &len, NULL, 0) == -1) { #ifdef IPFW_TABLES_MAX warn("Warn: Failed to get the max tables number via sysctl. " "Using the compiled in defaults. \nThe reason was"); tables_max = IPFW_TABLES_MAX; #else errx(1, "Failed sysctlbyname(\"net.inet.ip.fw.tables_max\")"); #endif } ac--; av++; if (ac && isdigit(**av)) { ent.tbl = atoi(*av); is_all = 0; ac--; av++; } else if (ac && _substrcmp(*av, "all") == 0) { ent.tbl = 0; is_all = 1; ac--; av++; } else errx(EX_USAGE, "table number or 'all' keyword required"); if (ent.tbl >= tables_max) errx(EX_USAGE, "The table number exceeds the maximum allowed " "value (%d)", tables_max - 1); NEED1("table needs command"); if (is_all && _substrcmp(*av, "list") != 0 && _substrcmp(*av, "flush") != 0) errx(EX_USAGE, "table number required"); if (_substrcmp(*av, "add") == 0 || _substrcmp(*av, "delete") == 0) { do_add = **av == 'a'; ac--; av++; if (!ac) errx(EX_USAGE, "IP address required"); p = strchr(*av, '/'); if (p) { *p++ = '\0'; ent.masklen = atoi(p); if (ent.masklen > 32) errx(EX_DATAERR, "bad width ``%s''", p); } else ent.masklen = 32; if (lookup_host(*av, (struct in_addr *)&ent.addr) != 0) errx(EX_NOHOST, "hostname ``%s'' unknown", *av); ac--; av++; if (do_add && ac) { unsigned int tval; /* isdigit is a bit of a hack here.. */ if (strchr(*av, (int)'.') == NULL && isdigit(**av)) { ent.value = strtoul(*av, NULL, 0); } else { if (lookup_host(*av, (struct in_addr *)&tval) == 0) { /* The value must be stored in host order * * so that the values < 65k can be distinguished */ ent.value = ntohl(tval); } else { errx(EX_NOHOST, "hostname ``%s'' unknown", *av); } } } else ent.value = 0; if (do_cmd(do_add ? IP_FW_TABLE_ADD : IP_FW_TABLE_DEL, &ent, sizeof(ent)) < 0) { /* If running silent, don't bomb out on these errors. */ if (!(co.do_quiet && (errno == (do_add ? EEXIST : ESRCH)))) err(EX_OSERR, "setsockopt(IP_FW_TABLE_%s)", do_add ? "ADD" : "DEL"); /* In silent mode, react to a failed add by deleting */ if (do_add) { do_cmd(IP_FW_TABLE_DEL, &ent, sizeof(ent)); if (do_cmd(IP_FW_TABLE_ADD, &ent, sizeof(ent)) < 0) err(EX_OSERR, "setsockopt(IP_FW_TABLE_ADD)"); } } } else if (_substrcmp(*av, "flush") == 0) { a = is_all ? tables_max : (uint32_t)(ent.tbl + 1); do { if (do_cmd(IP_FW_TABLE_FLUSH, &ent.tbl, sizeof(ent.tbl)) < 0) err(EX_OSERR, "setsockopt(IP_FW_TABLE_FLUSH)"); } while (++ent.tbl < a); } else if (_substrcmp(*av, "list") == 0) { a = is_all ? tables_max : (uint32_t)(ent.tbl + 1); do { table_list(ent, is_all); } while (++ent.tbl < a); } else errx(EX_USAGE, "invalid table command %s", *av); } static void table_list(ipfw_table_entry ent, int need_header) { ipfw_table *tbl; socklen_t l; uint32_t a; a = ent.tbl; l = sizeof(a); if (do_cmd(IP_FW_TABLE_GETSIZE, &a, (uintptr_t)&l) < 0) err(EX_OSERR, "getsockopt(IP_FW_TABLE_GETSIZE)"); /* If a is zero we have nothing to do, the table is empty. */ if (a == 0) return; l = sizeof(*tbl) + a * sizeof(ipfw_table_entry); tbl = safe_calloc(1, l); tbl->tbl = ent.tbl; if (do_cmd(IP_FW_TABLE_LIST, tbl, (uintptr_t)&l) < 0) err(EX_OSERR, "getsockopt(IP_FW_TABLE_LIST)"); if (tbl->cnt && need_header) printf("---table(%d)---\n", tbl->tbl); for (a = 0; a < tbl->cnt; a++) { unsigned int tval; tval = tbl->ent[a].value; if (co.do_value_as_ip) { char tbuf[128]; strncpy(tbuf, inet_ntoa(*(struct in_addr *) &tbl->ent[a].addr), 127); /* inet_ntoa expects network order */ tval = htonl(tval); printf("%s/%u %s\n", tbuf, tbl->ent[a].masklen, inet_ntoa(*(struct in_addr *)&tval)); } else { printf("%s/%u %u\n", inet_ntoa(*(struct in_addr *)&tbl->ent[a].addr), tbl->ent[a].masklen, tval); } } free(tbl); } ipfw3-2012/ipfw/humanize_number.c000644 000423 000000 00000011152 12006744007 017227 0ustar00luigiwheel000000 000000 /* $NetBSD: humanize_number.c,v 1.13 2007/12/14 17:26:19 christos Exp $ */ /* * Copyright (c) 1997, 1998, 1999, 2002 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, * NASA Ames Research Center, by Luke Mewburn and by Tomas Svensson. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the NetBSD * Foundation, Inc. and its contributors. * 4. Neither the name of The NetBSD Foundation nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ // #include __FBSDID("$FreeBSD: src/lib/libutil/humanize_number.c,v 1.2.10.1 2008/04/20 16:29:01 antoine Exp $"); #include #include #include #include #include #include // #include //#include int humanize_number(char *buf, size_t len, int64_t bytes, const char *suffix, int scale, int flags) { const char *prefixes, *sep; int b, i, r, maxscale, s1, s2, sign; int64_t divisor, max; size_t baselen; assert(buf != NULL); assert(suffix != NULL); assert(scale >= 0); if (flags & HN_DIVISOR_1000) { /* SI for decimal multiplies */ divisor = 1000; if (flags & HN_B) prefixes = "B\0k\0M\0G\0T\0P\0E"; else prefixes = "\0\0k\0M\0G\0T\0P\0E"; } else { /* * binary multiplies * XXX IEC 60027-2 recommends Ki, Mi, Gi... */ divisor = 1024; if (flags & HN_B) prefixes = "B\0K\0M\0G\0T\0P\0E"; else prefixes = "\0\0K\0M\0G\0T\0P\0E"; } #define SCALE2PREFIX(scale) (&prefixes[(scale) << 1]) maxscale = 7; if (scale >= maxscale && (scale & (HN_AUTOSCALE | HN_GETSCALE)) == 0) return (-1); if (buf == NULL || suffix == NULL) return (-1); if (len > 0) buf[0] = '\0'; if (bytes < 0) { sign = -1; bytes *= -100; baselen = 3; /* sign, digit, prefix */ } else { sign = 1; bytes *= 100; baselen = 2; /* digit, prefix */ } if (flags & HN_NOSPACE) sep = ""; else { sep = " "; baselen++; } baselen += strlen(suffix); /* Check if enough room for `x y' + suffix + `\0' */ if (len < baselen + 1) return (-1); if (scale & (HN_AUTOSCALE | HN_GETSCALE)) { /* See if there is additional columns can be used. */ for (max = 100, i = len - baselen; i-- > 0;) max *= 10; /* * Divide the number until it fits the given column. * If there will be an overflow by the rounding below, * divide once more. */ for (i = 0; bytes >= max - 50 && i < maxscale; i++) bytes /= divisor; if (scale & HN_GETSCALE) return (i); } else for (i = 0; i < scale && i < maxscale; i++) bytes /= divisor; /* If a value <= 9.9 after rounding and ... */ if (bytes < 995 && i > 0 && flags & HN_DECIMAL) { /* baselen + \0 + .N */ if (len < baselen + 1 + 2) return (-1); b = ((int)bytes + 5) / 10; s1 = b / 10; s2 = b % 10; r = snprintf(buf, len, "%d%s%d%s%s%s", sign * s1, ".", s2, sep, SCALE2PREFIX(i), suffix); } else r = snprintf(buf, len, "%" PRId64 "%s%s%s", sign * ((bytes + 50) / 100), sep, SCALE2PREFIX(i), suffix); return (r); } ipfw3-2012/ipfw/qsort_r.c000644 000423 000000 00000000331 12006744007 015525 0ustar00luigiwheel000000 000000 /* * This file is in the public domain. Originally written by Garrett * A. Wollman. * * $FreeBSD: src/lib/libc/stdlib/qsort_r.c,v 1.1 2002/09/10 02:04:49 wollman Exp $ */ #define I_AM_QSORT_R #include "qsort.c" ipfw3-2012/ipfw/ipfw.8000644 000423 000000 00000307042 12006744007 014737 0ustar00luigiwheel000000 000000 .\" .\" $FreeBSD: head/sbin/ipfw/ipfw.8 238540 2012-07-16 22:15:30Z issyl0 $ .\" .Dd July 16, 2012 .Dt IPFW 8 .Os .Sh NAME .Nm ipfw .Nd User interface for firewall, traffic shaper, packet scheduler, in-kernel NAT. .Sh SYNOPSIS .Ss FIREWALL CONFIGURATION .Nm .Op Fl cq .Cm add .Ar rule .Nm .Op Fl acdefnNStT .Op Cm set Ar N .Brq Cm list | show .Op Ar rule | first-last ... .Nm .Op Fl f | q .Op Cm set Ar N .Cm flush .Nm .Op Fl q .Op Cm set Ar N .Brq Cm delete | zero | resetlog .Op Ar number ... .Pp .Nm .Cm set Oo Cm disable Ar number ... Oc Op Cm enable Ar number ... .Nm .Cm set move .Op Cm rule .Ar number Cm to Ar number .Nm .Cm set swap Ar number number .Nm .Cm set show .Ss SYSCTL SHORTCUTS .Nm .Cm enable .Brq Cm firewall | altq | one_pass | debug | verbose | dyn_keepalive .Nm .Cm disable .Brq Cm firewall | altq | one_pass | debug | verbose | dyn_keepalive .Ss LOOKUP TABLES .Nm .Cm table Ar number Cm add Ar addr Ns Oo / Ns Ar masklen Oc Op Ar value .Nm .Cm table Ar number Cm delete Ar addr Ns Op / Ns Ar masklen .Nm .Cm table .Brq Ar number | all .Cm flush .Nm .Cm table .Brq Ar number | all .Cm list .Ss DUMMYNET CONFIGURATION (TRAFFIC SHAPER AND PACKET SCHEDULER) .Nm .Brq Cm pipe | queue | sched .Ar number .Cm config .Ar config-options .Nm .Op Fl s Op Ar field .Brq Cm pipe | queue | sched .Brq Cm delete | list | show .Op Ar number ... .Ss IN-KERNEL NAT .Nm .Op Fl q .Cm nat .Ar number .Cm config .Ar config-options .Pp .Nm .Op Fl cfnNqS .Oo .Fl p Ar preproc .Oo .Ar preproc-flags .Oc .Oc .Ar pathname .Sh DESCRIPTION The .Nm utility is the user interface for controlling the .Xr ipfw 4 firewall, the .Xr dummynet 4 traffic shaper/packet scheduler, and the in-kernel NAT services. .Pp A firewall configuration, or .Em ruleset , is made of a list of .Em rules numbered from 1 to 65535. Packets are passed to the firewall from a number of different places in the protocol stack (depending on the source and destination of the packet, it is possible for the firewall to be invoked multiple times on the same packet). The packet passed to the firewall is compared against each of the rules in the .Em ruleset , in rule-number order (multiple rules with the same number are permitted, in which case they are processed in order of insertion). When a match is found, the action corresponding to the matching rule is performed. .Pp Depending on the action and certain system settings, packets can be reinjected into the firewall at some rule after the matching one for further processing. .Pp A ruleset always includes a .Em default rule (numbered 65535) which cannot be modified or deleted, and matches all packets. The action associated with the .Em default rule can be either .Cm deny or .Cm allow depending on how the kernel is configured. .Pp If the ruleset includes one or more rules with the .Cm keep-state or .Cm limit option, the firewall will have a .Em stateful behaviour, i.e., upon a match it will create .Em dynamic rules , i.e. rules that match packets with the same 5-tuple (protocol, source and destination addresses and ports) as the packet which caused their creation. Dynamic rules, which have a limited lifetime, are checked at the first occurrence of a .Cm check-state , .Cm keep-state or .Cm limit rule, and are typically used to open the firewall on-demand to legitimate traffic only. See the .Sx STATEFUL FIREWALL and .Sx EXAMPLES Sections below for more information on the stateful behaviour of .Nm . .Pp All rules (including dynamic ones) have a few associated counters: a packet count, a byte count, a log count and a timestamp indicating the time of the last match. Counters can be displayed or reset with .Nm commands. .Pp Each rule belongs to one of 32 different .Em sets , and there are .Nm commands to atomically manipulate sets, such as enable, disable, swap sets, move all rules in a set to another one, delete all rules in a set. These can be useful to install temporary configurations, or to test them. See Section .Sx SETS OF RULES for more information on .Em sets . .Pp Rules can be added with the .Cm add command; deleted individually or in groups with the .Cm delete command, and globally (except those in set 31) with the .Cm flush command; displayed, optionally with the content of the counters, using the .Cm show and .Cm list commands. Finally, counters can be reset with the .Cm zero and .Cm resetlog commands. .Pp .Ss COMMAND OPTIONS The following general options are available when invoking .Nm : .Bl -tag -width indent .It Fl a Show counter values when listing rules. The .Cm show command implies this option. .It Fl b Only show the action and the comment, not the body of a rule. Implies .Fl c . .It Fl c When entering or showing rules, print them in compact form, i.e., omitting the "ip from any to any" string when this does not carry any additional information. .It Fl d When listing, show dynamic rules in addition to static ones. .It Fl e When listing and .Fl d is specified, also show expired dynamic rules. .It Fl f Do not ask for confirmation for commands that can cause problems if misused, .No i.e. Cm flush . If there is no tty associated with the process, this is implied. .It Fl i When listing a table (see the .Sx LOOKUP TABLES section below for more information on lookup tables), format values as IP addresses. By default, values are shown as integers. .It Fl n Only check syntax of the command strings, without actually passing them to the kernel. .It Fl N Try to resolve addresses and service names in output. .It Fl q Be quiet when executing the .Cm add , .Cm nat , .Cm zero , .Cm resetlog or .Cm flush commands; (implies .Fl f ) . This is useful when updating rulesets by executing multiple .Nm commands in a script (e.g., .Ql sh\ /etc/rc.firewall ) , or by processing a file with many .Nm rules across a remote login session. It also stops a table add or delete from failing if the entry already exists or is not present. .Pp The reason why this option may be important is that for some of these actions, .Nm may print a message; if the action results in blocking the traffic to the remote client, the remote login session will be closed and the rest of the ruleset will not be processed. Access to the console would then be required to recover. .It Fl S When listing rules, show the .Em set each rule belongs to. If this flag is not specified, disabled rules will not be listed. .It Fl s Op Ar field When listing pipes, sort according to one of the four counters (total or current packets or bytes). .It Fl t When listing, show last match timestamp converted with ctime(). .It Fl T When listing, show last match timestamp as seconds from the epoch. This form can be more convenient for postprocessing by scripts. .El .Ss LIST OF RULES AND PREPROCESSING To ease configuration, rules can be put into a file which is processed using .Nm as shown in the last synopsis line. An absolute .Ar pathname must be used. The file will be read line by line and applied as arguments to the .Nm utility. .Pp Optionally, a preprocessor can be specified using .Fl p Ar preproc where .Ar pathname is to be piped through. Useful preprocessors include .Xr cpp 1 and .Xr m4 1 . If .Ar preproc does not start with a slash .Pq Ql / as its first character, the usual .Ev PATH name search is performed. Care should be taken with this in environments where not all file systems are mounted (yet) by the time .Nm is being run (e.g.\& when they are mounted over NFS). Once .Fl p has been specified, any additional arguments are passed on to the preprocessor for interpretation. This allows for flexible configuration files (like conditionalizing them on the local hostname) and the use of macros to centralize frequently required arguments like IP addresses. .Ss TRAFFIC SHAPER CONFIGURATION The .Nm .Cm pipe , queue and .Cm sched commands are used to configure the traffic shaper and packet scheduler. See the .Sx TRAFFIC SHAPER (DUMMYNET) CONFIGURATION Section below for details. .Pp If the world and the kernel get out of sync the .Nm ABI may break, preventing you from being able to add any rules. This can adversely effect the booting process. You can use .Nm .Cm disable .Cm firewall to temporarily disable the firewall to regain access to the network, allowing you to fix the problem. .Sh PACKET FLOW A packet is checked against the active ruleset in multiple places in the protocol stack, under control of several sysctl variables. These places and variables are shown below, and it is important to have this picture in mind in order to design a correct ruleset. .Bd -literal -offset indent ^ to upper layers V | | +----------->-----------+ ^ V [ip(6)_input] [ip(6)_output] net.inet(6).ip(6).fw.enable=1 | | ^ V [ether_demux] [ether_output_frame] net.link.ether.ipfw=1 | | +-->--[bdg_forward]-->--+ net.link.bridge.ipfw=1 ^ V | to devices | .Ed .Pp The number of times the same packet goes through the firewall can vary between 0 and 4 depending on packet source and destination, and system configuration. .Pp Note that as packets flow through the stack, headers can be stripped or added to it, and so they may or may not be available for inspection. E.g., incoming packets will include the MAC header when .Nm is invoked from .Cm ether_demux() , but the same packets will have the MAC header stripped off when .Nm is invoked from .Cm ip_input() or .Cm ip6_input() . .Pp Also note that each packet is always checked against the complete ruleset, irrespective of the place where the check occurs, or the source of the packet. If a rule contains some match patterns or actions which are not valid for the place of invocation (e.g.\& trying to match a MAC header within .Cm ip_input or .Cm ip6_input ), the match pattern will not match, but a .Cm not operator in front of such patterns .Em will cause the pattern to .Em always match on those packets. It is thus the responsibility of the programmer, if necessary, to write a suitable ruleset to differentiate among the possible places. .Cm skipto rules can be useful here, as an example: .Bd -literal -offset indent # packets from ether_demux or bdg_forward ipfw add 10 skipto 1000 all from any to any layer2 in # packets from ip_input ipfw add 10 skipto 2000 all from any to any not layer2 in # packets from ip_output ipfw add 10 skipto 3000 all from any to any not layer2 out # packets from ether_output_frame ipfw add 10 skipto 4000 all from any to any layer2 out .Ed .Pp (yes, at the moment there is no way to differentiate between ether_demux and bdg_forward). .Sh SYNTAX In general, each keyword or argument must be provided as a separate command line argument, with no leading or trailing spaces. Keywords are case-sensitive, whereas arguments may or may not be case-sensitive depending on their nature (e.g.\& uid's are, hostnames are not). .Pp Some arguments (e.g. port or address lists) are comma-separated lists of values. In this case, spaces after commas ',' are allowed to make the line more readable. You can also put the entire command (including flags) into a single argument. E.g., the following forms are equivalent: .Bd -literal -offset indent ipfw -q add deny src-ip 10.0.0.0/24,127.0.0.1/8 ipfw -q add deny src-ip 10.0.0.0/24, 127.0.0.1/8 ipfw "-q add deny src-ip 10.0.0.0/24, 127.0.0.1/8" .Ed .Sh RULE FORMAT The format of firewall rules is the following: .Bd -ragged -offset indent .Bk -words .Op Ar rule_number .Op Cm set Ar set_number .Op Cm prob Ar match_probability .Ar action .Op Cm log Op Cm logamount Ar number .Op Cm altq Ar queue .Oo .Bro Cm tag | untag .Brc Ar number .Oc .Ar body .Ek .Ed .Pp where the body of the rule specifies which information is used for filtering packets, among the following: .Pp .Bl -tag -width "Source and dest. addresses and ports" -offset XXX -compact .It Layer-2 header fields When available .It IPv4 and IPv6 Protocol TCP, UDP, ICMP, etc. .It Source and dest. addresses and ports .It Direction See Section .Sx PACKET FLOW .It Transmit and receive interface By name or address .It Misc. IP header fields Version, type of service, datagram length, identification, fragment flag (non-zero IP offset), Time To Live .It IP options .It IPv6 Extension headers Fragmentation, Hop-by-Hop options, Routing Headers, Source routing rthdr0, Mobile IPv6 rthdr2, IPSec options. .It IPv6 Flow-ID .It Misc. TCP header fields TCP flags (SYN, FIN, ACK, RST, etc.), sequence number, acknowledgment number, window .It TCP options .It ICMP types for ICMP packets .It ICMP6 types for ICMP6 packets .It User/group ID When the packet can be associated with a local socket. .It Divert status Whether a packet came from a divert socket (e.g., .Xr natd 8 ) . .It Fib annotation state Whether a packet has been tagged for using a specific FIB (routing table) in future forwarding decisions. .El .Pp Note that some of the above information, e.g.\& source MAC or IP addresses and TCP/UDP ports, can be easily spoofed, so filtering on those fields alone might not guarantee the desired results. .Bl -tag -width indent .It Ar rule_number Each rule is associated with a .Ar rule_number in the range 1..65535, with the latter reserved for the .Em default rule. Rules are checked sequentially by rule number. Multiple rules can have the same number, in which case they are checked (and listed) according to the order in which they have been added. If a rule is entered without specifying a number, the kernel will assign one in such a way that the rule becomes the last one before the .Em default rule. Automatic rule numbers are assigned by incrementing the last non-default rule number by the value of the sysctl variable .Ar net.inet.ip.fw.autoinc_step which defaults to 100. If this is not possible (e.g.\& because we would go beyond the maximum allowed rule number), the number of the last non-default value is used instead. .It Cm set Ar set_number Each rule is associated with a .Ar set_number in the range 0..31. Sets can be individually disabled and enabled, so this parameter is of fundamental importance for atomic ruleset manipulation. It can be also used to simplify deletion of groups of rules. If a rule is entered without specifying a set number, set 0 will be used. .br Set 31 is special in that it cannot be disabled, and rules in set 31 are not deleted by the .Nm ipfw flush command (but you can delete them with the .Nm ipfw delete set 31 command). Set 31 is also used for the .Em default rule. .It Cm prob Ar match_probability A match is only declared with the specified probability (floating point number between 0 and 1). This can be useful for a number of applications such as random packet drop or (in conjunction with .Nm dummynet ) to simulate the effect of multiple paths leading to out-of-order packet delivery. .Pp Note: this condition is checked before any other condition, including ones such as keep-state or check-state which might have side effects. .It Cm log Op Cm logamount Ar number Packets matching a rule with the .Cm log keyword will be made available for logging in two ways: if the sysctl variable .Va net.inet.ip.fw.verbose is set to 0 (default), one can use .Xr bpf 4 attached to the .Li ipfw0 pseudo interface. This pseudo interface can be created after a boot manually by using the following command: .Bd -literal -offset indent # ifconfig ipfw0 create .Ed .Pp Or, automatically at boot time by adding the following line to the .Xr rc.conf 5 file: .Bd -literal -offset indent firewall_logif="YES" .Ed .Pp There is no overhead if no .Xr bpf 4 is attached to the pseudo interface. .Pp If .Va net.inet.ip.fw.verbose is set to 1, packets will be logged to .Xr syslogd 8 with a .Dv LOG_SECURITY facility up to a maximum of .Cm logamount packets. If no .Cm logamount is specified, the limit is taken from the sysctl variable .Va net.inet.ip.fw.verbose_limit . In both cases, a value of 0 means unlimited logging. .Pp Once the limit is reached, logging can be re-enabled by clearing the logging counter or the packet counter for that entry, see the .Cm resetlog command. .Pp Note: logging is done after all other packet matching conditions have been successfully verified, and before performing the final action (accept, deny, etc.) on the packet. .It Cm tag Ar number When a packet matches a rule with the .Cm tag keyword, the numeric tag for the given .Ar number in the range 1..65534 will be attached to the packet. The tag acts as an internal marker (it is not sent out over the wire) that can be used to identify these packets later on. This can be used, for example, to provide trust between interfaces and to start doing policy-based filtering. A packet can have multiple tags at the same time. Tags are "sticky", meaning once a tag is applied to a packet by a matching rule it exists until explicit removal. Tags are kept with the packet everywhere within the kernel, but are lost when packet leaves the kernel, for example, on transmitting packet out to the network or sending packet to a .Xr divert 4 socket. .Pp To check for previously applied tags, use the .Cm tagged rule option. To delete previously applied tag, use the .Cm untag keyword. .Pp Note: since tags are kept with the packet everywhere in kernelspace, they can be set and unset anywhere in the kernel network subsystem (using the .Xr mbuf_tags 9 facility), not only by means of the .Xr ipfw 4 .Cm tag and .Cm untag keywords. For example, there can be a specialized .Xr netgraph 4 node doing traffic analyzing and tagging for later inspecting in firewall. .It Cm untag Ar number When a packet matches a rule with the .Cm untag keyword, the tag with the number .Ar number is searched among the tags attached to this packet and, if found, removed from it. Other tags bound to packet, if present, are left untouched. .It Cm altq Ar queue When a packet matches a rule with the .Cm altq keyword, the ALTQ identifier for the given .Ar queue (see .Xr altq 4 ) will be attached. Note that this ALTQ tag is only meaningful for packets going "out" of IPFW, and not being rejected or going to divert sockets. Note that if there is insufficient memory at the time the packet is processed, it will not be tagged, so it is wise to make your ALTQ "default" queue policy account for this. If multiple .Cm altq rules match a single packet, only the first one adds the ALTQ classification tag. In doing so, traffic may be shaped by using .Cm count Cm altq Ar queue rules for classification early in the ruleset, then later applying the filtering decision. For example, .Cm check-state and .Cm keep-state rules may come later and provide the actual filtering decisions in addition to the fallback ALTQ tag. .Pp You must run .Xr pfctl 8 to set up the queues before IPFW will be able to look them up by name, and if the ALTQ disciplines are rearranged, the rules in containing the queue identifiers in the kernel will likely have gone stale and need to be reloaded. Stale queue identifiers will probably result in misclassification. .Pp All system ALTQ processing can be turned on or off via .Nm .Cm enable Ar altq and .Nm .Cm disable Ar altq . The usage of .Va net.inet.ip.fw.one_pass is irrelevant to ALTQ traffic shaping, as the actual rule action is followed always after adding an ALTQ tag. .El .Ss RULE ACTIONS A rule can be associated with one of the following actions, which will be executed when the packet matches the body of the rule. .Bl -tag -width indent .It Cm allow | accept | pass | permit Allow packets that match rule. The search terminates. .It Cm check-state Checks the packet against the dynamic ruleset. If a match is found, execute the action associated with the rule which generated this dynamic rule, otherwise move to the next rule. .br .Cm Check-state rules do not have a body. If no .Cm check-state rule is found, the dynamic ruleset is checked at the first .Cm keep-state or .Cm limit rule. .It Cm count Update counters for all packets that match rule. The search continues with the next rule. .It Cm deny | drop Discard packets that match this rule. The search terminates. .It Cm divert Ar port Divert packets that match this rule to the .Xr divert 4 socket bound to port .Ar port . The search terminates. .It Cm fwd | forward Ar ipaddr | tablearg Ns Op , Ns Ar port Change the next-hop on matching packets to .Ar ipaddr , which can be an IP address or a host name. For IPv4, the next hop can also be supplied by the last table looked up for the packet by using the .Cm tablearg keyword instead of an explicit address. The search terminates if this rule matches. .Pp If .Ar ipaddr is a local address, then matching packets will be forwarded to .Ar port (or the port number in the packet if one is not specified in the rule) on the local machine. .br If .Ar ipaddr is not a local address, then the port number (if specified) is ignored, and the packet will be forwarded to the remote address, using the route as found in the local routing table for that IP. .br A .Ar fwd rule will not match layer-2 packets (those received on ether_input, ether_output, or bridged). .br The .Cm fwd action does not change the contents of the packet at all. In particular, the destination address remains unmodified, so packets forwarded to another system will usually be rejected by that system unless there is a matching rule on that system to capture them. For packets forwarded locally, the local address of the socket will be set to the original destination address of the packet. This makes the .Xr netstat 1 entry look rather weird but is intended for use with transparent proxy servers. .Pp To enable .Cm fwd a custom kernel needs to be compiled with the option .Cd "options IPFIREWALL_FORWARD" . .It Cm nat Ar nat_nr | tablearg Pass packet to a nat instance (for network address translation, address redirect, etc.): see the .Sx NETWORK ADDRESS TRANSLATION (NAT) Section for further information. .It Cm pipe Ar pipe_nr Pass packet to a .Nm dummynet .Dq pipe (for bandwidth limitation, delay, etc.). See the .Sx TRAFFIC SHAPER (DUMMYNET) CONFIGURATION Section for further information. The search terminates; however, on exit from the pipe and if the .Xr sysctl 8 variable .Va net.inet.ip.fw.one_pass is not set, the packet is passed again to the firewall code starting from the next rule. .It Cm queue Ar queue_nr Pass packet to a .Nm dummynet .Dq queue (for bandwidth limitation using WF2Q+). .It Cm reject (Deprecated). Synonym for .Cm unreach host . .It Cm reset Discard packets that match this rule, and if the packet is a TCP packet, try to send a TCP reset (RST) notice. The search terminates. .It Cm reset6 Discard packets that match this rule, and if the packet is a TCP packet, try to send a TCP reset (RST) notice. The search terminates. .It Cm skipto Ar number | tablearg Skip all subsequent rules numbered less than .Ar number . The search continues with the first rule numbered .Ar number or higher. It is possible to use the .Cm tablearg keyword with a skipto for a .Em computed skipto, but care should be used, as no destination caching is possible in this case so the rules are always walked to find it, starting from the .Cm skipto . .It Cm call Ar number | tablearg The current rule number is saved in the internal stack and ruleset processing continues with the first rule numbered .Ar number or higher. If later a rule with the .Cm return action is encountered, the processing returns to the first rule with number of this .Cm call rule plus one or higher (the same behaviour as with packets returning from .Xr divert 4 socket after a .Cm divert action). This could be used to make somewhat like an assembly language .Dq subroutine calls to rules with common checks for different interfaces, etc. .Pp Rule with any number could be called, not just forward jumps as with .Cm skipto . So, to prevent endless loops in case of mistakes, both .Cm call and .Cm return actions don't do any jumps and simply go to the next rule if memory can't be allocated or stack overflowed/undeflowed. .Pp Internally stack for rule numbers is implemented using .Xr mbuf_tags 9 facility and currently has size of 16 entries. As mbuf tags are lost when packet leaves the kernel, .Cm divert should not be used in subroutines to avoid endless loops and other undesired effects. .It Cm return Takes rule number saved to internal stack by the last .Cm call action and returns ruleset processing to the first rule with number greater than number of corresponding .Cm call rule. See description of the .Cm call action for more details. .Pp Note that .Cm return rules usually end a .Dq subroutine and thus are unconditional, but .Nm command-line utility currently requires every action except .Cm check-state to have body. While it is sometimes useful to return only on some packets, usually you want to print just .Dq return for readability. A workaround for this is to use new syntax and .Fl c switch: .Bd -literal -offset indent # Add a rule without actual body ipfw add 2999 return via any # List rules without "from any to any" part ipfw -c list .Ed .Pp This cosmetic annoyance may be fixed in future releases. .It Cm tee Ar port Send a copy of packets matching this rule to the .Xr divert 4 socket bound to port .Ar port . The search continues with the next rule. .It Cm unreach Ar code Discard packets that match this rule, and try to send an ICMP unreachable notice with code .Ar code , where .Ar code is a number from 0 to 255, or one of these aliases: .Cm net , host , protocol , port , .Cm needfrag , srcfail , net-unknown , host-unknown , .Cm isolated , net-prohib , host-prohib , tosnet , .Cm toshost , filter-prohib , host-precedence or .Cm precedence-cutoff . The search terminates. .It Cm unreach6 Ar code Discard packets that match this rule, and try to send an ICMPv6 unreachable notice with code .Ar code , where .Ar code is a number from 0, 1, 3 or 4, or one of these aliases: .Cm no-route, admin-prohib, address or .Cm port . The search terminates. .It Cm netgraph Ar cookie Divert packet into netgraph with given .Ar cookie . The search terminates. If packet is later returned from netgraph it is either accepted or continues with the next rule, depending on .Va net.inet.ip.fw.one_pass sysctl variable. .It Cm ngtee Ar cookie A copy of packet is diverted into netgraph, original packet continues with the next rule. See .Xr ng_ipfw 4 for more information on .Cm netgraph and .Cm ngtee actions. .It Cm setfib Ar fibnum | tablearg The packet is tagged so as to use the FIB (routing table) .Ar fibnum in any subsequent forwarding decisions. Initially this is limited to the values 0 through 15, see .Xr setfib 1 . Processing continues at the next rule. It is possible to use the .Cm tablearg keyword with a setfib. If tablearg value is not within compiled FIB range packet fib is set to 0. .It Cm reass Queue and reassemble ip fragments. If the packet is not fragmented, counters are updated and processing continues with the next rule. If the packet is the last logical fragment, the packet is reassembled and, if .Va net.inet.ip.fw.one_pass is set to 0, processing continues with the next rule, else packet is allowed to pass and search terminates. If the packet is a fragment in the middle, it is consumed and processing stops immediately. .Pp Fragments handling can be tuned via .Va net.inet.ip.maxfragpackets and .Va net.inet.ip.maxfragsperpacket which limit, respectively, the maximum number of processable fragments (default: 800) and the maximum number of fragments per packet (default: 16). .Pp NOTA BENE: since fragments do not contain port numbers, they should be avoided with the .Nm reass rule. Alternatively, direction-based (like .Nm in / .Nm out ) and source-based (like .Nm via ) match patterns can be used to select fragments. .Pp Usually a simple rule like: .Bd -literal -offset indent # reassemble incoming fragments ipfw add reass all from any to any in .Ed .Pp is all you need at the beginning of your ruleset. .El .Ss RULE BODY The body of a rule contains zero or more patterns (such as specific source and destination addresses or ports, protocol options, incoming or outgoing interfaces, etc.) that the packet must match in order to be recognised. In general, the patterns are connected by (implicit) .Cm and operators -- i.e., all must match in order for the rule to match. Individual patterns can be prefixed by the .Cm not operator to reverse the result of the match, as in .Pp .Dl "ipfw add 100 allow ip from not 1.2.3.4 to any" .Pp Additionally, sets of alternative match patterns .Pq Em or-blocks can be constructed by putting the patterns in lists enclosed between parentheses ( ) or braces { }, and using the .Cm or operator as follows: .Pp .Dl "ipfw add 100 allow ip from { x or not y or z } to any" .Pp Only one level of parentheses is allowed. Beware that most shells have special meanings for parentheses or braces, so it is advisable to put a backslash \\ in front of them to prevent such interpretations. .Pp The body of a rule must in general include a source and destination address specifier. The keyword .Ar any can be used in various places to specify that the content of a required field is irrelevant. .Pp The rule body has the following format: .Bd -ragged -offset indent .Op Ar proto Cm from Ar src Cm to Ar dst .Op Ar options .Ed .Pp The first part (proto from src to dst) is for backward compatibility with earlier versions of .Fx . In modern .Fx any match pattern (including MAC headers, IP protocols, addresses and ports) can be specified in the .Ar options section. .Pp Rule fields have the following meaning: .Bl -tag -width indent .It Ar proto : protocol | Cm { Ar protocol Cm or ... } .It Ar protocol : Oo Cm not Oc Ar protocol-name | protocol-number An IP protocol specified by number or name (for a complete list see .Pa /etc/protocols ) , or one of the following keywords: .Bl -tag -width indent .It Cm ip4 | ipv4 Matches IPv4 packets. .It Cm ip6 | ipv6 Matches IPv6 packets. .It Cm ip | all Matches any packet. .El .Pp The .Cm ipv6 in .Cm proto option will be treated as inner protocol. And, the .Cm ipv4 is not available in .Cm proto option. .Pp The .Cm { Ar protocol Cm or ... } format (an .Em or-block ) is provided for convenience only but its use is deprecated. .It Ar src No and Ar dst : Bro Cm addr | Cm { Ar addr Cm or ... } Brc Op Oo Cm not Oc Ar ports An address (or a list, see below) optionally followed by .Ar ports specifiers. .Pp The second format .Em ( or-block with multiple addresses) is provided for convenience only and its use is discouraged. .It Ar addr : Oo Cm not Oc Bro .Cm any | me | me6 | .Cm table Ns Pq Ar number Ns Op , Ns Ar value .Ar | addr-list | addr-set .Brc .Bl -tag -width indent .It Cm any matches any IP address. .It Cm me matches any IP address configured on an interface in the system. .It Cm me6 matches any IPv6 address configured on an interface in the system. The address list is evaluated at the time the packet is analysed. .It Cm table Ns Pq Ar number Ns Op , Ns Ar value Matches any IPv4 address for which an entry exists in the lookup table .Ar number . If an optional 32-bit unsigned .Ar value is also specified, an entry will match only if it has this value. See the .Sx LOOKUP TABLES section below for more information on lookup tables. .El .It Ar addr-list : ip-addr Ns Op Ns , Ns Ar addr-list .It Ar ip-addr : A host or subnet address specified in one of the following ways: .Bl -tag -width indent .It Ar numeric-ip | hostname Matches a single IPv4 address, specified as dotted-quad or a hostname. Hostnames are resolved at the time the rule is added to the firewall list. .It Ar addr Ns / Ns Ar masklen Matches all addresses with base .Ar addr (specified as an IP address, a network number, or a hostname) and mask width of .Cm masklen bits. As an example, 1.2.3.4/25 or 1.2.3.0/25 will match all IP numbers from 1.2.3.0 to 1.2.3.127 . .It Ar addr Ns : Ns Ar mask Matches all addresses with base .Ar addr (specified as an IP address, a network number, or a hostname) and the mask of .Ar mask , specified as a dotted quad. As an example, 1.2.3.4:255.0.255.0 or 1.0.3.0:255.0.255.0 will match 1.*.3.*. This form is advised only for non-contiguous masks. It is better to resort to the .Ar addr Ns / Ns Ar masklen format for contiguous masks, which is more compact and less error-prone. .El .It Ar addr-set : addr Ns Oo Ns / Ns Ar masklen Oc Ns Cm { Ns Ar list Ns Cm } .It Ar list : Bro Ar num | num-num Brc Ns Op Ns , Ns Ar list Matches all addresses with base address .Ar addr (specified as an IP address, a network number, or a hostname) and whose last byte is in the list between braces { } . Note that there must be no spaces between braces and numbers (spaces after commas are allowed). Elements of the list can be specified as single entries or ranges. The .Ar masklen field is used to limit the size of the set of addresses, and can have any value between 24 and 32. If not specified, it will be assumed as 24. .br This format is particularly useful to handle sparse address sets within a single rule. Because the matching occurs using a bitmask, it takes constant time and dramatically reduces the complexity of rulesets. .br As an example, an address specified as 1.2.3.4/24{128,35-55,89} or 1.2.3.0/24{128,35-55,89} will match the following IP addresses: .br 1.2.3.128, 1.2.3.35 to 1.2.3.55, 1.2.3.89 . .It Ar addr6-list : ip6-addr Ns Op Ns , Ns Ar addr6-list .It Ar ip6-addr : A host or subnet specified one of the following ways: .Bl -tag -width indent .It Ar numeric-ip | hostname Matches a single IPv6 address as allowed by .Xr inet_pton 3 or a hostname. Hostnames are resolved at the time the rule is added to the firewall list. .It Ar addr Ns / Ns Ar masklen Matches all IPv6 addresses with base .Ar addr (specified as allowed by .Xr inet_pton or a hostname) and mask width of .Cm masklen bits. .El .Pp No support for sets of IPv6 addresses is provided because IPv6 addresses are typically random past the initial prefix. .It Ar ports : Bro Ar port | port Ns \&- Ns Ar port Ns Brc Ns Op , Ns Ar ports For protocols which support port numbers (such as TCP and UDP), optional .Cm ports may be specified as one or more ports or port ranges, separated by commas but no spaces, and an optional .Cm not operator. The .Ql \&- notation specifies a range of ports (including boundaries). .Pp Service names (from .Pa /etc/services ) may be used instead of numeric port values. The length of the port list is limited to 30 ports or ranges, though one can specify larger ranges by using an .Em or-block in the .Cm options section of the rule. .Pp A backslash .Pq Ql \e can be used to escape the dash .Pq Ql - character in a service name (from a shell, the backslash must be typed twice to avoid the shell itself interpreting it as an escape character). .Pp .Dl "ipfw add count tcp from any ftp\e\e-data-ftp to any" .Pp Fragmented packets which have a non-zero offset (i.e., not the first fragment) will never match a rule which has one or more port specifications. See the .Cm frag option for details on matching fragmented packets. .El .Ss RULE OPTIONS (MATCH PATTERNS) Additional match patterns can be used within rules. Zero or more of these so-called .Em options can be present in a rule, optionally prefixed by the .Cm not operand, and possibly grouped into .Em or-blocks . .Pp The following match patterns can be used (listed in alphabetical order): .Bl -tag -width indent .It Cm // this is a comment. Inserts the specified text as a comment in the rule. Everything following // is considered as a comment and stored in the rule. You can have comment-only rules, which are listed as having a .Cm count action followed by the comment. .It Cm bridged Alias for .Cm layer2 . .It Cm diverted Matches only packets generated by a divert socket. .It Cm diverted-loopback Matches only packets coming from a divert socket back into the IP stack input for delivery. .It Cm diverted-output Matches only packets going from a divert socket back outward to the IP stack output for delivery. .It Cm dst-ip Ar ip-address Matches IPv4 packets whose destination IP is one of the address(es) specified as argument. .It Bro Cm dst-ip6 | dst-ipv6 Brc Ar ip6-address Matches IPv6 packets whose destination IP is one of the address(es) specified as argument. .It Cm dst-port Ar ports Matches IP packets whose destination port is one of the port(s) specified as argument. .It Cm established Matches TCP packets that have the RST or ACK bits set. .It Cm ext6hdr Ar header Matches IPv6 packets containing the extended header given by .Ar header . Supported headers are: .Pp Fragment, .Pq Cm frag , Hop-to-hop options .Pq Cm hopopt , any type of Routing Header .Pq Cm route , Source routing Routing Header Type 0 .Pq Cm rthdr0 , Mobile IPv6 Routing Header Type 2 .Pq Cm rthdr2 , Destination options .Pq Cm dstopt , IPSec authentication headers .Pq Cm ah , and IPsec encapsulated security payload headers .Pq Cm esp . .It Cm fib Ar fibnum Matches a packet that has been tagged to use the given FIB (routing table) number. .It Cm flow-id Ar labels Matches IPv6 packets containing any of the flow labels given in .Ar labels . .Ar labels is a comma separated list of numeric flow labels. .It Cm frag Matches packets that are fragments and not the first fragment of an IP datagram. Note that these packets will not have the next protocol header (e.g.\& TCP, UDP) so options that look into these headers cannot match. .It Cm gid Ar group Matches all TCP or UDP packets sent by or received for a .Ar group . A .Ar group may be specified by name or number. .It Cm jail Ar prisonID Matches all TCP or UDP packets sent by or received for the jail whos prison ID is .Ar prisonID . .It Cm icmptypes Ar types Matches ICMP packets whose ICMP type is in the list .Ar types . The list may be specified as any combination of individual types (numeric) separated by commas. .Em Ranges are not allowed . The supported ICMP types are: .Pp echo reply .Pq Cm 0 , destination unreachable .Pq Cm 3 , source quench .Pq Cm 4 , redirect .Pq Cm 5 , echo request .Pq Cm 8 , router advertisement .Pq Cm 9 , router solicitation .Pq Cm 10 , time-to-live exceeded .Pq Cm 11 , IP header bad .Pq Cm 12 , timestamp request .Pq Cm 13 , timestamp reply .Pq Cm 14 , information request .Pq Cm 15 , information reply .Pq Cm 16 , address mask request .Pq Cm 17 and address mask reply .Pq Cm 18 . .It Cm icmp6types Ar types Matches ICMP6 packets whose ICMP6 type is in the list of .Ar types . The list may be specified as any combination of individual types (numeric) separated by commas. .Em Ranges are not allowed . .It Cm in | out Matches incoming or outgoing packets, respectively. .Cm in and .Cm out are mutually exclusive (in fact, .Cm out is implemented as .Cm not in Ns No ). .It Cm ipid Ar id-list Matches IPv4 packets whose .Cm ip_id field has value included in .Ar id-list , which is either a single value or a list of values or ranges specified in the same way as .Ar ports . .It Cm iplen Ar len-list Matches IP packets whose total length, including header and data, is in the set .Ar len-list , which is either a single value or a list of values or ranges specified in the same way as .Ar ports . .It Cm ipoptions Ar spec Matches packets whose IPv4 header contains the comma separated list of options specified in .Ar spec . The supported IP options are: .Pp .Cm ssrr (strict source route), .Cm lsrr (loose source route), .Cm rr (record packet route) and .Cm ts (timestamp). The absence of a particular option may be denoted with a .Ql \&! . .It Cm ipprecedence Ar precedence Matches IPv4 packets whose precedence field is equal to .Ar precedence . .It Cm ipsec Matches packets that have IPSEC history associated with them (i.e., the packet comes encapsulated in IPSEC, the kernel has IPSEC support and IPSEC_FILTERTUNNEL option, and can correctly decapsulate it). .Pp Note that specifying .Cm ipsec is different from specifying .Cm proto Ar ipsec as the latter will only look at the specific IP protocol field, irrespective of IPSEC kernel support and the validity of the IPSEC data. .Pp Further note that this flag is silently ignored in kernels without IPSEC support. It does not affect rule processing when given and the rules are handled as if with no .Cm ipsec flag. .It Cm iptos Ar spec Matches IPv4 packets whose .Cm tos field contains the comma separated list of service types specified in .Ar spec . The supported IP types of service are: .Pp .Cm lowdelay .Pq Dv IPTOS_LOWDELAY , .Cm throughput .Pq Dv IPTOS_THROUGHPUT , .Cm reliability .Pq Dv IPTOS_RELIABILITY , .Cm mincost .Pq Dv IPTOS_MINCOST , .Cm congestion .Pq Dv IPTOS_ECN_CE . The absence of a particular type may be denoted with a .Ql \&! . .It Cm ipttl Ar ttl-list Matches IPv4 packets whose time to live is included in .Ar ttl-list , which is either a single value or a list of values or ranges specified in the same way as .Ar ports . .It Cm ipversion Ar ver Matches IP packets whose IP version field is .Ar ver . .It Cm keep-state Upon a match, the firewall will create a dynamic rule, whose default behaviour is to match bidirectional traffic between source and destination IP/port using the same protocol. The rule has a limited lifetime (controlled by a set of .Xr sysctl 8 variables), and the lifetime is refreshed every time a matching packet is found. .It Cm layer2 Matches only layer2 packets, i.e., those passed to .Nm from ether_demux() and ether_output_frame(). .It Cm limit Bro Cm src-addr | src-port | dst-addr | dst-port Brc Ar N The firewall will only allow .Ar N connections with the same set of parameters as specified in the rule. One or more of source and destination addresses and ports can be specified. Currently, only IPv4 flows are supported. .It Cm lookup Bro Cm dst-ip | dst-port | src-ip | src-port | uid | jail Brc Ar N Search an entry in lookup table .Ar N that matches the field specified as argument. If not found, the match fails. Otherwise, the match succeeds and .Cm tablearg is set to the value extracted from the table. .Pp This option can be useful to quickly dispatch traffic based on certain packet fields. See the .Sx LOOKUP TABLES section below for more information on lookup tables. .It Cm { MAC | mac } Ar dst-mac src-mac Match packets with a given .Ar dst-mac and .Ar src-mac addresses, specified as the .Cm any keyword (matching any MAC address), or six groups of hex digits separated by colons, and optionally followed by a mask indicating the significant bits. The mask may be specified using either of the following methods: .Bl -enum -width indent .It A slash .Pq / followed by the number of significant bits. For example, an address with 33 significant bits could be specified as: .Pp .Dl "MAC 10:20:30:40:50:60/33 any" .Pp .It An ampersand .Pq & followed by a bitmask specified as six groups of hex digits separated by colons. For example, an address in which the last 16 bits are significant could be specified as: .Pp .Dl "MAC 10:20:30:40:50:60&00:00:00:00:ff:ff any" .Pp Note that the ampersand character has a special meaning in many shells and should generally be escaped. .Pp .El Note that the order of MAC addresses (destination first, source second) is the same as on the wire, but the opposite of the one used for IP addresses. .It Cm mac-type Ar mac-type Matches packets whose Ethernet Type field corresponds to one of those specified as argument. .Ar mac-type is specified in the same way as .Cm port numbers (i.e., one or more comma-separated single values or ranges). You can use symbolic names for known values such as .Em vlan , ipv4, ipv6 . Values can be entered as decimal or hexadecimal (if prefixed by 0x), and they are always printed as hexadecimal (unless the .Cm -N option is used, in which case symbolic resolution will be attempted). .It Cm proto Ar protocol Matches packets with the corresponding IP protocol. .It Cm recv | xmit | via Brq Ar ifX | Ar if Ns Cm * | Ar table Ns Pq Ar number Ns Op , Ns Ar value | Ar ipno | Ar any Matches packets received, transmitted or going through, respectively, the interface specified by exact name .Po Ar ifX Pc , by device name .Po Ar if* Pc , by IP address, or through some interface. .Pp The .Cm via keyword causes the interface to always be checked. If .Cm recv or .Cm xmit is used instead of .Cm via , then only the receive or transmit interface (respectively) is checked. By specifying both, it is possible to match packets based on both receive and transmit interface, e.g.: .Pp .Dl "ipfw add deny ip from any to any out recv ed0 xmit ed1" .Pp The .Cm recv interface can be tested on either incoming or outgoing packets, while the .Cm xmit interface can only be tested on outgoing packets. So .Cm out is required (and .Cm in is invalid) whenever .Cm xmit is used. .Pp A packet might not have a receive or transmit interface: packets originating from the local host have no receive interface, while packets destined for the local host have no transmit interface. .It Cm setup Matches TCP packets that have the SYN bit set but no ACK bit. This is the short form of .Dq Li tcpflags\ syn,!ack . .It Cm sockarg Matches packets that are associated to a local socket and for which the SO_USER_COOKIE socket option has been set to a non-zero value. As a side effect, the value of the option is made available as .Cm tablearg value, which in turn can be used as .Cm skipto or .Cm pipe number. .It Cm src-ip Ar ip-address Matches IPv4 packets whose source IP is one of the address(es) specified as an argument. .It Cm src-ip6 Ar ip6-address Matches IPv6 packets whose source IP is one of the address(es) specified as an argument. .It Cm src-port Ar ports Matches IP packets whose source port is one of the port(s) specified as argument. .It Cm tagged Ar tag-list Matches packets whose tags are included in .Ar tag-list , which is either a single value or a list of values or ranges specified in the same way as .Ar ports . Tags can be applied to the packet using .Cm tag rule action parameter (see it's description for details on tags). .It Cm tcpack Ar ack TCP packets only. Match if the TCP header acknowledgment number field is set to .Ar ack . .It Cm tcpdatalen Ar tcpdatalen-list Matches TCP packets whose length of TCP data is .Ar tcpdatalen-list , which is either a single value or a list of values or ranges specified in the same way as .Ar ports . .It Cm tcpflags Ar spec TCP packets only. Match if the TCP header contains the comma separated list of flags specified in .Ar spec . The supported TCP flags are: .Pp .Cm fin , .Cm syn , .Cm rst , .Cm psh , .Cm ack and .Cm urg . The absence of a particular flag may be denoted with a .Ql \&! . A rule which contains a .Cm tcpflags specification can never match a fragmented packet which has a non-zero offset. See the .Cm frag option for details on matching fragmented packets. .It Cm tcpseq Ar seq TCP packets only. Match if the TCP header sequence number field is set to .Ar seq . .It Cm tcpwin Ar tcpwin-list Matches TCP packets whose header window field is set to .Ar tcpwin-list , which is either a single value or a list of values or ranges specified in the same way as .Ar ports . .It Cm tcpoptions Ar spec TCP packets only. Match if the TCP header contains the comma separated list of options specified in .Ar spec . The supported TCP options are: .Pp .Cm mss (maximum segment size), .Cm window (tcp window advertisement), .Cm sack (selective ack), .Cm ts (rfc1323 timestamp) and .Cm cc (rfc1644 t/tcp connection count). The absence of a particular option may be denoted with a .Ql \&! . .It Cm uid Ar user Match all TCP or UDP packets sent by or received for a .Ar user . A .Ar user may be matched by name or identification number. .It Cm verrevpath For incoming packets, a routing table lookup is done on the packet's source address. If the interface on which the packet entered the system matches the outgoing interface for the route, the packet matches. If the interfaces do not match up, the packet does not match. All outgoing packets or packets with no incoming interface match. .Pp The name and functionality of the option is intentionally similar to the Cisco IOS command: .Pp .Dl ip verify unicast reverse-path .Pp This option can be used to make anti-spoofing rules to reject all packets with source addresses not from this interface. See also the option .Cm antispoof . .It Cm versrcreach For incoming packets, a routing table lookup is done on the packet's source address. If a route to the source address exists, but not the default route or a blackhole/reject route, the packet matches. Otherwise, the packet does not match. All outgoing packets match. .Pp The name and functionality of the option is intentionally similar to the Cisco IOS command: .Pp .Dl ip verify unicast source reachable-via any .Pp This option can be used to make anti-spoofing rules to reject all packets whose source address is unreachable. .It Cm antispoof For incoming packets, the packet's source address is checked if it belongs to a directly connected network. If the network is directly connected, then the interface the packet came on in is compared to the interface the network is connected to. When incoming interface and directly connected interface are not the same, the packet does not match. Otherwise, the packet does match. All outgoing packets match. .Pp This option can be used to make anti-spoofing rules to reject all packets that pretend to be from a directly connected network but do not come in through that interface. This option is similar to but more restricted than .Cm verrevpath because it engages only on packets with source addresses of directly connected networks instead of all source addresses. .El .Sh LOOKUP TABLES Lookup tables are useful to handle large sparse sets of addresses or other search keys (e.g. ports, jail IDs, interface names). In the rest of this section we will use the term ``address''. There may be up to 65535 different lookup tables, numbered 0 to 65534. .Pp Each entry is represented by an .Ar addr Ns Op / Ns Ar masklen and will match all addresses with base .Ar addr (specified as an IPv4/IPv6 address, a hostname or an unsigned integer) and mask width of .Ar masklen bits. If .Ar masklen is not specified, it defaults to 32 for IPv4 and 128 for IPv6. When looking up an IP address in a table, the most specific entry will match. Associated with each entry is a 32-bit unsigned .Ar value , which can optionally be checked by a rule matching code. When adding an entry, if .Ar value is not specified, it defaults to 0. .Pp An entry can be added to a table .Pq Cm add , or removed from a table .Pq Cm delete . A table can be examined .Pq Cm list or flushed .Pq Cm flush . .Pp Internally, each table is stored in a Radix tree, the same way as the routing table (see .Xr route 4 ) . .Pp Lookup tables currently support only ports, jail IDs, IPv4/IPv6 addresses and interface names. Wildcards is not supported for interface names. .Pp The .Cm tablearg feature provides the ability to use a value, looked up in the table, as the argument for a rule action, action parameter or rule option. This can significantly reduce number of rules in some configurations. If two tables are used in a rule, the result of the second (destination) is used. The .Cm tablearg argument can be used with the following actions: .Cm nat, pipe , queue, divert, tee, netgraph, ngtee, fwd, skipto, setfib, action parameters: .Cm tag, untag, rule options: .Cm limit, tagged. .Pp When used with .Cm fwd it is possible to supply table entries with values that are in the form of IP addresses or hostnames. See the .Sx EXAMPLES Section for example usage of tables and the tablearg keyword. .Pp When used with the .Cm skipto action, the user should be aware that the code will walk the ruleset up to a rule equal to, or past, the given number, and should therefore try keep the ruleset compact between the skipto and the target rules. .Sh SETS OF RULES Each rule belongs to one of 32 different .Em sets , numbered 0 to 31. Set 31 is reserved for the default rule. .Pp By default, rules are put in set 0, unless you use the .Cm set N attribute when entering a new rule. Sets can be individually and atomically enabled or disabled, so this mechanism permits an easy way to store multiple configurations of the firewall and quickly (and atomically) switch between them. The command to enable/disable sets is .Bd -ragged -offset indent .Nm .Cm set Oo Cm disable Ar number ... Oc Op Cm enable Ar number ... .Ed .Pp where multiple .Cm enable or .Cm disable sections can be specified. Command execution is atomic on all the sets specified in the command. By default, all sets are enabled. .Pp When you disable a set, its rules behave as if they do not exist in the firewall configuration, with only one exception: .Bd -ragged -offset indent dynamic rules created from a rule before it had been disabled will still be active until they expire. In order to delete dynamic rules you have to explicitly delete the parent rule which generated them. .Ed .Pp The set number of rules can be changed with the command .Bd -ragged -offset indent .Nm .Cm set move .Brq Cm rule Ar rule-number | old-set .Cm to Ar new-set .Ed .Pp Also, you can atomically swap two rulesets with the command .Bd -ragged -offset indent .Nm .Cm set swap Ar first-set second-set .Ed .Pp See the .Sx EXAMPLES Section on some possible uses of sets of rules. .Sh STATEFUL FIREWALL Stateful operation is a way for the firewall to dynamically create rules for specific flows when packets that match a given pattern are detected. Support for stateful operation comes through the .Cm check-state , keep-state and .Cm limit options of .Nm rules . .Pp Dynamic rules are created when a packet matches a .Cm keep-state or .Cm limit rule, causing the creation of a .Em dynamic rule which will match all and only packets with a given .Em protocol between a .Em src-ip/src-port dst-ip/dst-port pair of addresses .Em ( src and .Em dst are used here only to denote the initial match addresses, but they are completely equivalent afterwards). Dynamic rules will be checked at the first .Cm check-state, keep-state or .Cm limit occurrence, and the action performed upon a match will be the same as in the parent rule. .Pp Note that no additional attributes other than protocol and IP addresses and ports are checked on dynamic rules. .Pp The typical use of dynamic rules is to keep a closed firewall configuration, but let the first TCP SYN packet from the inside network install a dynamic rule for the flow so that packets belonging to that session will be allowed through the firewall: .Pp .Dl "ipfw add check-state" .Dl "ipfw add allow tcp from my-subnet to any setup keep-state" .Dl "ipfw add deny tcp from any to any" .Pp A similar approach can be used for UDP, where an UDP packet coming from the inside will install a dynamic rule to let the response through the firewall: .Pp .Dl "ipfw add check-state" .Dl "ipfw add allow udp from my-subnet to any keep-state" .Dl "ipfw add deny udp from any to any" .Pp Dynamic rules expire after some time, which depends on the status of the flow and the setting of some .Cm sysctl variables. See Section .Sx SYSCTL VARIABLES for more details. For TCP sessions, dynamic rules can be instructed to periodically send keepalive packets to refresh the state of the rule when it is about to expire. .Pp See Section .Sx EXAMPLES for more examples on how to use dynamic rules. .Sh TRAFFIC SHAPER (DUMMYNET) CONFIGURATION .Nm is also the user interface for the .Nm dummynet traffic shaper, packet scheduler and network emulator, a subsystem that can artificially queue, delay or drop packets emulating the behaviour of certain network links or queueing systems. .Pp .Nm dummynet operates by first using the firewall to select packets using any match pattern that can be used in .Nm rules. Matching packets are then passed to either of two different objects, which implement the traffic regulation: .Bl -hang -offset XXXX .It Em pipe A .Em pipe emulates a .Em link with given bandwidth and propagation delay, driven by a FIFO scheduler and a single queue with programmable queue size and packet loss rate. Packets are appended to the queue as they come out from .Nm ipfw , and then transferred in FIFO order to the link at the desired rate. .It Em queue A .Em queue is an abstraction used to implement packet scheduling using one of several packet scheduling algorithms. Packets sent to a .Em queue are first grouped into flows according to a mask on the 5-tuple. Flows are then passed to the scheduler associated to the .Em queue , and each flow uses scheduling parameters (weight and others) as configured in the .Em queue itself. A scheduler in turn is connected to an emulated link, and arbitrates the link's bandwidth among backlogged flows according to weights and to the features of the scheduling algorithm in use. .El .Pp In practice, .Em pipes can be used to set hard limits to the bandwidth that a flow can use, whereas .Em queues can be used to determine how different flows share the available bandwidth. .Pp A graphical representation of the binding of queues, flows, schedulers and links is below. .Bd -literal -offset indent (flow_mask|sched_mask) sched_mask +---------+ weight Wx +-------------+ | |->-[flow]-->--| |-+ -->--| QUEUE x | ... | | | | |->-[flow]-->--| SCHEDuler N | | +---------+ | | | ... | +--[LINK N]-->-- +---------+ weight Wy | | +--[LINK N]-->-- | |->-[flow]-->--| | | -->--| QUEUE y | ... | | | | |->-[flow]-->--| | | +---------+ +-------------+ | +-------------+ .Ed It is important to understand the role of the SCHED_MASK and FLOW_MASK, which are configured through the commands .Dl "ipfw sched N config mask SCHED_MASK ..." and .Dl "ipfw queue X config mask FLOW_MASK ..." . .Pp The SCHED_MASK is used to assign flows to one or more scheduler instances, one for each value of the packet's 5-tuple after applying SCHED_MASK. As an example, using ``src-ip 0xffffff00'' creates one instance for each /24 destination subnet. .Pp The FLOW_MASK, together with the SCHED_MASK, is used to split packets into flows. As an example, using ``src-ip 0x000000ff'' together with the previous SCHED_MASK makes a flow for each individual source address. In turn, flows for each /24 subnet will be sent to the same scheduler instance. .Pp The above diagram holds even for the .Em pipe case, with the only restriction that a .Em pipe only supports a SCHED_MASK, and forces the use of a FIFO scheduler (these are for backward compatibility reasons; in fact, internally, a .Nm dummynet's pipe is implemented exactly as above). .Pp There are two modes of .Nm dummynet operation: .Dq normal and .Dq fast . The .Dq normal mode tries to emulate a real link: the .Nm dummynet scheduler ensures that the packet will not leave the pipe faster than it would on the real link with a given bandwidth. The .Dq fast mode allows certain packets to bypass the .Nm dummynet scheduler (if packet flow does not exceed pipe's bandwidth). This is the reason why the .Dq fast mode requires less CPU cycles per packet (on average) and packet latency can be significantly lower in comparison to a real link with the same bandwidth. The default mode is .Dq normal . The .Dq fast mode can be enabled by setting the .Va net.inet.ip.dummynet.io_fast .Xr sysctl 8 variable to a non-zero value. .Pp .Ss PIPE, QUEUE AND SCHEDULER CONFIGURATION The .Em pipe , .Em queue and .Em scheduler configuration commands are the following: .Bd -ragged -offset indent .Cm pipe Ar number Cm config Ar pipe-configuration .Pp .Cm queue Ar number Cm config Ar queue-configuration .Pp .Cm sched Ar number Cm config Ar sched-configuration .Ed .Pp The following parameters can be configured for a pipe: .Pp .Bl -tag -width indent -compact .It Cm bw Ar bandwidth | device Bandwidth, measured in .Sm off .Op Cm K | M .Brq Cm bit/s | Byte/s . .Sm on .Pp A value of 0 (default) means unlimited bandwidth. The unit must immediately follow the number, as in .Pp .Dl "ipfw pipe 1 config bw 300Kbit/s" .Pp If a device name is specified instead of a numeric value, as in .Pp .Dl "ipfw pipe 1 config bw tun0" .Pp then the transmit clock is supplied by the specified device. At the moment only the .Xr tun 4 device supports this functionality, for use in conjunction with .Xr ppp 8 . .Pp .It Cm delay Ar ms-delay Propagation delay, measured in milliseconds. The value is rounded to the next multiple of the clock tick (typically 10ms, but it is a good practice to run kernels with .Dq "options HZ=1000" to reduce the granularity to 1ms or less). The default value is 0, meaning no delay. .Pp .It Cm burst Ar size If the data to be sent exceeds the pipe's bandwidth limit (and the pipe was previously idle), up to .Ar size bytes of data are allowed to bypass the .Nm dummynet scheduler, and will be sent as fast as the physical link allows. Any additional data will be transmitted at the rate specified by the .Nm pipe bandwidth. The burst size depends on how long the pipe has been idle; the effective burst size is calculated as follows: MAX( .Ar size , .Nm bw * pipe_idle_time). .Pp .It Cm profile Ar filename A file specifying the additional overhead incurred in the transmission of a packet on the link. .Pp Some link types introduce extra delays in the transmission of a packet, e.g. because of MAC level framing, contention on the use of the channel, MAC level retransmissions and so on. From our point of view, the channel is effectively unavailable for this extra time, which is constant or variable depending on the link type. Additionally, packets may be dropped after this time (e.g. on a wireless link after too many retransmissions). We can model the additional delay with an empirical curve that represents its distribution. .Bd -literal -offset indent cumulative probability 1.0 ^ | L +-- loss-level x | ****** | * | ***** | * | ** | * +-------*-------------------> delay .Ed The empirical curve may have both vertical and horizontal lines. Vertical lines represent constant delay for a range of probabilities. Horizontal lines correspond to a discontinuity in the delay distribution: the pipe will use the largest delay for a given probability. .Pp The file format is the following, with whitespace acting as a separator and '#' indicating the beginning a comment: .Bl -tag -width indent .It Cm name Ar identifier optional name (listed by "ipfw pipe show") to identify the delay distribution; .It Cm bw Ar value the bandwidth used for the pipe. If not specified here, it must be present explicitly as a configuration parameter for the pipe; .It Cm loss-level Ar L the probability above which packets are lost. (0.0 <= L <= 1.0, default 1.0 i.e. no loss); .It Cm samples Ar N the number of samples used in the internal representation of the curve (2..1024; default 100); .It Cm "delay prob" | "prob delay" One of these two lines is mandatory and defines the format of the following lines with data points. .It Ar XXX Ar YYY 2 or more lines representing points in the curve, with either delay or probability first, according to the chosen format. The unit for delay is milliseconds. Data points do not need to be sorted. Also, the number of actual lines can be different from the value of the "samples" parameter: .Nm utility will sort and interpolate the curve as needed. .El .Pp Example of a profile file: .Bd -literal -offset indent name bla_bla_bla samples 100 loss-level 0.86 prob delay 0 200 # minimum overhead is 200ms 0.5 200 0.5 300 0.8 1000 0.9 1300 1 1300 #configuration file end .Ed .El .Pp The following parameters can be configured for a queue: .Pp .Bl -tag -width indent -compact .It Cm pipe Ar pipe_nr Connects a queue to the specified pipe. Multiple queues (with the same or different weights) can be connected to the same pipe, which specifies the aggregate rate for the set of queues. .Pp .It Cm weight Ar weight Specifies the weight to be used for flows matching this queue. The weight must be in the range 1..100, and defaults to 1. .El .Pp The following case-insensitive parameters can be configured for a scheduler: .Pp .Bl -tag -width indent -compact .It Cm type Ar {fifo | wf2q+ | rr | qfq} specifies the scheduling algorithm to use. .Bl -tag -width indent -compact .It Cm fifo is just a FIFO scheduler (which means that all packets are stored in the same queue as they arrive to the scheduler). FIFO has O(1) per-packet time complexity, with very low constants (estimate 60-80ns on a 2GHz desktop machine) but gives no service guarantees. .It Cm wf2q+ implements the WF2Q+ algorithm, which is a Weighted Fair Queueing algorithm which permits flows to share bandwidth according to their weights. Note that weights are not priorities; even a flow with a minuscule weight will never starve. WF2Q+ has O(log N) per-packet processing cost, where N is the number of flows, and is the default algorithm used by previous versions dummynet's queues. .It Cm rr implements the Deficit Round Robin algorithm, which has O(1) processing costs (roughly, 100-150ns per packet) and permits bandwidth allocation according to weights, but with poor service guarantees. .It Cm qfq implements the QFQ algorithm, which is a very fast variant of WF2Q+, with similar service guarantees and O(1) processing costs (roughly, 200-250ns per packet). .El .El .Pp In addition to the type, all parameters allowed for a pipe can also be specified for a scheduler. .Pp Finally, the following parameters can be configured for both pipes and queues: .Pp .Bl -tag -width XXXX -compact .It Cm buckets Ar hash-table-size Specifies the size of the hash table used for storing the various queues. Default value is 64 controlled by the .Xr sysctl 8 variable .Va net.inet.ip.dummynet.hash_size , allowed range is 16 to 65536. .Pp .It Cm mask Ar mask-specifier Packets sent to a given pipe or queue by an .Nm rule can be further classified into multiple flows, each of which is then sent to a different .Em dynamic pipe or queue. A flow identifier is constructed by masking the IP addresses, ports and protocol types as specified with the .Cm mask options in the configuration of the pipe or queue. For each different flow identifier, a new pipe or queue is created with the same parameters as the original object, and matching packets are sent to it. .Pp Thus, when .Em dynamic pipes are used, each flow will get the same bandwidth as defined by the pipe, whereas when .Em dynamic queues are used, each flow will share the parent's pipe bandwidth evenly with other flows generated by the same queue (note that other queues with different weights might be connected to the same pipe). .br Available mask specifiers are a combination of one or more of the following: .Pp .Cm dst-ip Ar mask , .Cm dst-ip6 Ar mask , .Cm src-ip Ar mask , .Cm src-ip6 Ar mask , .Cm dst-port Ar mask , .Cm src-port Ar mask , .Cm flow-id Ar mask , .Cm proto Ar mask or .Cm all , .Pp where the latter means all bits in all fields are significant. .Pp .It Cm noerror When a packet is dropped by a .Nm dummynet queue or pipe, the error is normally reported to the caller routine in the kernel, in the same way as it happens when a device queue fills up. Setting this option reports the packet as successfully delivered, which can be needed for some experimental setups where you want to simulate loss or congestion at a remote router. .Pp .It Cm plr Ar packet-loss-rate Packet loss rate. Argument .Ar packet-loss-rate is a floating-point number between 0 and 1, with 0 meaning no loss, 1 meaning 100% loss. The loss rate is internally represented on 31 bits. .Pp .It Cm queue Brq Ar slots | size Ns Cm Kbytes Queue size, in .Ar slots or .Cm KBytes . Default value is 50 slots, which is the typical queue size for Ethernet devices. Note that for slow speed links you should keep the queue size short or your traffic might be affected by a significant queueing delay. E.g., 50 max-sized ethernet packets (1500 bytes) mean 600Kbit or 20s of queue on a 30Kbit/s pipe. Even worse effects can result if you get packets from an interface with a much larger MTU, e.g.\& the loopback interface with its 16KB packets. The .Xr sysctl 8 variables .Em net.inet.ip.dummynet.pipe_byte_limit and .Em net.inet.ip.dummynet.pipe_slot_limit control the maximum lengths that can be specified. .Pp .It Cm red | gred Ar w_q Ns / Ns Ar min_th Ns / Ns Ar max_th Ns / Ns Ar max_p Make use of the RED (Random Early Detection) queue management algorithm. .Ar w_q and .Ar max_p are floating point numbers between 0 and 1 (0 not included), while .Ar min_th and .Ar max_th are integer numbers specifying thresholds for queue management (thresholds are computed in bytes if the queue has been defined in bytes, in slots otherwise). The .Nm dummynet also supports the gentle RED variant (gred). Three .Xr sysctl 8 variables can be used to control the RED behaviour: .Bl -tag -width indent .It Va net.inet.ip.dummynet.red_lookup_depth specifies the accuracy in computing the average queue when the link is idle (defaults to 256, must be greater than zero) .It Va net.inet.ip.dummynet.red_avg_pkt_size specifies the expected average packet size (defaults to 512, must be greater than zero) .It Va net.inet.ip.dummynet.red_max_pkt_size specifies the expected maximum packet size, only used when queue thresholds are in bytes (defaults to 1500, must be greater than zero). .El .El .Pp When used with IPv6 data, .Nm dummynet currently has several limitations. Information necessary to route link-local packets to an interface is not available after processing by .Nm dummynet so those packets are dropped in the output path. Care should be taken to ensure that link-local packets are not passed to .Nm dummynet . .Sh CHECKLIST Here are some important points to consider when designing your rules: .Bl -bullet .It Remember that you filter both packets going .Cm in and .Cm out . Most connections need packets going in both directions. .It Remember to test very carefully. It is a good idea to be near the console when doing this. If you cannot be near the console, use an auto-recovery script such as the one in .Pa /usr/share/examples/ipfw/change_rules.sh . .It Do not forget the loopback interface. .El .Sh FINE POINTS .Bl -bullet .It There are circumstances where fragmented datagrams are unconditionally dropped. TCP packets are dropped if they do not contain at least 20 bytes of TCP header, UDP packets are dropped if they do not contain a full 8 byte UDP header, and ICMP packets are dropped if they do not contain 4 bytes of ICMP header, enough to specify the ICMP type, code, and checksum. These packets are simply logged as .Dq pullup failed since there may not be enough good data in the packet to produce a meaningful log entry. .It Another type of packet is unconditionally dropped, a TCP packet with a fragment offset of one. This is a valid packet, but it only has one use, to try to circumvent firewalls. When logging is enabled, these packets are reported as being dropped by rule -1. .It If you are logged in over a network, loading the .Xr kld 4 version of .Nm is probably not as straightforward as you would think. The following command line is recommended: .Bd -literal -offset indent kldload ipfw && \e ipfw add 32000 allow ip from any to any .Ed .Pp Along the same lines, doing an .Bd -literal -offset indent ipfw flush .Ed .Pp in similar surroundings is also a bad idea. .It The .Nm filter list may not be modified if the system security level is set to 3 or higher (see .Xr init 8 for information on system security levels). .El .Sh PACKET DIVERSION A .Xr divert 4 socket bound to the specified port will receive all packets diverted to that port. If no socket is bound to the destination port, or if the divert module is not loaded, or if the kernel was not compiled with divert socket support, the packets are dropped. .Sh NETWORK ADDRESS TRANSLATION (NAT) .Nm support in-kernel NAT using the kernel version of .Xr libalias 3 . .Pp The nat configuration command is the following: .Bd -ragged -offset indent .Bk -words .Cm nat .Ar nat_number .Cm config .Ar nat-configuration .Ek .Ed .Pp The following parameters can be configured: .Bl -tag -width indent .It Cm ip Ar ip_address Define an ip address to use for aliasing. .It Cm if Ar nic Use ip address of NIC for aliasing, dynamically changing it if NIC's ip address changes. .It Cm log Enable logging on this nat instance. .It Cm deny_in Deny any incoming connection from outside world. .It Cm same_ports Try to leave the alias port numbers unchanged from the actual local port numbers. .It Cm unreg_only Traffic on the local network not originating from an unregistered address spaces will be ignored. .It Cm reset Reset table of the packet aliasing engine on address change. .It Cm reverse Reverse the way libalias handles aliasing. .It Cm proxy_only Obey transparent proxy rules only, packet aliasing is not performed. .It Cm skip_global Skip instance in case of global state lookup (see below). .El .Pp Some specials value can be supplied instead of .Va nat_number: .Bl -tag -width indent .It Cm global Looks up translation state in all configured nat instances. If an entry is found, packet is aliased according to that entry. If no entry was found in any of the instances, packet is passed unchanged, and no new entry will be created. See section .Sx MULTIPLE INSTANCES in .Xr natd 8 for more information. .It Cm tablearg Uses argument supplied in lookup table. See .Sx LOOKUP TABLES section below for more information on lookup tables. .El .Pp To let the packet continue after being (de)aliased, set the sysctl variable .Va net.inet.ip.fw.one_pass to 0. For more information about aliasing modes, refer to .Xr libalias 3 . See Section .Sx EXAMPLES for some examples about nat usage. .Ss REDIRECT AND LSNAT SUPPORT IN IPFW Redirect and LSNAT support follow closely the syntax used in .Xr natd 8 . See Section .Sx EXAMPLES for some examples on how to do redirect and lsnat. .Ss SCTP NAT SUPPORT SCTP nat can be configured in a similar manner to TCP through the .Nm command line tool. The main difference is that .Nm sctp nat does not do port translation. Since the local and global side ports will be the same, there is no need to specify both. Ports are redirected as follows: .Bd -ragged -offset indent .Bk -words .Cm nat .Ar nat_number .Cm config if .Ar nic .Cm redirect_port sctp .Ar ip_address [,addr_list] {[port | port-port] [,ports]} .Ek .Ed .Pp Most .Nm sctp nat configuration can be done in real-time through the .Xr sysctl 8 interface. All may be changed dynamically, though the hash_table size will only change for new .Nm nat instances. See .Sx SYSCTL VARIABLES for more info. .Sh LOADER TUNABLES Tunables can be set in .Xr loader 8 prompt, .Xr loader.conf 5 or .Xr kenv 1 before ipfw module gets loaded. .Bl -tag -width indent .It Va net.inet.ip.fw.default_to_accept: No 0 Defines ipfw last rule behavior. This value overrides .Cd "options IPFW_DEFAULT_TO_(ACCEPT|DENY)" from kernel configuration file. .It Va net.inet.ip.fw.tables_max: No 128 Defines number of tables available in ipfw. Number cannot exceed 65534. .El .Sh SYSCTL VARIABLES A set of .Xr sysctl 8 variables controls the behaviour of the firewall and associated modules .Pq Nm dummynet , bridge , sctp nat . These are shown below together with their default value (but always check with the .Xr sysctl 8 command what value is actually in use) and meaning: .Bl -tag -width indent .It Va net.inet.ip.alias.sctp.accept_global_ootb_addip: No 0 Defines how the .Nm nat responds to receipt of global OOTB ASCONF-AddIP: .Bl -tag -width indent .It Cm 0 No response (unless a partially matching association exists - ports and vtags match but global address does not) .It Cm 1 .Nm nat will accept and process all OOTB global AddIP messages. .El .Pp Option 1 should never be selected as this forms a security risk. An attacker can establish multiple fake associations by sending AddIP messages. .It Va net.inet.ip.alias.sctp.chunk_proc_limit: No 5 Defines the maximum number of chunks in an SCTP packet that will be parsed for a packet that matches an existing association. This value is enforced to be greater or equal than .Cm net.inet.ip.alias.sctp.initialising_chunk_proc_limit . A high value is a DoS risk yet setting too low a value may result in important control chunks in the packet not being located and parsed. .It Va net.inet.ip.alias.sctp.error_on_ootb: No 1 Defines when the .Nm nat responds to any Out-of-the-Blue (OOTB) packets with ErrorM packets. An OOTB packet is a packet that arrives with no existing association registered in the .Nm nat and is not an INIT or ASCONF-AddIP packet: .Bl -tag -width indent .It Cm 0 ErrorM is never sent in response to OOTB packets. .It Cm 1 ErrorM is only sent to OOTB packets received on the local side. .It Cm 2 ErrorM is sent to the local side and on the global side ONLY if there is a partial match (ports and vtags match but the source global IP does not). This value is only useful if the .Nm nat is tracking global IP addresses. .It Cm 3 ErrorM is sent in response to all OOTB packets on both the local and global side (DoS risk). .El .Pp At the moment the default is 0, since the ErrorM packet is not yet supported by most SCTP stacks. When it is supported, and if not tracking global addresses, we recommend setting this value to 1 to allow multi-homed local hosts to function with the .Nm nat . To track global addresses, we recommend setting this value to 2 to allow global hosts to be informed when they need to (re)send an ASCONF-AddIP. Value 3 should never be chosen (except for debugging) as the .Nm nat will respond to all OOTB global packets (a DoS risk). .It Va net.inet.ip.alias.sctp.hashtable_size: No 2003 Size of hash tables used for .Nm nat lookups (100 < prime_number > 1000001). This value sets the .Nm hash table size for any future created .Nm nat instance and therefore must be set prior to creating a .Nm nat instance. The table sizes may be changed to suit specific needs. If there will be few concurrent associations, and memory is scarce, you may make these smaller. If there will be many thousands (or millions) of concurrent associations, you should make these larger. A prime number is best for the table size. The sysctl update function will adjust your input value to the next highest prime number. .It Va net.inet.ip.alias.sctp.holddown_time: No 0 Hold association in table for this many seconds after receiving a SHUTDOWN-COMPLETE. This allows endpoints to correct shutdown gracefully if a shutdown_complete is lost and retransmissions are required. .It Va net.inet.ip.alias.sctp.init_timer: No 15 Timeout value while waiting for (INIT-ACK|AddIP-ACK). This value cannot be 0. .It Va net.inet.ip.alias.sctp.initialising_chunk_proc_limit: No 2 Defines the maximum number of chunks in an SCTP packet that will be parsed when no existing association exists that matches that packet. Ideally this packet will only be an INIT or ASCONF-AddIP packet. A higher value may become a DoS risk as malformed packets can consume processing resources. .It Va net.inet.ip.alias.sctp.param_proc_limit: No 25 Defines the maximum number of parameters within a chunk that will be parsed in a packet. As for other similar sysctl variables, larger values pose a DoS risk. .It Va net.inet.ip.alias.sctp.log_level: No 0 Level of detail in the system log messages (0 \- minimal, 1 \- event, 2 \- info, 3 \- detail, 4 \- debug, 5 \- max debug). May be a good option in high loss environments. .It Va net.inet.ip.alias.sctp.shutdown_time: No 15 Timeout value while waiting for SHUTDOWN-COMPLETE. This value cannot be 0. .It Va net.inet.ip.alias.sctp.track_global_addresses: No 0 Enables/disables global IP address tracking within the .Nm nat and places an upper limit on the number of addresses tracked for each association: .Bl -tag -width indent .It Cm 0 Global tracking is disabled .It Cm >1 Enables tracking, the maximum number of addresses tracked for each association is limited to this value .El .Pp This variable is fully dynamic, the new value will be adopted for all newly arriving associations, existing associations are treated as they were previously. Global tracking will decrease the number of collisions within the .Nm nat at a cost of increased processing load, memory usage, complexity, and possible .Nm nat state problems in complex networks with multiple .Nm nats . We recommend not tracking global IP addresses, this will still result in a fully functional .Nm nat . .It Va net.inet.ip.alias.sctp.up_timer: No 300 Timeout value to keep an association up with no traffic. This value cannot be 0. .It Va net.inet.ip.dummynet.expire : No 1 Lazily delete dynamic pipes/queue once they have no pending traffic. You can disable this by setting the variable to 0, in which case the pipes/queues will only be deleted when the threshold is reached. .It Va net.inet.ip.dummynet.hash_size : No 64 Default size of the hash table used for dynamic pipes/queues. This value is used when no .Cm buckets option is specified when configuring a pipe/queue. .It Va net.inet.ip.dummynet.io_fast : No 0 If set to a non-zero value, the .Dq fast mode of .Nm dummynet operation (see above) is enabled. .It Va net.inet.ip.dummynet.io_pkt Number of packets passed to .Nm dummynet . .It Va net.inet.ip.dummynet.io_pkt_drop Number of packets dropped by .Nm dummynet . .It Va net.inet.ip.dummynet.io_pkt_fast Number of packets bypassed by the .Nm dummynet scheduler. .It Va net.inet.ip.dummynet.max_chain_len : No 16 Target value for the maximum number of pipes/queues in a hash bucket. The product .Cm max_chain_len*hash_size is used to determine the threshold over which empty pipes/queues will be expired even when .Cm net.inet.ip.dummynet.expire=0 . .It Va net.inet.ip.dummynet.red_lookup_depth : No 256 .It Va net.inet.ip.dummynet.red_avg_pkt_size : No 512 .It Va net.inet.ip.dummynet.red_max_pkt_size : No 1500 Parameters used in the computations of the drop probability for the RED algorithm. .It Va net.inet.ip.dummynet.pipe_byte_limit : No 1048576 .It Va net.inet.ip.dummynet.pipe_slot_limit : No 100 The maximum queue size that can be specified in bytes or packets. These limits prevent accidental exhaustion of resources such as mbufs. If you raise these limits, you should make sure the system is configured so that sufficient resources are available. .It Va net.inet.ip.fw.autoinc_step : No 100 Delta between rule numbers when auto-generating them. The value must be in the range 1..1000. .It Va net.inet.ip.fw.curr_dyn_buckets : Va net.inet.ip.fw.dyn_buckets The current number of buckets in the hash table for dynamic rules (readonly). .It Va net.inet.ip.fw.debug : No 1 Controls debugging messages produced by .Nm . .It Va net.inet.ip.fw.default_rule : No 65535 The default rule number (read-only). By the design of .Nm , the default rule is the last one, so its number can also serve as the highest number allowed for a rule. .It Va net.inet.ip.fw.dyn_buckets : No 256 The number of buckets in the hash table for dynamic rules. Must be a power of 2, up to 65536. It only takes effect when all dynamic rules have expired, so you are advised to use a .Cm flush command to make sure that the hash table is resized. .It Va net.inet.ip.fw.dyn_count : No 3 Current number of dynamic rules (read-only). .It Va net.inet.ip.fw.dyn_keepalive : No 1 Enables generation of keepalive packets for .Cm keep-state rules on TCP sessions. A keepalive is generated to both sides of the connection every 5 seconds for the last 20 seconds of the lifetime of the rule. .It Va net.inet.ip.fw.dyn_max : No 8192 Maximum number of dynamic rules. When you hit this limit, no more dynamic rules can be installed until old ones expire. .It Va net.inet.ip.fw.dyn_ack_lifetime : No 300 .It Va net.inet.ip.fw.dyn_syn_lifetime : No 20 .It Va net.inet.ip.fw.dyn_fin_lifetime : No 1 .It Va net.inet.ip.fw.dyn_rst_lifetime : No 1 .It Va net.inet.ip.fw.dyn_udp_lifetime : No 5 .It Va net.inet.ip.fw.dyn_short_lifetime : No 30 These variables control the lifetime, in seconds, of dynamic rules. Upon the initial SYN exchange the lifetime is kept short, then increased after both SYN have been seen, then decreased again during the final FIN exchange or when a RST is received. Both .Em dyn_fin_lifetime and .Em dyn_rst_lifetime must be strictly lower than 5 seconds, the period of repetition of keepalives. The firewall enforces that. .It Va net.inet.ip.fw.enable : No 1 Enables the firewall. Setting this variable to 0 lets you run your machine without firewall even if compiled in. .It Va net.inet6.ip6.fw.enable : No 1 provides the same functionality as above for the IPv6 case. .It Va net.inet.ip.fw.one_pass : No 1 When set, the packet exiting from the .Nm dummynet pipe or from .Xr ng_ipfw 4 node is not passed though the firewall again. Otherwise, after an action, the packet is reinjected into the firewall at the next rule. .It Va net.inet.ip.fw.tables_max : No 128 Maximum number of tables. .It Va net.inet.ip.fw.verbose : No 1 Enables verbose messages. .It Va net.inet.ip.fw.verbose_limit : No 0 Limits the number of messages produced by a verbose firewall. .It Va net.inet6.ip6.fw.deny_unknown_exthdrs : No 1 If enabled packets with unknown IPv6 Extension Headers will be denied. .It Va net.link.ether.ipfw : No 0 Controls whether layer-2 packets are passed to .Nm . Default is no. .It Va net.link.bridge.ipfw : No 0 Controls whether bridged packets are passed to .Nm . Default is no. .El .Sh EXAMPLES There are far too many possible uses of .Nm so this Section will only give a small set of examples. .Pp .Ss BASIC PACKET FILTERING This command adds an entry which denies all tcp packets from .Em cracker.evil.org to the telnet port of .Em wolf.tambov.su from being forwarded by the host: .Pp .Dl "ipfw add deny tcp from cracker.evil.org to wolf.tambov.su telnet" .Pp This one disallows any connection from the entire cracker's network to my host: .Pp .Dl "ipfw add deny ip from 123.45.67.0/24 to my.host.org" .Pp A first and efficient way to limit access (not using dynamic rules) is the use of the following rules: .Pp .Dl "ipfw add allow tcp from any to any established" .Dl "ipfw add allow tcp from net1 portlist1 to net2 portlist2 setup" .Dl "ipfw add allow tcp from net3 portlist3 to net3 portlist3 setup" .Dl "..." .Dl "ipfw add deny tcp from any to any" .Pp The first rule will be a quick match for normal TCP packets, but it will not match the initial SYN packet, which will be matched by the .Cm setup rules only for selected source/destination pairs. All other SYN packets will be rejected by the final .Cm deny rule. .Pp If you administer one or more subnets, you can take advantage of the address sets and or-blocks and write extremely compact rulesets which selectively enable services to blocks of clients, as below: .Pp .Dl "goodguys=\*q{ 10.1.2.0/24{20,35,66,18} or 10.2.3.0/28{6,3,11} }\*q" .Dl "badguys=\*q10.1.2.0/24{8,38,60}\*q" .Dl "" .Dl "ipfw add allow ip from ${goodguys} to any" .Dl "ipfw add deny ip from ${badguys} to any" .Dl "... normal policies ..." .Pp The .Cm verrevpath option could be used to do automated anti-spoofing by adding the following to the top of a ruleset: .Pp .Dl "ipfw add deny ip from any to any not verrevpath in" .Pp This rule drops all incoming packets that appear to be coming to the system on the wrong interface. For example, a packet with a source address belonging to a host on a protected internal network would be dropped if it tried to enter the system from an external interface. .Pp The .Cm antispoof option could be used to do similar but more restricted anti-spoofing by adding the following to the top of a ruleset: .Pp .Dl "ipfw add deny ip from any to any not antispoof in" .Pp This rule drops all incoming packets that appear to be coming from another directly connected system but on the wrong interface. For example, a packet with a source address of .Li 192.168.0.0/24 , configured on .Li fxp0 , but coming in on .Li fxp1 would be dropped. .Ss DYNAMIC RULES In order to protect a site from flood attacks involving fake TCP packets, it is safer to use dynamic rules: .Pp .Dl "ipfw add check-state" .Dl "ipfw add deny tcp from any to any established" .Dl "ipfw add allow tcp from my-net to any setup keep-state" .Pp This will let the firewall install dynamic rules only for those connection which start with a regular SYN packet coming from the inside of our network. Dynamic rules are checked when encountering the first occurrence of a .Cm check-state , .Cm keep-state or .Cm limit rule. A .Cm check-state rule should usually be placed near the beginning of the ruleset to minimize the amount of work scanning the ruleset. Your mileage may vary. .Pp To limit the number of connections a user can open you can use the following type of rules: .Pp .Dl "ipfw add allow tcp from my-net/24 to any setup limit src-addr 10" .Dl "ipfw add allow tcp from any to me setup limit src-addr 4" .Pp The former (assuming it runs on a gateway) will allow each host on a /24 network to open at most 10 TCP connections. The latter can be placed on a server to make sure that a single client does not use more than 4 simultaneous connections. .Pp .Em BEWARE : stateful rules can be subject to denial-of-service attacks by a SYN-flood which opens a huge number of dynamic rules. The effects of such attacks can be partially limited by acting on a set of .Xr sysctl 8 variables which control the operation of the firewall. .Pp Here is a good usage of the .Cm list command to see accounting records and timestamp information: .Pp .Dl ipfw -at list .Pp or in short form without timestamps: .Pp .Dl ipfw -a list .Pp which is equivalent to: .Pp .Dl ipfw show .Pp Next rule diverts all incoming packets from 192.168.2.0/24 to divert port 5000: .Pp .Dl ipfw divert 5000 ip from 192.168.2.0/24 to any in .Ss TRAFFIC SHAPING The following rules show some of the applications of .Nm and .Nm dummynet for simulations and the like. .Pp This rule drops random incoming packets with a probability of 5%: .Pp .Dl "ipfw add prob 0.05 deny ip from any to any in" .Pp A similar effect can be achieved making use of .Nm dummynet pipes: .Pp .Dl "ipfw add pipe 10 ip from any to any" .Dl "ipfw pipe 10 config plr 0.05" .Pp We can use pipes to artificially limit bandwidth, e.g.\& on a machine acting as a router, if we want to limit traffic from local clients on 192.168.2.0/24 we do: .Pp .Dl "ipfw add pipe 1 ip from 192.168.2.0/24 to any out" .Dl "ipfw pipe 1 config bw 300Kbit/s queue 50KBytes" .Pp note that we use the .Cm out modifier so that the rule is not used twice. Remember in fact that .Nm rules are checked both on incoming and outgoing packets. .Pp Should we want to simulate a bidirectional link with bandwidth limitations, the correct way is the following: .Pp .Dl "ipfw add pipe 1 ip from any to any out" .Dl "ipfw add pipe 2 ip from any to any in" .Dl "ipfw pipe 1 config bw 64Kbit/s queue 10Kbytes" .Dl "ipfw pipe 2 config bw 64Kbit/s queue 10Kbytes" .Pp The above can be very useful, e.g.\& if you want to see how your fancy Web page will look for a residential user who is connected only through a slow link. You should not use only one pipe for both directions, unless you want to simulate a half-duplex medium (e.g.\& AppleTalk, Ethernet, IRDA). It is not necessary that both pipes have the same configuration, so we can also simulate asymmetric links. .Pp Should we want to verify network performance with the RED queue management algorithm: .Pp .Dl "ipfw add pipe 1 ip from any to any" .Dl "ipfw pipe 1 config bw 500Kbit/s queue 100 red 0.002/30/80/0.1" .Pp Another typical application of the traffic shaper is to introduce some delay in the communication. This can significantly affect applications which do a lot of Remote Procedure Calls, and where the round-trip-time of the connection often becomes a limiting factor much more than bandwidth: .Pp .Dl "ipfw add pipe 1 ip from any to any out" .Dl "ipfw add pipe 2 ip from any to any in" .Dl "ipfw pipe 1 config delay 250ms bw 1Mbit/s" .Dl "ipfw pipe 2 config delay 250ms bw 1Mbit/s" .Pp Per-flow queueing can be useful for a variety of purposes. A very simple one is counting traffic: .Pp .Dl "ipfw add pipe 1 tcp from any to any" .Dl "ipfw add pipe 1 udp from any to any" .Dl "ipfw add pipe 1 ip from any to any" .Dl "ipfw pipe 1 config mask all" .Pp The above set of rules will create queues (and collect statistics) for all traffic. Because the pipes have no limitations, the only effect is collecting statistics. Note that we need 3 rules, not just the last one, because when .Nm tries to match IP packets it will not consider ports, so we would not see connections on separate ports as different ones. .Pp A more sophisticated example is limiting the outbound traffic on a net with per-host limits, rather than per-network limits: .Pp .Dl "ipfw add pipe 1 ip from 192.168.2.0/24 to any out" .Dl "ipfw add pipe 2 ip from any to 192.168.2.0/24 in" .Dl "ipfw pipe 1 config mask src-ip 0x000000ff bw 200Kbit/s queue 20Kbytes" .Dl "ipfw pipe 2 config mask dst-ip 0x000000ff bw 200Kbit/s queue 20Kbytes" .Ss LOOKUP TABLES In the following example, we need to create several traffic bandwidth classes and we need different hosts/networks to fall into different classes. We create one pipe for each class and configure them accordingly. Then we create a single table and fill it with IP subnets and addresses. For each subnet/host we set the argument equal to the number of the pipe that it should use. Then we classify traffic using a single rule: .Pp .Dl "ipfw pipe 1 config bw 1000Kbyte/s" .Dl "ipfw pipe 4 config bw 4000Kbyte/s" .Dl "..." .Dl "ipfw table 1 add 192.168.2.0/24 1" .Dl "ipfw table 1 add 192.168.0.0/27 4" .Dl "ipfw table 1 add 192.168.0.2 1" .Dl "..." .Dl "ipfw add pipe tablearg ip from table(1) to any" .Pp Using the .Cm fwd action, the table entries may include hostnames and IP addresses. .Pp .Dl "ipfw table 1 add 192.168.2.0/24 10.23.2.1" .Dl "ipfw table 1 add 192.168.0.0/27 router1.dmz" .Dl "..." .Dl "ipfw add 100 fwd tablearg ip from any to table(1)" .Pp In the following example per-interface firewall is created: .Pp .Dl "ipfw table 10 add vlan20 12000" .Dl "ipfw table 10 add vlan30 13000" .Dl "ipfw table 20 add vlan20 22000" .Dl "ipfw table 20 add vlan30 23000" .Dl ".." .Dl "ipfw add 100 ipfw skipto tablearg ip from any to any recv 'table(10)' in" .Dl "ipfw add 200 ipfw skipto tablearg ip from any to any xmit 'table(10)' out" .Ss SETS OF RULES To add a set of rules atomically, e.g.\& set 18: .Pp .Dl "ipfw set disable 18" .Dl "ipfw add NN set 18 ... # repeat as needed" .Dl "ipfw set enable 18" .Pp To delete a set of rules atomically the command is simply: .Pp .Dl "ipfw delete set 18" .Pp To test a ruleset and disable it and regain control if something goes wrong: .Pp .Dl "ipfw set disable 18" .Dl "ipfw add NN set 18 ... # repeat as needed" .Dl "ipfw set enable 18; echo done; sleep 30 && ipfw set disable 18" .Pp Here if everything goes well, you press control-C before the "sleep" terminates, and your ruleset will be left active. Otherwise, e.g.\& if you cannot access your box, the ruleset will be disabled after the sleep terminates thus restoring the previous situation. .Pp To show rules of the specific set: .Pp .Dl "ipfw set 18 show" .Pp To show rules of the disabled set: .Pp .Dl "ipfw -S set 18 show" .Pp To clear a specific rule counters of the specific set: .Pp .Dl "ipfw set 18 zero NN" .Pp To delete a specific rule of the specific set: .Pp .Dl "ipfw set 18 delete NN" .Ss NAT, REDIRECT AND LSNAT First redirect all the traffic to nat instance 123: .Pp .Dl "ipfw add nat 123 all from any to any" .Pp Then to configure nat instance 123 to alias all the outgoing traffic with ip 192.168.0.123, blocking all incoming connections, trying to keep same ports on both sides, clearing aliasing table on address change and keeping a log of traffic/link statistics: .Pp .Dl "ipfw nat 123 config ip 192.168.0.123 log deny_in reset same_ports" .Pp Or to change address of instance 123, aliasing table will be cleared (see reset option): .Pp .Dl "ipfw nat 123 config ip 10.0.0.1" .Pp To see configuration of nat instance 123: .Pp .Dl "ipfw nat 123 show config" .Pp To show logs of all the instances in range 111-999: .Pp .Dl "ipfw nat 111-999 show" .Pp To see configurations of all instances: .Pp .Dl "ipfw nat show config" .Pp Or a redirect rule with mixed modes could looks like: .Pp .Dl "ipfw nat 123 config redirect_addr 10.0.0.1 10.0.0.66" .Dl " redirect_port tcp 192.168.0.1:80 500" .Dl " redirect_proto udp 192.168.1.43 192.168.1.1" .Dl " redirect_addr 192.168.0.10,192.168.0.11" .Dl " 10.0.0.100 # LSNAT" .Dl " redirect_port tcp 192.168.0.1:80,192.168.0.10:22" .Dl " 500 # LSNAT" .Pp or it could be split in: .Pp .Dl "ipfw nat 1 config redirect_addr 10.0.0.1 10.0.0.66" .Dl "ipfw nat 2 config redirect_port tcp 192.168.0.1:80 500" .Dl "ipfw nat 3 config redirect_proto udp 192.168.1.43 192.168.1.1" .Dl "ipfw nat 4 config redirect_addr 192.168.0.10,192.168.0.11,192.168.0.12" .Dl " 10.0.0.100" .Dl "ipfw nat 5 config redirect_port tcp" .Dl " 192.168.0.1:80,192.168.0.10:22,192.168.0.20:25 500" .Sh SEE ALSO .Xr cpp 1 , .Xr m4 1 , .Xr altq 4 , .Xr divert 4 , .Xr dummynet 4 , .Xr if_bridge 4 , .Xr ip 4 , .Xr ipfirewall 4 , .Xr ng_ipfw 4 , .Xr protocols 5 , .Xr services 5 , .Xr init 8 , .Xr kldload 8 , .Xr reboot 8 , .Xr sysctl 8 , .Xr syslogd 8 .Sh HISTORY The .Nm utility first appeared in .Fx 2.0 . .Nm dummynet was introduced in .Fx 2.2.8 . Stateful extensions were introduced in .Fx 4.0 . .Nm ipfw2 was introduced in Summer 2002. .Sh AUTHORS .An Ugen J. S. Antsilevich , .An Poul-Henning Kamp , .An Alex Nash , .An Archie Cobbs , .An Luigi Rizzo . .Pp .An -nosplit API based upon code written by .An Daniel Boulet for BSDI. .Pp Dummynet has been introduced by Luigi Rizzo in 1997-1998. .Pp Some early work (1999-2000) on the .Nm dummynet traffic shaper supported by Akamba Corp. .Pp The ipfw core (ipfw2) has been completely redesigned and reimplemented by Luigi Rizzo in summer 2002. Further actions and options have been added by various developer over the years. .Pp .An -nosplit In-kernel NAT support written by .An Paolo Pisati Aq piso@FreeBSD.org as part of a Summer of Code 2005 project. .Pp SCTP .Nm nat support has been developed by .An The Centre for Advanced Internet Architectures (CAIA) Aq http://www.caia.swin.edu.au . The primary developers and maintainers are David Hayes and Jason But. For further information visit: .Aq http://www.caia.swin.edu.au/urp/SONATA .Pp Delay profiles have been developed by Alessandro Cerri and Luigi Rizzo, supported by the European Commission within Projects Onelab and Onelab2. .Sh BUGS The syntax has grown over the years and sometimes it might be confusing. Unfortunately, backward compatibility prevents cleaning up mistakes made in the definition of the syntax. .Pp .Em !!! WARNING !!! .Pp Misconfiguring the firewall can put your computer in an unusable state, possibly shutting down network services and requiring console access to regain control of it. .Pp Incoming packet fragments diverted by .Cm divert are reassembled before delivery to the socket. The action used on those packet is the one from the rule which matches the first fragment of the packet. .Pp Packets diverted to userland, and then reinserted by a userland process may lose various packet attributes. The packet source interface name will be preserved if it is shorter than 8 bytes and the userland process saves and reuses the sockaddr_in (as does .Xr natd 8 ) ; otherwise, it may be lost. If a packet is reinserted in this manner, later rules may be incorrectly applied, making the order of .Cm divert rules in the rule sequence very important. .Pp Dummynet drops all packets with IPv6 link-local addresses. .Pp Rules using .Cm uid or .Cm gid may not behave as expected. In particular, incoming SYN packets may have no uid or gid associated with them since they do not yet belong to a TCP connection, and the uid/gid associated with a packet may not be as expected if the associated process calls .Xr setuid 2 or similar system calls. .Pp Rule syntax is subject to the command line environment and some patterns may need to be escaped with the backslash character or quoted appropriately. .Pp Due to the architecture of .Xr libalias 3 , ipfw nat is not compatible with the TCP segmentation offloading (TSO). Thus, to reliably nat your network traffic, please disable TSO on your NICs using .Xr ifconfig 8 . .Pp ICMP error messages are not implicitly matched by dynamic rules for the respective conversations. To avoid failures of network error detection and path MTU discovery, ICMP error messages may need to be allowed explicitly through static rules. .Pp Rules using .Cm call and .Cm return actions may lead to confusing behaviour if ruleset has mistakes, and/or interaction with other subsystems (netgraph, dummynet, etc.) is used. One possible case for this is packet leaving .Nm in subroutine on the input pass, while later on output encountering unpaired .Cm return first. As the call stack is kept intact after input pass, packet will suddenly return to the rule number used on input pass, not on output one. Order of processing should be checked carefully to avoid such mistakes. ipfw3-2012/ipfw/ws2_32.def000644 000423 000000 00000003700 12006744007 015372 0ustar00luigiwheel000000 000000 LIBRARY ws2_32.dll EXPORTS FreeAddrInfoW GetAddrInfoW GetNameInfoW WEP WPUCompleteOverlappedRequest WSAAccept WSAAddressToStringA WSAAddressToStringW WSAAsyncGetHostByAddr WSAAsyncGetHostByName WSAAsyncGetProtoByName WSAAsyncGetProtoByNumber WSAAsyncGetServByName WSAAsyncGetServByPort WSAAsyncSelect WSACancelAsyncRequest WSACancelBlockingCall WSACleanup WSACloseEvent WSAConnect WSACreateEvent WSADuplicateSocketA WSADuplicateSocketW WSAEnumNameSpaceProvidersA WSAEnumNameSpaceProvidersW WSAEnumNetworkEvents WSAEnumProtocolsA WSAEnumProtocolsW WSAEventSelect WSAGetLastError WSAGetOverlappedResult WSAGetQOSByName WSAGetServiceClassInfoA WSAGetServiceClassInfoW WSAGetServiceClassNameByClassIdA WSAGetServiceClassNameByClassIdW WSAHtonl WSAHtons WSAInstallServiceClassA WSAInstallServiceClassW WSAIoctl WSAIsBlocking WSAJoinLeaf WSALookupServiceBeginA WSALookupServiceBeginW WSALookupServiceEnd WSALookupServiceNextA WSALookupServiceNextW WSANSPIoctl WSANtohl WSANtohs WSAProviderConfigChange WSARecv WSARecvDisconnect WSARecvFrom WSARemoveServiceClass WSAResetEvent WSASend WSASendDisconnect WSASendTo WSASetBlockingHook WSASetEvent WSASetLastError WSASetServiceA WSASetServiceW WSASocketA WSASocketW WSAStartup WSAStringToAddressA WSAStringToAddressW WSAUnhookBlockingHook WSAWaitForMultipleEvents WSApSetPostRoutine WSCDeinstallProvider WSCEnableNSProvider WSCEnumProtocols WSCGetProviderPath WSCInstallNameSpace WSCInstallProvider WSCUnInstallNameSpace WSCUpdateProvider WSCWriteNameSpaceOrder WSCWriteProviderOrder __WSAFDIsSet accept bind closesocket connect freeaddrinfo getaddrinfo gethostbyaddr gethostbyname gethostname getnameinfo getpeername getprotobyname getprotobynumber getservbyname getservbyport getsockname getsockopt htonl htons inet_addr inet_ntoa ioctlsocket listen ntohl ntohs recv recvfrom select send sendto setsockopt shutdown socket ipfw3-2012/ipfw/Makefile000644 000423 000000 00000006445 12012011777 015342 0ustar00luigiwheel000000 000000 # # $Id: Makefile 11688 2012-08-12 20:58:26Z luigi $ # # GNUMakefile to build the userland part of ipfw on Linux and Windows # # Do not set with = or := so we can inherit from the caller include ../Makefile.inc all: $(TARGET) #TCC=c:/path/to/tcc # common flags EXTRA_CFLAGS += -O1 EXTRA_CFLAGS += -Wall EXTRA_CFLAGS += -include ../glue.h EXTRA_CFLAGS += -I ./include_e -I ./include TARGET := ipfw ifneq ($(VER),openwrt) ifeq ($(OSARCH),Linux) EXTRA_CFLAGS += -D__BSD_VISIBLE EXTRA_CFLAGS += -Werror # Required by GCC 4.6 EXTRA_CFLAGS += -Wno-unused-but-set-variable endif ifeq ($(OSARCH),FreeBSD) EXTRA_CFLAGS += -D__BSD_VISIBLE EXTRA_CFLAGS += -Werror endif ifeq ($(OSARCH),Darwin) EXTRA_CFLAGS += -D__BSD_VISIBLE EXTRA_CFLAGS += -Werror endif ifeq ($(OSARCH),Windows) # we only support Cygwin and tcc as compilers. ifeq ($(WIN64),1) EXTRA_CFLAGS += -D_X64EMU endif ifeq ($(TCC),) # cygwin EXTRA_CFLAGS += -I/cygdrive/c/$(DDKDIR)/inc/ddk EXTRA_CFLAGS += -I . EXTRA_CFLAGS += -pipe -Wall else #-- build with tcc # TCC points to the root of tcc tree CC=$(TCC)/tcc.exe EXTRA_CFLAGS += -DTCC -I.. EXTRA_CFLAGS += -I$(TCC)/include/winapi -I$(TCC)/include EXTRA_CFLAGS += -nostdinc EFILES_. += err.h grp.h netdb.h pwd.h sysexits.h EFILES_arpa += inet.h EFILES_net += if.h EFILES_netinet += in.h in_systm.h ip.h ip_icmp.h EFILES_sys += cdefs.h wait.h ioctl.h socket.h endif # EXTRA_CFLAGS += -D_WIN32 # see who defines it EXTRA_CFLAGS += -Dsetsockopt=wnd_setsockopt EXTRA_CFLAGS += -Dgetsockopt=wnd_getsockopt EXTRA_CFLAGS += -DEMULATE_SYSCTL EFILES_net += ethernet.h route.h EFILES_netinet += ether.h icmp6.h EFILES_sys += sysctl.h TARGET = ipfw.exe ipfw: $(TARGET) endif # windows endif # !openwrt CFLAGS += $(EXTRA_CFLAGS) # Location of OS headers and libraries. After our stuff. USRDIR?= /usr ifeq ($(TCC),) CFLAGS += -I$(USRDIR)/include LDFLAGS += -L$(USRDIR)/lib else LDFLAGS += -L. -L$(TCC)/lib -lws2_32 endif OBJS = ipfw2.o dummynet.o main.o ipv6.o qsort_r.o OBJS += expand_number.o humanize_number.o glue.o # we don't use ALTQ CFLAGS += -DNO_ALTQ #OBJS += altq.o all: $(TARGET) -@echo "Done build for $(OSARCH) VER $(VER)" $(TARGET): $(OBJS) $(MSG) " LD $@" $(HIDE)$(CC) $(LDFLAGS) -o $@ $^ $(OBJS) : ipfw2.h ../glue.h include_e # support to create empty dirs and files in include_e/ # EDIRS is the list of directories, EFILES is the list of files. EFILES_sys += sockio.h EFILES_. += libutil.h EFILES_netinet += __emtpy.h M ?= $(shell pwd) # first make a list of directories from variable names EDIRS= $(subst EFILES_,,$(filter EFILES_%,$(.VARIABLES))) # then prepend the directory name to individual files. # $(empty) serves to interpret the following space literally, # and the ": = " substitution packs spaces into one. EFILES = $(foreach i,$(EDIRS),$(subst $(empty) , $(i)/, $(EFILES_$(i): = ))) include_e: $(MSG) "building include_e in $M" -@rm -rf $(M)/include_e opt_* -@mkdir -p $(M)/include_e -@(cd $(M)/include_e; mkdir -p $(EDIRS); touch $(EFILES) ) -@(cd $(M)/include_e/netinet; \ for i in ip_fw.h ip_dummynet.h tcp.h; do \ cp ../../../sys/netinet/$$i .; done; ) clean distclean: -@rm -rf $(OBJS) $(TARGET) include_e diff: -@(diff -upr $(BSD_HEAD)/sbin/ipfw .) ipfw3-2012/ipfw/glue.c000644 000423 000000 00000055650 12006744007 015006 0ustar00luigiwheel000000 000000 /* * Copyright (C) 2009 Luigi Rizzo, Marta Carbone, Universita` di Pisa * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: glue.c 11538 2012-08-01 14:14:55Z luigi $ * * Userland functions missing in linux/Windows */ #include #include #include #ifdef _WIN32 #include #include #endif /* _WIN32 */ #ifndef HAVE_NAT /* dummy nat functions */ void ipfw_show_nat(int ac, char **av) { fprintf(stderr, "%s unsupported\n", __FUNCTION__); } void ipfw_config_nat(int ac, char **av) { fprintf(stderr, "%s unsupported\n", __FUNCTION__); } #endif #ifdef __linux__ int optreset; /* missing in linux */ #endif /* * not implemented in linux. * taken from /usr/src/lib/libc/string/strlcpy.c */ size_t strlcpy(char *dst, const char *src, size_t siz) { char *d = dst; const char *s = src; size_t n = siz; /* Copy as many bytes as will fit */ if (n != 0 && --n != 0) { do { if ((*d++ = *s++) == 0) break; } while (--n != 0); } /* Not enough room in dst, add NUL and traverse rest of src */ if (n == 0) { if (siz != 0) *d = '\0'; /* NUL-terminate dst */ while (*s++) ; } return(s - src - 1); /* count does not include NUL */ } /* missing in linux and windows */ long long int strtonum(const char *nptr, long long minval, long long maxval, const char **errstr) { long long ret; int errno_c = errno; /* save actual errno */ errno = 0; #ifdef TCC ret = strtol(nptr, (char **)errstr, 0); #else ret = strtoll(nptr, (char **)errstr, 0); #endif /* We accept only a string that represent exactly a number (ie. start * and end with a digit). * FreeBSD version wants errstr==NULL if no error occurs, otherwise * errstr should point to an error string. * For our purspose, we implement only the invalid error, ranges * error aren't checked */ if (errno != 0 || nptr == *errstr || **errstr != '\0') *errstr = "invalid"; else { *errstr = NULL; errno = errno_c; } return ret; } #if defined (_WIN32) || defined (EMULATE_SYSCTL) //XXX missing prerequisites #include //openwrt #include //openwrt #include #include #endif /* * set or get system information * XXX lock acquisition/serialize calls * * we export this as sys/module/ipfw_mod/parameters/___ * This function get or/and set the value of the sysctl passed by * the name parameter. If the old value is not desired, * oldp and oldlenp should be set to NULL. * * XXX * I do not know how this works in FreeBSD in the case * where there are no write permission on the sysctl var. * We read the value and set return variables in any way * but returns -1 on write failures, regardless the * read success. * * Since there is no information on types, in the following * code we assume a length of 4 is a int. * * Returns 0 on success, -1 on errors. */ int sysctlbyname(const char *name, void *oldp, size_t *oldlenp, void *newp, size_t newlen) { #if defined (_WIN32) || defined (EMULATE_SYSCTL) /* * we embed the sysctl request in the usual sockopt mechanics. * the sockopt buffer il filled with a dn_id with IP_DUMMYNET3 * command, and the special DN_SYSCTL_GET and DN_SYSCTL_SET * subcommands. * the syntax of this function is fully compatible with * POSIX sysctlby name: * if newp and newlen are != 0 => this is a set * else if oldp and oldlen are != 0 => this is a get * to avoid too much overhead in the module, the whole * sysctltable is returned, and the parsing is done in userland, * a probe request is done to retrieve the size needed to * transfer the table, before the real request * if both old and new params = 0 => this is a print * this is a special request, done only by main() * to implement the extension './ipfw sysctl', * a command that bypasses the normal getopt, and that * is available on those platforms that use this * sysctl emulation. * in this case, a negative oldlen signals that *oldp * is actually a FILE* to print somewhere else than stdout */ int l; int ret; struct dn_id* oid; struct sysctlhead* entry; char* pstring; char* pdata; FILE* fp; if((oldlenp != NULL) && (*oldlenp < 0)) fp = (FILE*)oldp; else fp = stdout; if(newp != NULL && newlen != 0) { //this is a set l = sizeof(struct dn_id) + sizeof(struct sysctlhead) + strlen(name)+1 + newlen; oid = malloc(l); if (oid == NULL) return -1; oid->len = l; oid->type = DN_SYSCTL_SET; oid->id = DN_API_VERSION; entry = (struct sysctlhead*)(oid+1); pdata = (char*)(entry+1); pstring = pdata + newlen; entry->blocklen = ((sizeof(struct sysctlhead) + strlen(name)+1 + newlen) + 3) & ~3; entry->namelen = strlen(name)+1; entry->flags = 0; entry->datalen = newlen; bcopy(newp, pdata, newlen); bcopy(name, pstring, strlen(name)+1); ret = do_cmd(IP_DUMMYNET3, oid, (uintptr_t)l); if (ret != 0) return -1; } else { //this is a get or a print l = sizeof(struct dn_id); oid = malloc(l); if (oid == NULL) return -1; oid->len = l; oid->type = DN_SYSCTL_GET; oid->id = DN_API_VERSION; ret = do_cmd(-IP_DUMMYNET3, oid, (uintptr_t)&l); if (ret != 0) return -1; l=oid->id; free(oid); oid = malloc(l); if (oid == NULL) return -1; oid->len = l; oid->type = DN_SYSCTL_GET; oid->id = DN_API_VERSION; ret = do_cmd(-IP_DUMMYNET3, oid, (uintptr_t)&l); if (ret != 0) return -1; entry = (struct sysctlhead*)(oid+1); while(entry->blocklen != 0) { pdata = (char*)(entry+1); pstring = pdata+entry->datalen; //time to check if this is a get or a print if(name != NULL && oldp != NULL && *oldlenp > 0) { //this is a get if(strcmp(name,pstring) == 0) { //match found, sanity chech on len if(*oldlenp < entry->datalen) { printf("%s error: buffer too small\n",__FUNCTION__); return -1; } *oldlenp = entry->datalen; bcopy(pdata, oldp, *oldlenp); return 0; } } else { //this is a print if( name == NULL ) goto print; if ( (strncmp(pstring,name,strlen(name)) == 0) && ( pstring[strlen(name)]=='\0' || pstring[strlen(name)]=='.' ) ) goto print; else goto skip; print: fprintf(fp, "%s: ",pstring); switch( entry->flags >> 2 ) { case SYSCTLTYPE_LONG: fprintf(fp, "%li ", *(long*)(pdata)); break; case SYSCTLTYPE_UINT: fprintf(fp, "%u ", *(unsigned int*)(pdata)); break; case SYSCTLTYPE_ULONG: fprintf(fp, "%lu ", *(unsigned long*)(pdata)); break; case SYSCTLTYPE_INT: default: fprintf(fp, "%i ", *(int*)(pdata)); } if( (entry->flags & 0x00000003) == CTLFLAG_RD ) fprintf(fp, "\t(read only)\n"); else fprintf(fp, "\n"); skip: ; } entry = (struct sysctlhead*)((unsigned char*)entry + entry->blocklen); } free(oid); return 0; } //fallback for invalid options return -1; #else /* __linux__ */ FILE *fp; char *basename = "/sys/module/ipfw_mod/parameters/"; char filename[256]; /* full filename */ char *varp; int ret = 0; /* return value */ int d; if (name == NULL) /* XXX set errno */ return -1; /* locate the filename */ varp = strrchr(name, '.'); if (varp == NULL) /* XXX set errno */ return -1; snprintf(filename, sizeof(filename), "%s%s", basename, varp+1); /* * XXX we could open the file here, in rw mode * but need to check if a file have write * permissions. */ /* check parameters */ if (oldp && oldlenp) { /* read mode */ fp = fopen(filename, "r"); if (fp == NULL) { fprintf(stderr, "%s fopen error reading filename %s\n", __FUNCTION__, filename); return -1; } if (*oldlenp == 4) { if (fscanf(fp, "%d", &d) == 1) memcpy(oldp, &d, *oldlenp); else ret = -1; } fclose(fp); } if (newp && newlen) { /* write */ fp = fopen(filename, "w"); if (fp == NULL) { fprintf(stderr, "%s fopen error writing filename %s\n", __FUNCTION__, filename); return -1; } if (newlen == 4) { if (fprintf(fp, "%d", *(int*)newp) < 1) ret = -1; } fclose(fp); } return ret; #endif /* __linux__ */ } #ifdef _WIN32 /* * On windows, set/getsockopt are mapped to DeviceIoControl() */ int wnd_setsockopt(int s, int level, int sopt_name, const void *optval, socklen_t optlen) { size_t len = sizeof (struct sockopt) + optlen; struct sockopt *sock; DWORD n; BOOL result; HANDLE _dev_h = (HANDLE)s; /* allocate a data structure for communication */ sock = malloc(len); if (sock == NULL) return -1; sock->sopt_dir = SOPT_SET; sock->sopt_name = sopt_name; sock->sopt_valsize = optlen; sock->sopt_val = (void *)(sock+1); memcpy(sock->sopt_val, optval, optlen); result = DeviceIoControl (_dev_h, IP_FW_SETSOCKOPT, sock, len, NULL, 0, &n, NULL); free (sock); return (result ? 0 : -1); } int wnd_getsockopt(int s, int level, int sopt_name, void *optval, socklen_t *optlen) { size_t len = sizeof (struct sockopt) + *optlen; struct sockopt *sock; DWORD n; BOOL result; HANDLE _dev_h = (HANDLE)s; sock = malloc(len); if (sock == NULL) return -1; sock->sopt_dir = SOPT_GET; sock->sopt_name = sopt_name; sock->sopt_valsize = *optlen; sock->sopt_val = (void *)(sock+1); memcpy (sock->sopt_val, optval, *optlen); result = DeviceIoControl (_dev_h, IP_FW_GETSOCKOPT, sock, len, sock, len, &n, NULL); //printf("len = %i, returned = %u, valsize = %i\n",len,n,sock->sopt_valsize); *optlen = sock->sopt_valsize; memcpy (optval, sock->sopt_val, *optlen); free (sock); return (result ? 0 : -1); } int my_socket(int domain, int ty, int proto) { TCHAR *pcCommPort = TEXT("\\\\.\\Ipfw"); HANDLE _dev_h = INVALID_HANDLE_VALUE; /* Special Handling For Accessing Device On Windows 2000 Terminal Server See Microsoft KB Article 259131 */ if (_dev_h == INVALID_HANDLE_VALUE) { _dev_h = CreateFile (pcCommPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); } if (_dev_h == INVALID_HANDLE_VALUE) { printf("%s failed %u, cannot talk to kernel module\n", __FUNCTION__, (unsigned)GetLastError()); return -1; } return (int)_dev_h; } struct hostent* gethostbyname2(const char *name, int af) { return gethostbyname(name); } struct ether_addr* ether_aton(const char *a) { fprintf(stderr, "%s empty\n", __FUNCTION__); return NULL; } #ifdef TCC int opterr = 1, /* if error message should be printed */ optind = 1, /* index into parent argv vector */ optopt, /* character checked for validity */ optreset; /* reset getopt */ char *optarg; /* argument associated with option */ #define BADCH (int)'?' #define BADARG (int)':' #define EMSG "" #define PROGNAME "ipfw" /* * getopt -- * Parse argc/argv argument vector. */ int getopt(nargc, nargv, ostr) int nargc; char * const nargv[]; const char *ostr; { static char *place = EMSG; /* option letter processing */ char *oli; /* option letter list index */ if (optreset || *place == 0) { /* update scanning pointer */ optreset = 0; place = nargv[optind]; if (optind >= nargc || *place++ != '-') { /* Argument is absent or is not an option */ place = EMSG; return (-1); } optopt = *place++; if (optopt == '-' && *place == 0) { /* "--" => end of options */ ++optind; place = EMSG; return (-1); } if (optopt == 0) { /* Solitary '-', treat as a '-' option if the program (eg su) is looking for it. */ place = EMSG; if (strchr(ostr, '-') == NULL) return (-1); optopt = '-'; } } else optopt = *place++; /* See if option letter is one the caller wanted... */ if (optopt == ':' || (oli = strchr(ostr, optopt)) == NULL) { if (*place == 0) ++optind; if (opterr && *ostr != ':') (void)fprintf(stderr, "%s: illegal option -- %c\n", PROGNAME, optopt); return (BADCH); } /* Does this option need an argument? */ if (oli[1] != ':') { /* don't need argument */ optarg = NULL; if (*place == 0) ++optind; } else { /* Option-argument is either the rest of this argument or the entire next argument. */ if (*place) optarg = place; else if (nargc > ++optind) optarg = nargv[optind]; else { /* option-argument absent */ place = EMSG; if (*ostr == ':') return (BADARG); if (opterr) (void)fprintf(stderr, "%s: option requires an argument -- %c\n", PROGNAME, optopt); return (BADCH); } place = EMSG; ++optind; } return (optopt); /* return option letter */ } //static FILE *err_file = stderr; void verrx(int ex, int eval, const char *fmt, va_list ap) { fprintf(stderr, "%s: ", PROGNAME); if (fmt != NULL) vfprintf(stderr, fmt, ap); fprintf(stderr, "\n"); if (ex) exit(eval); } void errx(int eval, const char *fmt, ...) { va_list ap; va_start(ap, fmt); verrx(1, eval, fmt, ap); va_end(ap); } void warnx(const char *fmt, ...) { va_list ap; va_start(ap, fmt); verrx(0, 0, fmt, ap); va_end(ap); } char * strsep(char **stringp, const char *delim) { char *s; const char *spanp; int c, sc; char *tok; if ((s = *stringp) == NULL) return (NULL); for (tok = s;;) { c = *s++; spanp = delim; do { if ((sc = *spanp++) == c) { if (c == 0) s = NULL; else s[-1] = 0; *stringp = s; return (tok); } } while (sc != 0); } /* NOTREACHED */ } static unsigned char tolower(unsigned char c) { return (c >= 'A' && c <= 'Z') ? c + 'a' - 'A' : c; } static int isdigit(unsigned char c) { return (c >= '0' && c <= '9'); } static int isxdigit(unsigned char c) { return (strchr("0123456789ABCDEFabcdef", c) ? 1 : 0); } static int isspace(unsigned char c) { return (strchr(" \t\n\r", c) ? 1 : 0); } static int isascii(unsigned char c) { return (c < 128); } static int islower(unsigned char c) { return (c >= 'a' && c <= 'z'); } int strcasecmp(const char *s1, const char *s2) { const unsigned char *us1 = (const unsigned char *)s1, *us2 = (const unsigned char *)s2; while (tolower(*us1) == tolower(*us2++)) if (*us1++ == '\0') return (0); return (tolower(*us1) - tolower(*--us2)); } intmax_t strtoimax(const char * restrict nptr, char ** restrict endptr, int base) { return strtol(nptr, endptr,base); } void setservent(int a) { } #define NS_INADDRSZ 128 int inet_pton(int af, const char *src, void *dst) { static const char digits[] = "0123456789"; int saw_digit, octets, ch; u_char tmp[NS_INADDRSZ], *tp; if (af != AF_INET) { errno = EINVAL; return -1; } saw_digit = 0; octets = 0; *(tp = tmp) = 0; while ((ch = *src++) != '\0') { const char *pch; if ((pch = strchr(digits, ch)) != NULL) { u_int new = *tp * 10 + (pch - digits); if (saw_digit && *tp == 0) return (0); if (new > 255) return (0); *tp = new; if (!saw_digit) { if (++octets > 4) return (0); saw_digit = 1; } } else if (ch == '.' && saw_digit) { if (octets == 4) return (0); *++tp = 0; saw_digit = 0; } else return (0); } if (octets < 4) return (0); memcpy(dst, tmp, NS_INADDRSZ); return (1); } const char * inet_ntop(int af, const void *_src, char *dst, socklen_t size) { static const char fmt[] = "%u.%u.%u.%u"; char tmp[sizeof "255.255.255.255"]; const u_char *src = _src; int l; if (af != AF_INET) { errno = EINVAL; return NULL; } l = snprintf(tmp, sizeof(tmp), fmt, src[0], src[1], src[2], src[3]); if (l <= 0 || (socklen_t) l >= size) { errno = ENOSPC; return (NULL); } strlcpy(dst, tmp, size); return (dst); } /*% * Check whether "cp" is a valid ascii representation * of an Internet address and convert to a binary address. * Returns 1 if the address is valid, 0 if not. * This replaces inet_addr, the return value from which * cannot distinguish between failure and a local broadcast address. */ int inet_aton(const char *cp, struct in_addr *addr) { u_long val; int base, n; char c; u_int8_t parts[4]; u_int8_t *pp = parts; int digit; c = *cp; for (;;) { /* * Collect number up to ``.''. * Values are specified as for C: * 0x=hex, 0=octal, isdigit=decimal. */ if (!isdigit((unsigned char)c)) return (0); val = 0; base = 10; digit = 0; if (c == '0') { c = *++cp; if (c == 'x' || c == 'X') base = 16, c = *++cp; else { base = 8; digit = 1 ; } } for (;;) { if (isascii(c) && isdigit((unsigned char)c)) { if (base == 8 && (c == '8' || c == '9')) return (0); val = (val * base) + (c - '0'); c = *++cp; digit = 1; } else if (base == 16 && isascii(c) && isxdigit((unsigned char)c)) { val = (val << 4) | (c + 10 - (islower((unsigned char)c) ? 'a' : 'A')); c = *++cp; digit = 1; } else break; } if (c == '.') { /* * Internet format: * a.b.c.d * a.b.c (with c treated as 16 bits) * a.b (with b treated as 24 bits) */ if (pp >= parts + 3 || val > 0xffU) return (0); *pp++ = val; c = *++cp; } else break; } /* * Check for trailing characters. */ if (c != '\0' && (!isascii(c) || !isspace((unsigned char)c))) return (0); /* * Did we get a valid digit? */ if (!digit) return (0); /* * Concoct the address according to * the number of parts specified. */ n = pp - parts + 1; switch (n) { case 1: /*%< a -- 32 bits */ break; case 2: /*%< a.b -- 8.24 bits */ if (val > 0xffffffU) return (0); val |= parts[0] << 24; break; case 3: /*%< a.b.c -- 8.8.16 bits */ if (val > 0xffffU) return (0); val |= (parts[0] << 24) | (parts[1] << 16); break; case 4: /*%< a.b.c.d -- 8.8.8.8 bits */ if (val > 0xffU) return (0); val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); break; } if (addr != NULL) addr->s_addr = htonl(val); return (1); } #endif /* TCC */ #endif /* _WIN32 */ ipfw3-2012/ipfw/ipfw2.h000644 000423 000000 00000015542 12010142067 015073 0ustar00luigiwheel000000 000000 /* * Copyright (c) 2002-2003 Luigi Rizzo * Copyright (c) 1996 Alex Nash, Paul Traina, Poul-Henning Kamp * Copyright (c) 1994 Ugen J.S.Antsilevich * * Idea and grammar partially left from: * Copyright (c) 1993 Daniel Boulet * * Redistribution and use in source forms, with and without modification, * are permitted provided that this entire comment appears intact. * * Redistribution in binary form may occur without any restrictions. * Obviously, it would be nice if you gave credit where credit is due * but requiring it would be too onerous. * * This software is provided ``AS IS'' without any warranties of any kind. * * NEW command line interface for IP firewall facility * * $FreeBSD: head/sbin/ipfw/ipfw2.h 206843 2010-04-19 15:11:45Z luigi $ */ /* * Options that can be set on the command line. * When reading commands from a file, a subset of the options can also * be applied globally by specifying them before the file name. * After that, each line can contain its own option that changes * the global value. * XXX The context is not restored after each line. */ struct cmdline_opts { /* boolean options: */ int do_value_as_ip; /* show table value as IP */ int do_resolv; /* try to resolve all ip to names */ int do_time; /* Show time stamps */ int do_quiet; /* Be quiet in add and flush */ int do_pipe; /* this cmd refers to a pipe/queue/sched */ int do_nat; /* this cmd refers to a nat config */ int do_dynamic; /* display dynamic rules */ int do_expired; /* display expired dynamic rules */ int do_compact; /* show rules in compact mode */ int do_force; /* do not ask for confirmation */ int show_sets; /* display the set each rule belongs to */ int test_only; /* only check syntax */ int comment_only; /* only print action and comment */ int verbose; /* be verbose on some commands */ /* The options below can have multiple values. */ int do_sort; /* field to sort results (0 = no) */ /* valid fields are 1 and above */ int use_set; /* work with specified set number */ /* 0 means all sets, otherwise apply to set use_set - 1 */ }; extern struct cmdline_opts co; /* * _s_x is a structure that stores a string <-> token pairs, used in * various places in the parser. Entries are stored in arrays, * with an entry with s=NULL as terminator. * The search routines are match_token() and match_value(). * Often, an element with x=0 contains an error string. * */ struct _s_x { char const *s; int x; }; enum tokens { TOK_NULL=0, TOK_OR, TOK_NOT, TOK_STARTBRACE, TOK_ENDBRACE, TOK_ACCEPT, TOK_COUNT, TOK_PIPE, TOK_LINK, TOK_QUEUE, TOK_FLOWSET, TOK_SCHED, TOK_DIVERT, TOK_TEE, TOK_NETGRAPH, TOK_NGTEE, TOK_FORWARD, TOK_SKIPTO, TOK_DENY, TOK_REJECT, TOK_RESET, TOK_UNREACH, TOK_CHECKSTATE, TOK_NAT, TOK_REASS, TOK_CALL, TOK_RETURN, TOK_ALTQ, TOK_LOG, TOK_TAG, TOK_UNTAG, TOK_TAGGED, TOK_UID, TOK_GID, TOK_JAIL, TOK_IN, TOK_LIMIT, TOK_KEEPSTATE, TOK_LAYER2, TOK_OUT, TOK_DIVERTED, TOK_DIVERTEDLOOPBACK, TOK_DIVERTEDOUTPUT, TOK_XMIT, TOK_RECV, TOK_VIA, TOK_FRAG, TOK_IPOPTS, TOK_IPLEN, TOK_IPID, TOK_IPPRECEDENCE, TOK_DSCP, TOK_IPTOS, TOK_IPTTL, TOK_IPVER, TOK_ESTAB, TOK_SETUP, TOK_TCPDATALEN, TOK_TCPFLAGS, TOK_TCPOPTS, TOK_TCPSEQ, TOK_TCPACK, TOK_TCPWIN, TOK_ICMPTYPES, TOK_MAC, TOK_MACTYPE, TOK_VERREVPATH, TOK_VERSRCREACH, TOK_ANTISPOOF, TOK_IPSEC, TOK_COMMENT, TOK_PLR, TOK_NOERROR, TOK_BUCKETS, TOK_DSTIP, TOK_SRCIP, TOK_DSTPORT, TOK_SRCPORT, TOK_ALL, TOK_MASK, TOK_FLOW_MASK, TOK_SCHED_MASK, TOK_BW, TOK_DELAY, TOK_PROFILE, TOK_BURST, TOK_RED, TOK_GRED, TOK_DROPTAIL, TOK_PROTO, /* dummynet tokens */ TOK_WEIGHT, TOK_LMAX, TOK_PRI, TOK_TYPE, TOK_SLOTSIZE, TOK_IP, TOK_IF, TOK_ALOG, TOK_DENY_INC, TOK_SAME_PORTS, TOK_UNREG_ONLY, TOK_SKIP_GLOBAL, TOK_RESET_ADDR, TOK_ALIAS_REV, TOK_PROXY_ONLY, TOK_REDIR_ADDR, TOK_REDIR_PORT, TOK_REDIR_PROTO, TOK_IPV6, TOK_FLOWID, TOK_ICMP6TYPES, TOK_EXT6HDR, TOK_DSTIP6, TOK_SRCIP6, TOK_IPV4, TOK_UNREACH6, TOK_RESET6, TOK_FIB, TOK_SETFIB, TOK_LOOKUP, TOK_SOCKARG, }; /* * the following macro returns an error message if we run out of * arguments. */ #define NEED(_p, msg) {if (!_p) errx(EX_USAGE, msg);} #define NEED1(msg) {if (!(*av)) errx(EX_USAGE, msg);} int pr_u64(uint64_t *pd, int width); /* memory allocation support */ void *safe_calloc(size_t number, size_t size); void *safe_realloc(void *ptr, size_t size); /* string comparison functions used for historical compatibility */ int _substrcmp(const char *str1, const char* str2); int _substrcmp2(const char *str1, const char* str2, const char* str3); /* utility functions */ int match_token(struct _s_x *table, char *string); char const *match_value(struct _s_x *p, int value); int do_cmd(int optname, void *optval, uintptr_t optlen); struct in6_addr; void n2mask(struct in6_addr *mask, int n); int contigmask(uint8_t *p, int len); /* * Forward declarations to avoid include way too many headers. * C does not allow duplicated typedefs, so we use the base struct * that the typedef points to. * Should the typedefs use a different type, the compiler will * still detect the change when compiling the body of the * functions involved, so we do not lose error checking. */ struct _ipfw_insn; struct _ipfw_insn_altq; struct _ipfw_insn_u32; struct _ipfw_insn_ip6; struct _ipfw_insn_icmp6; /* * The reserved set numer. This is a constant in ip_fw.h * but we store it in a variable so other files do not depend * in that header just for one constant. */ extern int resvd_set_number; /* first-level command handlers */ void ipfw_add(char *av[]); void ipfw_show_nat(int ac, char **av); void ipfw_config_pipe(int ac, char **av); void ipfw_config_nat(int ac, char **av); void ipfw_sets_handler(char *av[]); void ipfw_table_handler(int ac, char *av[]); void ipfw_sysctl_handler(char *av[], int which); void ipfw_delete(char *av[]); void ipfw_flush(int force); void ipfw_zero(int ac, char *av[], int optname); void ipfw_list(int ac, char *av[], int show_counters); /* altq.c */ void altq_set_enabled(int enabled); u_int32_t altq_name_to_qid(const char *name); void print_altq_cmd(struct _ipfw_insn_altq *altqptr); /* dummynet.c */ void dummynet_list(int ac, char *av[], int show_counters); void dummynet_flush(void); int ipfw_delete_pipe(int pipe_or_queue, int n); /* ipv6.c */ void print_unreach6_code(uint16_t code); void print_ip6(struct _ipfw_insn_ip6 *cmd, char const *s); void print_flow6id(struct _ipfw_insn_u32 *cmd); void print_icmp6types(struct _ipfw_insn_u32 *cmd); void print_ext6hdr(struct _ipfw_insn *cmd ); struct _ipfw_insn *add_srcip6(struct _ipfw_insn *cmd, char *av); struct _ipfw_insn *add_dstip6(struct _ipfw_insn *cmd, char *av); void fill_flow6(struct _ipfw_insn_u32 *cmd, char *av ); void fill_unreach6_code(u_short *codep, char *str); void fill_icmp6types(struct _ipfw_insn_icmp6 *cmd, char *av); int fill_ext6hdr(struct _ipfw_insn *cmd, char *av); ipfw3-2012/ipfw/include/net/000755 000423 000000 00000000000 12006744007 016104 5ustar00luigiwheel000000 000000 ipfw3-2012/ipfw/include/alias.h000644 000423 000000 00000004525 12006744007 016566 0ustar00luigiwheel000000 000000 #ifndef _ALIAS_H_ #define _ALIAS_H_ #define LIBALIAS_BUF_SIZE 128 /* * If PKT_ALIAS_LOG is set, a message will be printed to /var/log/alias.log * every time a link is created or deleted. This is useful for debugging. */ #define PKT_ALIAS_LOG 0x01 /* * If PKT_ALIAS_DENY_INCOMING is set, then incoming connections (e.g. to ftp, * telnet or web servers will be prevented by the aliasing mechanism. */ #define PKT_ALIAS_DENY_INCOMING 0x02 /* * If PKT_ALIAS_SAME_PORTS is set, packets will be attempted sent from the * same port as they originated on. This allows e.g. rsh to work *99% of the * time*, but _not_ 100% (it will be slightly flakey instead of not working * at all). This mode bit is set by PacketAliasInit(), so it is a default * mode of operation. */ #define PKT_ALIAS_SAME_PORTS 0x04 /* * If PKT_ALIAS_USE_SOCKETS is set, then when partially specified links (e.g. * destination port and/or address is zero), the packet aliasing engine will * attempt to allocate a socket for the aliasing port it chooses. This will * avoid interference with the host machine. Fully specified links do not * require this. This bit is set after a call to PacketAliasInit(), so it is * a default mode of operation. */ #ifndef NO_USE_SOCKETS #define PKT_ALIAS_USE_SOCKETS 0x08 #endif /*- * If PKT_ALIAS_UNREGISTERED_ONLY is set, then only packets with * unregistered source addresses will be aliased. Private * addresses are those in the following ranges: * * 10.0.0.0 -> 10.255.255.255 * 172.16.0.0 -> 172.31.255.255 * 192.168.0.0 -> 192.168.255.255 */ #define PKT_ALIAS_UNREGISTERED_ONLY 0x10 /* * If PKT_ALIAS_RESET_ON_ADDR_CHANGE is set, then the table of dynamic * aliasing links will be reset whenever PacketAliasSetAddress() changes the * default aliasing address. If the default aliasing address is left * unchanged by this function call, then the table of dynamic aliasing links * will be left intact. This bit is set after a call to PacketAliasInit(). */ #define PKT_ALIAS_RESET_ON_ADDR_CHANGE 0x20 /* * If PKT_ALIAS_PROXY_ONLY is set, then NAT will be disabled and only * transparent proxying is performed. */ #define PKT_ALIAS_PROXY_ONLY 0x40 /* * If PKT_ALIAS_REVERSE is set, the actions of PacketAliasIn() and * PacketAliasOut() are reversed. */ #define PKT_ALIAS_REVERSE 0x80 #endif /* !_ALIAS_H_ */ ipfw3-2012/ipfw/include/timeconv.h000644 000423 000000 00000000432 12006744007 017312 0ustar00luigiwheel000000 000000 /* * simple override for _long_to_time() */ #ifndef _TIMECONV_H_ #define _TIMECONV_H_ static __inline time_t _long_to_time(long tlong) { if (sizeof(long) == sizeof(__int32_t)) return((time_t)(__int32_t)(tlong)); return((time_t)tlong); } #endif /* _TIMECONV_H_ */ ipfw3-2012/ipfw/include/net/if_dl.h000644 000423 000000 00000006462 12006744007 017342 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)if_dl.h 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/net/if_dl.h,v 1.14 2005/01/07 01:45:34 imp Exp $ */ #ifndef _NET_IF_DL_H_ #define _NET_IF_DL_H_ /* * A Link-Level Sockaddr may specify the interface in one of two * ways: either by means of a system-provided index number (computed * anew and possibly differently on every reboot), or by a human-readable * string such as "il0" (for managerial convenience). * * Census taking actions, such as something akin to SIOCGCONF would return * both the index and the human name. * * High volume transactions (such as giving a link-level ``from'' address * in a recvfrom or recvmsg call) may be likely only to provide the indexed * form, (which requires fewer copy operations and less space). * * The form and interpretation of the link-level address is purely a matter * of convention between the device driver and its consumers; however, it is * expected that all drivers for an interface of a given if_type will agree. */ /* * Structure of a Link-Level sockaddr: */ struct sockaddr_dl { u_char sdl_len; /* Total length of sockaddr */ u_char sdl_family; /* AF_LINK */ u_short sdl_index; /* if != 0, system given index for interface */ u_char sdl_type; /* interface type */ u_char sdl_nlen; /* interface name length, no trailing 0 reqd. */ u_char sdl_alen; /* link level address length */ u_char sdl_slen; /* link layer selector length */ char sdl_data[46]; /* minimum work area, can be larger; contains both if name and ll address */ }; #define LLADDR(s) ((caddr_t)((s)->sdl_data + (s)->sdl_nlen)) #ifndef _KERNEL #include __BEGIN_DECLS void link_addr(const char *, struct sockaddr_dl *); char *link_ntoa(const struct sockaddr_dl *); __END_DECLS #endif /* !_KERNEL */ #endif ipfw3-2012/ipfw/include/net/pfvar.h000644 000423 000000 00000001323 12006744007 017372 0ustar00luigiwheel000000 000000 #ifndef _PF_VAR_H_ #define _PF_VAR_H_ /* * replacement for FreeBSD's pfqueue.h */ #include #define DIOCSTARTALTQ _IO ('D', 42) #define DIOCSTOPALTQ _IO ('D', 43) struct pf_altq { TAILQ_ENTRY(pf_altq) entries; /* ... */ u_int32_t qid; /* return value */ #define PF_QNAME_SIZE 64 char qname[PF_QNAME_SIZE]; /* queue name */ }; struct pfioc_altq { u_int32_t action; u_int32_t ticket; u_int32_t nr; struct pf_altq altq; }; #define DIOCGETALTQS _IOWR('D', 47, struct pfioc_altq) #define DIOCGETALTQ _IOWR('D', 48, struct pfioc_altq) #endif /* !_PF_VAR_H */ ipfw3-2012/kipfw/000755 000423 000000 00000000000 12012013736 014041 5ustar00luigiwheel000000 000000 ipfw3-2012/kipfw/missing.h000644 000423 000000 00000045160 12006744005 015674 0ustar00luigiwheel000000 000000 /* * Copyright (C) 2009 Luigi Rizzo, Marta Carbone, Universita` di Pisa * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: missing.h 11531 2012-08-01 10:53:02Z luigi $ * * Header for kernel variables and functions that are not available in * userland. */ #ifndef _MISSING_H_ #define _MISSING_H_ #include #ifdef linux #include #include #include #endif /* linux */ /* portability features, to be set before the rest: */ #define HAVE_NET_IPLEN /* iplen/ipoff in net format */ #define WITHOUT_BPF /* do not use bpf logging */ #ifdef _WIN32 #ifndef DEFINE_SPINLOCK #define DEFINE_SPINLOCK(x) FAST_MUTEX x #endif /* spinlock --> Guarded Mutex KGUARDED_MUTEX */ /* http://www.reactos.org/wiki/index.php/Guarded_Mutex */ #define spin_lock_init(_l) #define spin_lock_bh(_l) #define spin_unlock_bh(_l) #include /* bsd-compat.c */ #include /* bsd-compat.c */ #include /* local version */ #define INADDR_TO_IFP(a, b) b = NULL #else /* __linux__ */ #define MALLOC_DECLARE(x) /* nothing */ #include /* do_gettimeofday */ #include /* local version */ struct inpcb; /* * Kernel locking support. * FreeBSD uses mtx in dummynet.c and struct rwlock ip_fw2.c * * In linux we use spinlock_bh to implement both. * For 'struct rwlock' we need an #ifdef to change it to spinlock_t */ #ifndef DEFINE_SPINLOCK /* this is for linux 2.4 */ #define DEFINE_SPINLOCK(x) spinlock_t x = SPIN_LOCK_UNLOCKED #endif #define rw_assert(a, b) #define rw_destroy(_l) #define rw_init(_l, msg) spin_lock_init(_l) #define rw_rlock(_l) spin_lock_bh(_l) #define rw_runlock(_l) spin_unlock_bh(_l) #define rw_wlock(_l) spin_lock_bh(_l) #define rw_wunlock(_l) spin_unlock_bh(_l) #define rw_init_flags(_l, s, v) #define mtx_assert(a, b) #define mtx_destroy(m) #define mtx_init(m, a,b,c) spin_lock_init(m) #define mtx_lock(_l) spin_lock_bh(_l) #define mtx_unlock(_l) spin_unlock_bh(_l) #endif /* __linux__ */ /* end of locking support */ /* * Reference to an ipfw rule that can be carried outside critical sections. * A rule is identified by rulenum:rule_id which is ordered. * In version chain_id the rule can be found in slot 'slot', so * we don't need a lookup if chain_id == chain->id. * * On exit from the firewall this structure refers to the rule after * the matching one (slot points to the new rule; rulenum:rule_id-1 * is the matching rule), and additional info (e.g. info often contains * the insn argument or tablearg in the low 16 bits, in host format). * On entry, the structure is valid if slot>0, and refers to the starting * rules. 'info' contains the reason for reinject, e.g. divert port, * divert direction, and so on. */ struct ipfw_rule_ref { uint32_t slot; /* slot for matching rule */ uint32_t rulenum; /* matching rule number */ uint32_t rule_id; /* matching rule id */ uint32_t chain_id; /* ruleset id */ uint32_t info; /* see below */ }; enum { IPFW_INFO_MASK = 0x0000ffff, IPFW_INFO_OUT = 0x00000000, /* outgoing, just for convenience */ IPFW_INFO_IN = 0x80000000, /* incoming, overloads dir */ IPFW_ONEPASS = 0x40000000, /* One-pass, do not reinject */ IPFW_IS_MASK = 0x30000000, /* which source ? */ IPFW_IS_DIVERT = 0x20000000, IPFW_IS_DUMMYNET =0x10000000, IPFW_IS_PIPE = 0x08000000, /* pipe=1, queue = 0 */ }; /* in netinet/in.h */ #define in_nullhost(x) ((x).s_addr == INADDR_ANY) /* bzero not present on linux, but this should go in glue.h */ #define bzero(s, n) memset(s, 0, n) #define bcmp(p1, p2, n) memcmp(p1, p2, n) /* ethernet stuff */ #define ETHERTYPE_IP 0x0800 /* IP protocol */ //#define ETHER_ADDR_LEN 6 /* length of an Ethernet address */ struct ether_header { u_char ether_dhost[ETHER_ADDR_LEN]; u_char ether_shost[ETHER_ADDR_LEN]; u_short ether_type; }; #define ETHER_TYPE_LEN 2 /* length of the Ethernet type field */ #define ETHER_HDR_LEN (ETHER_ADDR_LEN*2+ETHER_TYPE_LEN) /* * Historically, BSD keeps ip_len and ip_off in host format * when doing layer 3 processing, and this often requires * to translate the format back and forth. * To make the process explicit, we define a couple of macros * that also take into account the fact that at some point * we may want to keep those fields always in net format. */ #if (BYTE_ORDER == BIG_ENDIAN) || defined(HAVE_NET_IPLEN) #define SET_NET_IPLEN(p) do {} while (0) #define SET_HOST_IPLEN(p) do {} while (0) #else /* never on linux */ #define SET_NET_IPLEN(p) do { \ struct ip *h_ip = (p); \ h_ip->ip_len = htons(h_ip->ip_len); \ h_ip->ip_off = htons(h_ip->ip_off); \ } while (0) #define SET_HOST_IPLEN(p) do { \ struct ip *h_ip = (p); \ h_ip->ip_len = ntohs(h_ip->ip_len); \ h_ip->ip_off = ntohs(h_ip->ip_off); \ } while (0) #endif /* !HAVE_NET_IPLEN */ /* ip_dummynet.c */ #define __FreeBSD_version 500035 #ifdef __linux__ struct moduledata; int my_mod_register(const char *name, int order, struct moduledata *mod, void *init, void *uninit); /* define some macro for ip_dummynet */ struct malloc_type { }; #define MALLOC_DEFINE(type, shortdesc, longdesc) \ struct malloc_type type[1]; void *md_dummy_ ## type = type #define CTASSERT(x) /* log... does not use the first argument */ #define LOG_ERR 0x100 #define LOG_INFO 0x200 #define log(_level, fmt, arg...) do { \ int _qwerty=_level;(void)_qwerty; printk(KERN_ERR fmt, ##arg); } while (0) /* * gettimeofday would be in sys/time.h but it is not * visible if _KERNEL is defined */ int gettimeofday(struct timeval *, struct timezone *); #else /* _WIN32 */ #define MALLOC_DEFINE(a,b,c) #endif /* _WIN32 */ extern int hz; extern long tick; /* exists in 2.4 but not in 2.6 */ extern int bootverbose; extern struct timeval boottime; /* The time_uptime a FreeBSD variable increased each second */ #ifdef __linux__ #if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,37) /* revise boundaries */ #define time_uptime get_seconds() #else /* OpenWRT */ #define time_uptime CURRENT_TIME #endif #else /* WIN32 */ #define time_uptime time_uptime_w32() #endif extern int max_linkhdr; extern int ip_defttl; extern u_long in_ifaddrhmask; /* mask for hash table */ extern struct in_ifaddrhashhead *in_ifaddrhashtbl; /* inet addr hash table */ /*-------------------------------------------------*/ /* define, includes and functions missing in linux */ /* include and define */ #include /* inet_ntoa */ struct mbuf; /* used by ip_dummynet.c */ void reinject_drop(struct mbuf* m); #include /* error define */ #include /* IFNAMESIZ */ void rn_init(int); /* * some network structure can be defined in the bsd way * by using the _FAVOR_BSD definition. This is not true * for icmp structure. * XXX struct icmp contains bsd names in * /usr/include/netinet/ip_icmp.h */ #ifdef __linux__ #define icmp_code code #define icmp_type type /* linux in6_addr has no member __u6_addr * replace the whole structure ? */ #define __u6_addr in6_u #define __u6_addr32 u6_addr32 #endif /* __linux__ */ /* defined in linux/sctp.h with no bsd definition */ struct sctphdr { uint16_t src_port; /* source port */ uint16_t dest_port; /* destination port */ uint32_t v_tag; /* verification tag of packet */ uint32_t checksum; /* Adler32 C-Sum */ /* chunks follow... */ }; /* missing definition */ #define TH_FIN 0x01 #define TH_SYN 0x02 #define TH_RST 0x04 #define TH_ACK 0x10 #define RTF_CLONING 0x100 /* generate new routes on use */ #define IPPROTO_OSPFIGP 89 /* OSPFIGP */ #define IPPROTO_CARP 112 /* CARP */ #ifndef _WIN32 #define IPPROTO_IPV4 IPPROTO_IPIP /* for compatibility */ #endif #define CARP_VERSION 2 #define CARP_ADVERTISEMENT 0x01 #define PRIV_NETINET_IPFW 491 /* Administer IPFW firewall. */ #define IP_FORWARDING 0x1 /* most of ip header exists */ #define NETISR_IP 2 /* same as AF_INET */ #define PRIV_NETINET_DUMMYNET 494 /* Administer DUMMYNET. */ extern int securelevel; struct carp_header { #if BYTE_ORDER == LITTLE_ENDIAN u_int8_t carp_type:4, carp_version:4; #endif #if BYTE_ORDER == BIG_ENDIAN u_int8_t carp_version:4, carp_type:4; #endif }; struct pim { int dummy; /* windows compiler does not like empty definition */ }; #ifndef _WIN32 struct route { struct rtentry *ro_rt; struct sockaddr ro_dst; }; #endif struct ifaltq { void *ifq_head; }; /* * ifnet->if_snd is used in ip_dummynet.c to take the transmission * clock. */ #if defined( __linux__) #define if_xname name #define if_snd XXX /* search local the ip addresses, used for the "me" keyword */ #include #define INADDR_TO_IFP(ip, b) \ b = ip_dev_find((struct net *)&init_net, ip.s_addr) #elif defined( _WIN32 ) /* used in ip_dummynet.c */ struct ifnet { char if_xname[IFNAMSIZ]; /* external name (name + unit) */ // struct ifaltq if_snd; /* output queue (includes altq) */ }; struct net_device { char if_xname[IFNAMSIZ]; /* external name (name + unit) */ }; #endif /* involves mbufs */ int in_cksum(struct mbuf *m, int len); #define divert_cookie(mtag) 0 #define divert_info(mtag) 0 #define pf_find_mtag(a) NULL #define pf_get_mtag(a) NULL #ifndef _WIN32 #define AF_LINK AF_ASH /* ? our sys/socket.h */ #endif /* we don't pullup, either success or free and fail */ #define m_pullup(m, x) \ ((m)->m_len >= x ? (m) : (FREE_PKT(m), NULL)) struct pf_mtag { void *hdr; /* saved hdr pos in mbuf, for ECN */ sa_family_t af; /* for ECN */ u_int32_t qid; /* queue id */ }; #if 0 // ndef radix /* radix stuff in radix.h and radix.c */ struct radix_node { caddr_t rn_key; /* object of search */ caddr_t rn_mask; /* netmask, if present */ }; #endif /* !radix */ /* missing kernel functions */ char *inet_ntoa(struct in_addr ina); int random(void); /* * Return the risult of a/b * * this is used in linux kernel space, * since the 64bit division needs to * be done using a macro */ int64_t div64(int64_t a, int64_t b); char * inet_ntoa_r(struct in_addr ina, char *buf); /* from bsd sys/queue.h */ #define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ for ((var) = TAILQ_FIRST((head)); \ (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ (var) = (tvar)) #define SLIST_FOREACH_SAFE(var, head, field, tvar) \ for ((var) = SLIST_FIRST((head)); \ (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ (var) = (tvar)) /* depending of linux version */ #ifndef ETHERTYPE_IPV6 #define ETHERTYPE_IPV6 0x86dd /* IP protocol version 6 */ #endif /*-------------------------------------------------*/ #define RT_NUMFIBS 1 extern u_int rt_numfibs; /* involves kernel locking function */ #ifdef RTFREE #undef RTFREE #define RTFREE(a) fprintf(stderr, "RTFREE: commented out locks\n"); #endif void getmicrouptime(struct timeval *tv); /* from sys/netinet/ip_output.c */ struct ip_moptions; struct route; struct ip; struct mbuf *ip_reass(struct mbuf *); u_short in_cksum_hdr(struct ip *); int ip_output(struct mbuf *m, struct mbuf *opt, struct route *ro, int flags, struct ip_moptions *imo, struct inpcb *inp); /* from net/netisr.c */ void netisr_dispatch(int num, struct mbuf *m); /* definition moved in missing.c */ int sooptcopyout(struct sockopt *sopt, const void *buf, size_t len); int sooptcopyin(struct sockopt *sopt, void *buf, size_t len, size_t minlen); /* defined in session.c */ int priv_check(struct thread *td, int priv); /* struct ucred is in linux/socket.h and has pid, uid, gid. * We need a 'bsd_ucred' to store also the extra info */ struct bsd_ucred { uid_t uid; gid_t gid; uint32_t xid; uint32_t nid; }; int cred_check(void *insn, int proto, struct ifnet *oif, struct in_addr dst_ip, u_int16_t dst_port, struct in_addr src_ip, u_int16_t src_port, struct bsd_ucred *u, int *ugid_lookupp, struct sk_buff *skb); int securelevel_ge(struct ucred *cr, int level); struct sysctl_oid; struct sysctl_req; #ifdef _WIN32 #define module_param_named(_name, _var, _ty, _perm) #else /* !_WIN32 */ /* Linux 2.4 is mostly for openwrt */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) #include /* generic_ffs() used in ip_fw2.c */ typedef uint32_t __be32; typedef uint16_t __be16; struct sock; struct net; struct inet_hashinfo; struct sock *inet_lookup( struct inet_hashinfo *hashinfo, const __be32 saddr, const __be16 sport, const __be32 daddr, const __be16 dport, const int dif); struct sock *tcp_v4_lookup(u32 saddr, u16 sport, u32 daddr, u16 dport, int dif); #endif /* Linux < 2.6 */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17) && \ LINUX_VERSION_CODE > KERNEL_VERSION(2,6,16) /* XXX NOT sure, in 2.6.9 give an error */ #define module_param_named(_name, _var, _ty, _perm) \ //module_param(_name, _ty, 0644) #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) typedef unsigned long uintptr_t; #ifdef __i386__ static inline unsigned long __fls(unsigned long word) { asm("bsr %1,%0" : "=r" (word) : "rm" (word)); return word; } #endif #endif /* LINUX < 2.6.25 */ #endif /* !_WIN32 so maybe __linux__ */ #if defined (__linux__) && !defined (EMULATE_SYSCTL) #define SYSCTL_DECL(_1) #define SYSCTL_OID(_1, _2, _3, _4, _5, _6, _7, _8) #define SYSCTL_NODE(_1, _2, _3, _4, _5, _6) #define _SYSCTL_BASE(_name, _var, _ty, _perm) \ module_param_named(_name, *(_var), _ty, \ ( (_perm) == CTLFLAG_RD) ? 0444: 0644 ) #define SYSCTL_PROC(_base, _oid, _name, _mode, _var, _val, _desc, _a, _b) #define SYSCTL_INT(_base, _oid, _name, _mode, _var, _val, _desc) \ _SYSCTL_BASE(_name, _var, int, _mode) #define SYSCTL_LONG(_base, _oid, _name, _mode, _var, _val, _desc) \ _SYSCTL_BASE(_name, _var, long, _mode) #define SYSCTL_ULONG(_base, _oid, _name, _mode, _var, _val, _desc) \ _SYSCTL_BASE(_name, _var, ulong, _mode) #define SYSCTL_UINT(_base, _oid, _name, _mode, _var, _val, _desc) \ _SYSCTL_BASE(_name, _var, uint, _mode) #define TUNABLE_INT(_name, _ptr) #define SYSCTL_VNET_PROC SYSCTL_PROC #define SYSCTL_VNET_INT SYSCTL_INT #define SYSCTL_VNET_UINT SYSCTL_UINT #endif #define SYSCTL_HANDLER_ARGS \ struct sysctl_oid *oidp, void *arg1, int arg2, struct sysctl_req *req int sysctl_handle_int(SYSCTL_HANDLER_ARGS); int sysctl_handle_long(SYSCTL_HANDLER_ARGS); void ether_demux(struct ifnet *ifp, struct mbuf *m); int ether_output_frame(struct ifnet *ifp, struct mbuf *m); void in_rtalloc_ign(struct route *ro, u_long ignflags, u_int fibnum); void icmp_error(struct mbuf *n, int type, int code, uint32_t dest, int mtu); void rtfree(struct rtentry *rt); u_short in_cksum_skip(struct mbuf *m, int len, int skip); #ifdef INP_LOCK_ASSERT #undef INP_LOCK_ASSERT #define INP_LOCK_ASSERT(a) #endif int jailed(struct ucred *cred); /* * Return 1 if an internet address is for a ``local'' host * (one to which we have a connection). If subnetsarelocal * is true, this includes other subnets of the local net. * Otherwise, it includes only the directly-connected (sub)nets. */ int in_localaddr(struct in_addr in); /* the prototype is already in the headers */ //int ipfw_chg_hook(SYSCTL_HANDLER_ARGS); int fnmatch(const char *pattern, const char *string, int flags); int linux_lookup(const int proto, const __be32 saddr, const __be16 sport, const __be32 daddr, const __be16 dport, struct sk_buff *skb, int dir, struct bsd_ucred *u); /* vnet wrappers, in vnet.h and ip_var.h */ //int ipfw_init(void); //void ipfw_destroy(void); #define MTAG_IPFW 1148380143 /* IPFW-tagged cookie */ #define MTAG_IPFW_RULE 1262273568 /* rule reference */ struct ip_fw_args; extern int (*ip_dn_io_ptr)(struct mbuf **m, int dir, struct ip_fw_args *fwa); #define curvnet NULL #define CURVNET_SET(_v) #define CURVNET_RESTORE() #define VNET_ASSERT(condition) #define VNET_NAME(n) n #define VNET_DECLARE(t, n) extern t n #define VNET_DEFINE(t, n) t n #define _VNET_PTR(b, n) &VNET_NAME(n) /* * Virtualized global variable accessor macros. */ #define VNET_VNET_PTR(vnet, n) (&(n)) #define VNET_VNET(vnet, n) (n) #define VNET_PTR(n) (&(n)) #define VNET(n) (n) VNET_DECLARE(int, ip_defttl); #define V_ip_defttl VNET(ip_defttl); int ipfw_check_hook(void *arg, struct mbuf **m0, struct ifnet *ifp, int dir, struct inpcb *inp); /* hooks for divert */ extern void (*ip_divert_ptr)(struct mbuf *m, int incoming); extern int (*ip_dn_ctl_ptr)(struct sockopt *); typedef int ip_fw_ctl_t(struct sockopt *); extern ip_fw_ctl_t *ip_fw_ctl_ptr; /* netgraph prototypes */ typedef int ng_ipfw_input_t(struct mbuf **, int, struct ip_fw_args *, int); extern ng_ipfw_input_t *ng_ipfw_input_p; /* For kernel ipfw_ether and ipfw_bridge. */ struct ip_fw_args; typedef int ip_fw_chk_t(struct ip_fw_args *args); extern ip_fw_chk_t *ip_fw_chk_ptr; #define V_ip_fw_chk_ptr VNET(ip_fw_chk_ptr) #define V_ip_fw_ctl_ptr VNET(ip_fw_ctl_ptr) #define V_tcbinfo VNET(tcbinfo) #define V_udbinfo VNET(udbinfo) #endif /* !_MISSING_H_ */ ipfw3-2012/kipfw/netipfw_m.inf000644 000423 000000 00000002476 12012015275 016540 0ustar00luigiwheel000000 000000 ; version section [Version] Signature = "$Windows NT$" Class = Net ClassGUID = {4D36E972-E325-11CE-BFC1-08002BE10318} Provider = %Unipi% DriverVer = 08/12/2012,3.0.1.1 ; control flags section ; optional, unused in netipfw.inf inf, used in netipfw_m.inf [ControlFlags] ExcludeFromSelect = unipi_ipfwmp ; destinationdirs section, optional [DestinationDirs] DefaultDestDir=12 ; No files to copy ; manufacturer section [Manufacturer] %Unipi% = UNIPI,NTx86,NTamd64 ; models section [UNIPI] ; Win2k %Desc% = IpfwMP.ndi, unipi_ipfwmp [UNIPI.NTx86] ;For WinXP and later %Desc% = IpfwMP.ndi, unipi_ipfwmp [UNIPI.NTamd64] ;For x64 %Desc% = IpfwMP.ndi, unipi_ipfwmp ; ddinstall section [IpfwMP.ndi] AddReg = IpfwMP.ndi.AddReg Characteristics = 0x29 ;NCF_NOT_USER_REMOVABLE | NCF_VIRTUAL | NCF_HIDDEN ; ddinstall->addreg points here [IpfwMP.ndi.AddReg] HKR, Ndi, Service, 0, IpfwMP ;ddinstall.services section [IpfwMP.ndi.Services] AddService = IpfwMP,0x2, IpfwMP.AddService [IpfwMP.AddService] ServiceType = 1 ;SERVICE_KERNEL_DRIVER StartType = 3 ;SERVICE_DEMAND_START ErrorControl = 1 ;SERVICE_ERROR_NORMAL ServiceBinary = %12%\ipfw.sys AddReg = IpfwMP.AddService.AddReg [IpfwMP.AddService.AddReg] ; None [Strings] Unipi = "Unipi" Desc = "Ipfw Miniport" ipfw3-2012/kipfw/debug.c000644 000423 000000 00000002411 12006744005 015274 0ustar00luigiwheel000000 000000 #include const char* texify_cmd(int i) { if (i==110) return("IP_FW_ADD"); if (i==111) return("IP_FW_DEL"); if (i==112) return("IP_FW_FLUSH"); if (i==113) return("IP_FW_ZERO"); if (i==114) return("IP_FW_GET"); if (i==115) return("IP_FW_RESETLOG"); if (i==116) return("IP_FW_NAT_CFG"); if (i==117) return("IP_FW_NAT_DEL"); if (i==118) return("IP_FW_NAT_GET_CONFIG"); if (i==119) return("IP_FW_NAT_GET_LOG"); if (i==120) return("IP_DUMMYNET_CONFIGURE"); if (i==121) return("IP_DUMMYNET_DEL"); if (i==122) return("IP_DUMMYNET_FLUSH"); if (i==124) return("IP_DUMMYNET_GET"); if (i==108) return("IP_FW3"); if (i==109) return("IP_DUMMYNET3"); return ("BOH"); } const char* texify_proto(unsigned int p) { if (p==1) return("ICMP"); if (p==6) return("TCP"); if (p==17) return("UDP"); return("OTHER"); } void hexdump(unsigned char* addr, int len, const char *msg) { int i; const int cicli = len/8; const int resto = len%8; unsigned char d[8]; DbgPrint("%s at %p len %d\n", msg, addr, len); for (i=0; i<=cicli; i++) { bzero(d, 8); bcopy(addr+i*8, d, i < cicli ? 8 : resto); DbgPrint("%04X %02X %02X %02X %02X %02X %02X %02X %02X\n", i*8, d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7]); } DbgPrint("\n"); } ipfw3-2012/kipfw/ipfw2_mod.c000644 000423 000000 00000064433 12010047557 016113 0ustar00luigiwheel000000 000000 /* * Copyright (C) 2009 Luigi Rizzo, Marta Carbone, Universita` di Pisa * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: ipfw2_mod.c 11648 2012-08-06 23:34:46Z luigi $ * * The main interface to build ipfw+dummynet as a linux module. * (and possibly as a windows module as well, though that part * is not complete yet). * * The control interface uses the sockopt mechanism * on a socket(AF_INET, SOCK_RAW, IPPROTO_RAW). * * The data interface uses the netfilter interface, at the moment * hooked to the PRE_ROUTING and POST_ROUTING hooks. * Unfortunately the netfilter interface is a moving target, * so we need a set of macros to adapt to the various cases. * * In the netfilter hook we just mark packet as 'QUEUE' and then * let the queue handler to do the whole work (filtering and * possibly emulation). * As we receive packets, we wrap them with an mbuf descriptor * so the existing ipfw+dummynet code runs unmodified. */ #include #include /* sizeof struct mbuf */ #include /* NGROUPS */ #ifndef D #define ND(fmt, ...) do {} while (0) #define D1(fmt, ...) do {} while (0) #define D(fmt, ...) printf("%-10s " fmt "\n", \ __FUNCTION__, ## __VA_ARGS__) #endif #ifdef __linux__ #include #include #include #include /* NF_IP_PRI_FILTER */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25) #include /* nf_queue */ #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) #define __read_mostly #endif #endif /* !__linux__ */ #include /* in_addr */ #include /* ip_fw_ctl_t, ip_fw_chk_t */ #include /* ip_fw_ctl_t, ip_fw_chk_t */ #include /* ip_dn_ctl_t, ip_dn_io_t */ #include /* PFIL_IN, PFIL_OUT */ #ifdef __linux__ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13) /* XXX was < 2.6.0: inet_hashtables.h is introduced in 2.6.14 */ // #warning --- inet_hashtables not present on 2.4 #include #include #include static inline int inet_iif(const struct sk_buff *skb) { return ((struct rtable *)skb->dst)->rt_iif; } #else #include /* inet_lookup */ #endif #endif /* __linux__ */ #include /* inet_iif */ /* * Here we allocate some global variables used in the firewall. */ //ip_dn_ctl_t *ip_dn_ctl_ptr; int (*ip_dn_ctl_ptr)(struct sockopt *); ip_fw_ctl_t *ip_fw_ctl_ptr; int (*ip_dn_io_ptr)(struct mbuf **m, int dir, struct ip_fw_args *fwa); ip_fw_chk_t *ip_fw_chk_ptr; void (*bridge_dn_p)(struct mbuf *, struct ifnet *); /* Divert hooks. */ void (*ip_divert_ptr)(struct mbuf *m, int incoming); /* ng_ipfw hooks. */ ng_ipfw_input_t *ng_ipfw_input_p = NULL; /*--- * Glue code to implement the registration of children with the parent. * Each child should call my_mod_register() when linking, so that * module_init() and module_exit() can call init_children() and * fini_children() to provide the necessary initialization. * We use the same mechanism for MODULE_ and SYSINIT_. * The former only get a pointer to the moduledata, * the latter have two function pointers (init/uninit) */ #include struct mod_args { const char *name; int order; struct moduledata *mod; void (*init)(void), (*uninit)(void); }; static unsigned int mod_idx; static struct mod_args mods[10]; /* hard limit to 10 modules */ int my_mod_register(const char *name, int order, struct moduledata *mod, void *init, void *uninit); /* * my_mod_register should be called automatically as the init * functions in the submodules. Unfortunately this compiler/linker * trick is not supported yet so we call it manually. */ int my_mod_register(const char *name, int order, struct moduledata *mod, void *init, void *uninit) { struct mod_args m; m.name = name; m.order = order; m.mod = mod; m.init = init; m.uninit = uninit; printf("%s %s called\n", __FUNCTION__, name); if (mod_idx < sizeof(mods) / sizeof(mods[0])) mods[mod_idx++] = m; return 0; } static void init_children(void) { unsigned int i; /* Call the functions registered at init time. */ printf("%s mod_idx value %d\n", __FUNCTION__, mod_idx); for (i = 0; i < mod_idx; i++) { struct mod_args *m = &mods[i]; printf("+++ start module %d %s %s at %p order 0x%x\n", i, m->name, m->mod ? m->mod->name : "SYSINIT", m->mod, m->order); if (m->mod && m->mod->evhand) m->mod->evhand(NULL, MOD_LOAD, m->mod->priv); else if (m->init) m->init(); } } static void fini_children(void) { int i; /* Call the functions registered at init time. */ for (i = mod_idx - 1; i >= 0; i--) { struct mod_args *m = &mods[i]; printf("+++ end module %d %s %s at %p order 0x%x\n", i, m->name, m->mod ? m->mod->name : "SYSINIT", m->mod, m->order); if (m->mod && m->mod->evhand) m->mod->evhand(NULL, MOD_UNLOAD, m->mod->priv); else if (m->uninit) m->uninit(); } } /*--- end of module binding helper functions ---*/ /*--- * Control hooks: * ipfw_ctl_h() is a wrapper for linux to FreeBSD sockopt call convention. * then call the ipfw handler in order to manage requests. * In turn this is called by the linux set/get handlers. */ static int ipfw_ctl_h(struct sockopt *s, int cmd, int dir, int len, void __user *user) { struct thread t; int ret = EINVAL; memset(s, 0, sizeof(s)); s->sopt_name = cmd; s->sopt_dir = dir; s->sopt_valsize = len; s->sopt_val = user; /* sopt_td is not used but it is referenced */ memset(&t, 0, sizeof(t)); s->sopt_td = &t; //printf("%s called with cmd %d len %d sopt %p user %p\n", __FUNCTION__, cmd, len, s, user); if (ip_fw_ctl_ptr && cmd != IP_DUMMYNET3 && (cmd == IP_FW3 || cmd < IP_DUMMYNET_CONFIGURE)) ret = ip_fw_ctl_ptr(s); else if (ip_dn_ctl_ptr && (cmd == IP_DUMMYNET3 || cmd >= IP_DUMMYNET_CONFIGURE)) ret = ip_dn_ctl_ptr(s); return -ret; /* errors are < 0 on linux */ } #ifdef linux /* * Convert an mbuf into an skbuff * At the moment this only works for ip packets fully contained * in a single mbuf. We assume that on entry ip_len and ip_off are * in host format, and the ip checksum is not computed. */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) /* check boundary */ int dst_output(struct skbuff *s) { return 0; } struct sk_buff * mbuf2skbuff(struct mbuf* m) { return NULL; } #else struct sk_buff * mbuf2skbuff(struct mbuf* m) { struct sk_buff *skb; size_t len = m->m_pkthdr.len; /* used to lookup the routing table */ struct rtable *r; struct flowi fl; int ret = 0; /* success for ip_route_output_key() */ struct ip *ip = mtod(m, struct ip *); /* XXX ip_output has ip_len and ip_off in network format, * linux expects host format */ ip->ip_len = ntohs(ip->ip_len); ip->ip_off = ntohs(ip->ip_off); ip->ip_sum = 0; ip->ip_sum = in_cksum(m, ip->ip_hl<<2); /* fill flowi struct, we need just the dst addr, see XXX */ bzero(&fl, sizeof(fl)); flow_daddr.daddr = ip->ip_dst.s_addr; /* * ip_route_output_key() should increment * r->u.dst.__use and call a dst_hold(dst) * XXX verify how we release the resources. */ #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,38) /* check boundary */ r = ip_route_output_key(&init_net, &fl.u.ip4); #elif LINUX_VERSION_CODE > KERNEL_VERSION(2,6,26) /* check boundary */ ret = ip_route_output_key(&init_net, &r, &fl); #else ret = ip_route_output_key(&r, &fl); #endif if (ret != 0 || r == NULL ) { printf("NO ROUTE FOUND\n"); return NULL; } /* allocate the skbuff and the data */ skb = alloc_skb(len + sizeof(struct ethhdr), GFP_ATOMIC); if (skb == NULL) { printf("%s: can not allocate SKB buffers.\n", __FUNCTION__); return NULL; } skb->protocol = htons(ETH_P_IP); // XXX 8 or 16 bit ? /* sk_dst_set XXX take the lock (?) */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) skb_dst_set(skb, &r->u.dst); #else skb_dst_set(skb, &r->dst); #endif skb->dev = skb_dst(skb)->dev; /* reserve space for ethernet header */ skb_reserve(skb, sizeof(struct ethhdr)); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) skb_reset_network_header(skb); // skb->network_header = skb->data - skb->head #else skb->nh.raw = skb->data; #endif /* set skbuff tail pointers and copy content */ skb_put(skb, len); memcpy(skb->data, m->m_data, len); return skb; } #endif /* linux 2.6+ */ #endif /* linux */ /* * This function is called to reinject packets to the * kernel stack within the linux netfilter system * or to send a new created mbuf. * In the first case we have a valid sk_buff pointer * encapsulated within the fake mbuf, so we can call * the reinject function trough netisr_dispatch. * In the last case we need to build a sk_buff from scratch, * before sending out the packet. */ int ip_output(struct mbuf *m, struct mbuf *opt, struct route *ro, int flags, struct ip_moptions *imo, struct inpcb *inp) { (void)opt; (void)ro; (void)flags; (void)imo; (void)inp; /* UNUSED */ if ( m->m_skb != NULL ) { /* reinjected packet, just call dispatch */ ND("sending... "); netisr_dispatch(0, m); } else { /* self-generated packet, wrap as appropriate and send */ #ifdef __linux__ struct sk_buff *skb = mbuf2skbuff(m); if (skb != NULL) dst_output(skb); #else /* Windows */ D("unimplemented."); #endif FREE_PKT(m); } return 0; } /* * setsockopt hook has no return value other than the error code. */ int do_ipfw_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len) { struct sockopt s; /* pass arguments */ (void)sk; /* UNUSED */ return ipfw_ctl_h(&s, cmd, SOPT_SET, len, user); } /* * getsockopt can can return a block of data in response. */ int do_ipfw_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) { struct sockopt s; /* pass arguments */ int ret = ipfw_ctl_h(&s, cmd, SOPT_GET, *len, user); (void)sk; /* UNUSED */ *len = s.sopt_valsize; /* return length back to the caller */ return ret; } #ifdef __linux__ /* * declare our [get|set]sockopt hooks */ static struct nf_sockopt_ops ipfw_sockopts = { .pf = PF_INET, .set_optmin = _IPFW_SOCKOPT_BASE, .set_optmax = _IPFW_SOCKOPT_END, .set = do_ipfw_set_ctl, .get_optmin = _IPFW_SOCKOPT_BASE, .get_optmax = _IPFW_SOCKOPT_END, .get = do_ipfw_get_ctl, #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) .owner = THIS_MODULE, #endif }; /*---- * We need a number of macros to adapt to the various APIs in * different linux versions. Among them: * * - the hook names change between macros (NF_IP*) and enum NF_INET_* * * - the second argument to the netfilter hook is * struct sk_buff ** in kernels <= 2.6.22 * struct sk_buff * in kernels > 2.6.22 * * - NF_STOP is not defined before 2.6 so we remap it to NF_ACCEPT * * - the packet descriptor passed to the queue handler is * struct nf_info in kernels <= 2.6.24 * struct nf_queue_entry in kernels <= 2.6.24 * * - the arguments to the queue handler also change; */ /* * declare hook to grab packets from the netfilter interface. * The NF_* names change in different versions of linux, in some * cases they are #defines, in others they are enum, so we * need to adapt. */ #ifndef NF_IP_PRE_ROUTING #define NF_IP_PRE_ROUTING NF_INET_PRE_ROUTING #endif #ifndef NF_IP_POST_ROUTING #define NF_IP_POST_ROUTING NF_INET_POST_ROUTING #endif /* * ipfw hooks into the POST_ROUTING and the PRE_ROUTING chains. * PlanetLab sets skb_tag to the slice id in the LOCAL_INPUT and * POST_ROUTING chains, so if we want to use that information we * need to hook the LOCAL_INPUT chain instead of the PRE_ROUTING. * However at the moment the skb_tag info is not reliable so * we stay with the standard hooks. */ #if 0 // defined(IPFW_PLANETLAB) #define IPFW_HOOK_IN NF_IP_LOCAL_IN #else #define IPFW_HOOK_IN NF_IP_PRE_ROUTING #endif /* * The main netfilter hook. * To make life simple, we queue everything and then do all the * decision in the queue handler. * * XXX note that in 2.4 and up to 2.6.22 the skbuf is passed as sk_buff** * so we have an #ifdef to set the proper argument type. */ static unsigned int call_ipfw(unsigned int hooknum, #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23) // in 2.6.22 we have ** struct sk_buff **skb, #else struct sk_buff *skb, #endif const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { (void)hooknum; (void)skb; (void)in; (void)out; (void)okfn; /* UNUSED */ return NF_QUEUE; } #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12) /* XXX was 2.6.0 */ #define NF_STOP NF_ACCEPT #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) /* * nf_queue_entry is a recent addition, in previous versions * of the code the struct is called nf_info. */ #define nf_queue_entry nf_info /* for simplicity */ /* also, 2.4 and perhaps something else have different arguments */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) /* XXX unsure */ /* on 2.4 we use nf_info */ #define QH_ARGS struct sk_buff *skb, struct nf_info *info, void *data #else /* 2.6.14. 2.6.24 */ #define QH_ARGS struct sk_buff *skb, struct nf_info *info, unsigned int qnum, void *data #endif #define DEFINE_SKB /* nothing, already an argument */ #define REINJECT(_inf, _verd) nf_reinject(skb, _inf, _verd) #else /* 2.6.25 and above */ #define QH_ARGS struct nf_queue_entry *info, unsigned int queuenum #define DEFINE_SKB struct sk_buff *skb = info->skb; #define REINJECT(_inf, _verd) nf_reinject(_inf, _verd) #endif /* * used by dummynet when dropping packets * XXX use dummynet_send() */ void reinject_drop(struct mbuf* m) { #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) /* unsure on the exact boundary */ struct sk_buff *skb = (struct sk_buff *)m; #endif REINJECT(m->queue_entry, NF_DROP); } /* * The real call to the firewall. nf_queue_entry points to the skbuf, * and eventually we need to return both through nf_reinject(). */ static int ipfw2_queue_handler(QH_ARGS) { DEFINE_SKB /* no semicolon here, goes in the macro */ int ret = 0; /* return value */ struct mbuf *m; #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) if (skb->nh.iph == NULL) { printf("null dp, len %d reinject now\n", skb->len); REINJECT(info, NF_ACCEPT); return 0; } #endif m = malloc(sizeof(*m), 0, 0); if (m == NULL) { printf("malloc fail, len %d reinject now\n", skb->len); REINJECT(info, NF_ACCEPT); return 0; } m->m_skb = skb; m->m_len = skb->len; /* len from ip header to end */ m->m_pkthdr.len = skb->len; /* total packet len */ m->m_pkthdr.rcvif = info->indev; m->queue_entry = info; #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22) /* XXX was 2.6.0 */ m->m_data = (char *)skb->nh.iph; #else m->m_data = (char *)skb_network_header(skb); // XXX unsigned ? */ #endif /* XXX add the interface */ if (info->hook == IPFW_HOOK_IN) { ret = ipfw_check_hook(NULL, &m, info->indev, PFIL_IN, NULL); } else { ret = ipfw_check_hook(NULL, &m, info->outdev, PFIL_OUT, NULL); } if (m != NULL) { /* Accept. reinject and free the mbuf */ REINJECT(info, NF_ACCEPT); m_freem(m); } else if (ret == 0) { /* dummynet has kept the packet, will reinject later. */ } else { /* * Packet dropped by ipfw or dummynet. Nothing to do as * FREE_PKT already did a reinject as NF_DROP */ } return 0; } struct route; struct ip_moptions; struct inpcb; /* XXX should include prototypes for netisr_dispatch and ip_output */ /* * The reinjection routine after a packet comes out from dummynet. * We must update the skb timestamp so ping reports the right time. * This routine is also used (with num == -1) as FREE_PKT. XXX */ void netisr_dispatch(int num, struct mbuf *m) { struct nf_queue_entry *info = m->queue_entry; struct sk_buff *skb = m->m_skb; /* always used */ /* * This function can be called by the FREE_PKT() * used when ipfw generate their own mbuf packets * or by the mbuf2skbuff() function. */ m_freem(m); /* XXX check * info is null in the case of a real mbuf * (one created by the ipfw code without a * valid sk_buff pointer */ if (info == NULL) return; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) // XXX above 2.6.x ? __net_timestamp(skb); /* update timestamp */ #endif /* XXX to obey one-pass, possibly call the queue handler here */ REINJECT(info, ((num == -1)?NF_DROP:NF_STOP)); /* accept but no more firewall */ } /* * socket lookup function for linux. * This code is used to associate uid, gid, jail/xid to packets, * and store the info in a cache *ugp where they can be accessed quickly. * The function returns 1 if the info is found, -1 otherwise. * * We do this only on selected protocols: TCP, ... * * The chain is the following * sk_buff* sock* socket* file* * skb -> sk ->sk_socket->file ->f_owner ->pid * skb -> sk ->sk_socket->file ->f_uid (direct) * skb -> sk ->sk_socket->file ->f_cred->fsuid (2.6.29+) * * Related headers: * linux/skbuff.h struct skbuff * net/sock.h struct sock * linux/net.h struct socket * linux/fs.h struct file * * With vserver we may have sk->sk_xid and sk->sk_nid that * which we store in fw_groups[1] (matches O_JAIL) and fw_groups[2] * (no matches yet) * * Note- for locally generated, outgoing packets we should not need * need a lookup because the sk_buff already points to the socket where * the info is. */ extern struct inet_hashinfo tcp_hashinfo; int linux_lookup(const int proto, const __be32 saddr, const __be16 sport, const __be32 daddr, const __be16 dport, struct sk_buff *skb, int dir, struct bsd_ucred *u) { #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13) /* XXX was 2.6.0 */ return -1; #else struct sock *sk; int ret = -1; /* default return value */ int st = -1; /* state */ if (proto != IPPROTO_TCP) /* XXX extend for UDP */ return -1; if ((dir ? (void *)skb_dst(skb) : (void *)skb->dev) == NULL) { panic(" -- this should not happen\n"); return -1; } if (skb->sk) { sk = skb->sk; } else { /* * Try a lookup. On a match, sk has a refcount that we must * release on exit (we know it because skb->sk = NULL). * * inet_lookup above 2.6.24 has an additional 'net' parameter * so we use a macro to conditionally supply it. * swap dst and src depending on the direction. */ #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,24) #define _OPT_NET_ARG #else #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) /* there is no dev_net() on 2.6.25 */ #define _OPT_NET_ARG (skb->dev->nd_net), #else /* 2.6.26 and above */ #define _OPT_NET_ARG dev_net(skb->dev), #endif #endif sk = (dir) ? /* dir != 0 on output */ inet_lookup(_OPT_NET_ARG &tcp_hashinfo, daddr, dport, saddr, sport, // match outgoing inet_iif(skb)) : inet_lookup(_OPT_NET_ARG &tcp_hashinfo, saddr, sport, daddr, dport, // match incoming skb->dev->ifindex); #undef _OPT_NET_ARG if (sk == NULL) /* no match, nothing to be done */ return -1; } ret = 1; /* retrying won't make things better */ st = sk->sk_state; #ifdef CONFIG_VSERVER u->xid = sk->sk_xid; u->nid = sk->sk_nid; #else u->xid = u->nid = 0; #endif /* * Exclude tcp states where sk points to a inet_timewait_sock which * has no sk_socket field (surely TCP_TIME_WAIT, perhaps more). * To be safe, use a whitelist and not a blacklist. * Before dereferencing sk_socket grab a lock on sk_callback_lock. * * Once again we need conditional code because the UID and GID * location changes between kernels. */ #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,28) /* use the current's real uid/gid */ #define _CURR_UID f_uid #define _CURR_GID f_gid #else /* 2.6.29 and above */ /* use the current's file access real uid/gid */ #define _CURR_UID f_cred->fsuid #define _CURR_GID f_cred->fsgid #endif #define GOOD_STATES ( \ (1<sk_callback_lock); if (sk->sk_socket && sk->sk_socket->file) { u->uid = sk->sk_socket->file->_CURR_UID; u->gid = sk->sk_socket->file->_CURR_GID; } read_unlock_bh(&sk->sk_callback_lock); } else { u->uid = u->gid = 0; } if (!skb->sk) /* return the reference that came from the lookup */ sock_put(sk); #undef GOOD_STATES #undef _CURR_UID #undef _CURR_GID return ret; #endif /* LINUX > 2.4 */ } /* * Now prepare to hook the various functions. * Linux 2.4 has a different API so we need some adaptation * for register and unregister hooks * * the unregister function changed arguments between 2.6.22 and 2.6.24 */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14) struct nf_queue_handler ipfw2_queue_handler_desc = { .outfn = ipfw2_queue_handler, .name = "ipfw2 dummynet queue", }; #define REG_QH_ARG(fn) &(fn ## _desc) #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17) /* XXX was 2.6.0 */ static int nf_register_hooks(struct nf_hook_ops *ops, int n) { int i, ret = 0; for (i = 0; i < n; i++) { ret = nf_register_hook(ops + i); if (ret < 0) break; } return ret; } static void nf_unregister_hooks(struct nf_hook_ops *ops, int n) { int i; for (i = 0; i < n; i++) { nf_unregister_hook(ops + i); } } #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) /* XXX was 2.6.0 */ #define REG_QH_ARG(fn) fn, NULL /* argument for nf_[un]register_queue_handler */ #endif #define UNREG_QH_ARG(fn) //fn /* argument for nf_[un]register_queue_handler */ #define SET_MOD_OWNER #else /* linux > 2.6.17 */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) #define UNREG_QH_ARG(fn) //fn /* argument for nf_[un]register_queue_handler */ #else #define UNREG_QH_ARG(fn) , &(fn ## _desc) #endif /* 2.6.0 < LINUX > 2.6.24 */ #define SET_MOD_OWNER .owner = THIS_MODULE, #endif /* !LINUX < 2.6.0 */ static struct nf_hook_ops ipfw_ops[] __read_mostly = { { .hook = call_ipfw, .pf = PF_INET, .hooknum = IPFW_HOOK_IN, .priority = NF_IP_PRI_FILTER, SET_MOD_OWNER }, { .hook = call_ipfw, .pf = PF_INET, .hooknum = NF_IP_POST_ROUTING, .priority = NF_IP_PRI_FILTER, SET_MOD_OWNER }, }; #endif /* __linux__ */ /* descriptors for the children, until i find a way for the * linker to produce them */ extern moduledata_t *moddesc_ipfw; extern moduledata_t *moddesc_dummynet; extern moduledata_t *moddesc_dn_fifo; extern moduledata_t *moddesc_dn_wf2qp; extern moduledata_t *moddesc_dn_rr; extern moduledata_t *moddesc_dn_qfq; extern moduledata_t *moddesc_dn_prio; extern void *sysinit_ipfw_init; extern void *sysuninit_ipfw_destroy; extern void *sysinit_vnet_ipfw_init; extern void *sysuninit_vnet_ipfw_uninit; /* * Module glue - init and exit function. */ int __init ipfw_module_init(void) { int ret = 0; #ifdef _WIN32 unsigned long resolution; #endif rn_init(64); my_mod_register("ipfw", 1, moddesc_ipfw, NULL, NULL); my_mod_register("sy_ipfw", 2, NULL, sysinit_ipfw_init, sysuninit_ipfw_destroy); my_mod_register("sy_Vnet_ipfw", 3, NULL, sysinit_vnet_ipfw_init, sysuninit_vnet_ipfw_uninit); my_mod_register("dummynet", 4, moddesc_dummynet, NULL, NULL); my_mod_register("dn_fifo", 5, moddesc_dn_fifo, NULL, NULL); my_mod_register("dn_wf2qp", 6, moddesc_dn_wf2qp, NULL, NULL); my_mod_register("dn_rr", 7, moddesc_dn_rr, NULL, NULL); my_mod_register("dn_qfq", 8, moddesc_dn_qfq, NULL, NULL); my_mod_register("dn_prio", 9, moddesc_dn_prio, NULL, NULL); init_children(); #ifdef _WIN32 resolution = ExSetTimerResolution(1, TRUE); printf("*** ExSetTimerResolution: resolution set to %d n-sec ***\n",resolution); #endif #ifdef EMULATE_SYSCTL keinit_GST(); #endif #ifdef __linux__ /* sockopt register, in order to talk with user space */ ret = nf_register_sockopt(&ipfw_sockopts); if (ret < 0) { printf("error %d in nf_register_sockopt\n", ret); goto clean_modules; } /* queue handler registration, in order to get network * packet under a private queue */ ret = nf_register_queue_handler(PF_INET, REG_QH_ARG(ipfw2_queue_handler) ); if (ret < 0) /* queue busy */ goto unregister_sockopt; ret = nf_register_hooks(ipfw_ops, ARRAY_SIZE(ipfw_ops)); if (ret < 0) goto unregister_sockopt; printf("%s loaded\n", __FUNCTION__); return 0; /* handle errors on load */ unregister_sockopt: nf_unregister_queue_handler(PF_INET UNREG_QH_ARG(ipfw2_queue_handler) ); nf_unregister_sockopt(&ipfw_sockopts); clean_modules: fini_children(); printf("%s error\n", __FUNCTION__); #endif /* __linux__ */ return ret; } /* module shutdown */ void __exit ipfw_module_exit(void) { #ifdef EMULATE_SYSCTL keexit_GST(); #endif #ifdef _WIN32 ExSetTimerResolution(0,FALSE); #else /* linux hook */ nf_unregister_hooks(ipfw_ops, ARRAY_SIZE(ipfw_ops)); /* maybe drain the queue before unregistering ? */ nf_unregister_queue_handler(PF_INET UNREG_QH_ARG(ipfw2_queue_handler) ); nf_unregister_sockopt(&ipfw_sockopts); #endif /* __linux__ */ fini_children(); printf("%s unloaded\n", __FUNCTION__); } #ifdef __linux__ module_init(ipfw_module_init) module_exit(ipfw_module_exit) MODULE_LICENSE("Dual BSD/GPL"); /* the code here is all BSD. */ #endif ipfw3-2012/kipfw/netipfw.inf000644 000423 000000 00000004334 12012015236 016214 0ustar00luigiwheel000000 000000 ; version section [Version] Signature = "$Windows NT$" Class = NetService ClassGUID = {4D36E974-E325-11CE-BFC1-08002BE10318} Provider = %Unipi% DriverVer = 08/12/2012,3.0.1.1 ; manufacturer section [Manufacturer] %Unipi% = UNIPI,NTx86,NTamd64 ; control flags section ; optional, unused in netipfw.inf inf, used in netipfw_m.inf [ControlFlags] ; models section [UNIPI] ; Win2k %Desc% = Ipfw.ndi, unipi_ipfw [UNIPI.NTx86] ;For WinXP and later %Desc% = Ipfw.ndi, unipi_ipfw [UNIPI.NTamd64] ;For x64 %Desc% = Ipfw.ndi, unipi_ipfw ; ddinstall section [Ipfw.ndi] AddReg = Ipfw.ndi.AddReg, Ipfw.AddReg Characteristics = 0x4410 ; NCF_FILTER | NCF_NDIS_PROTOCOL !--Filter Specific--!! CopyFiles = Ipfw.Files.Sys CopyInf = netipfw_m.inf ; remove section [Ipfw.ndi.Remove] DelFiles = Ipfw.Files.Sys ;ddinstall.services section [Ipfw.ndi.Services] AddService = Ipfw,,Ipfw.AddService [Ipfw.AddService] DisplayName = %ServiceDesc% ServiceType = 1 ;SERVICE_KERNEL_DRIVER StartType = 3 ;SERVICE_DEMAND_START ErrorControl = 1 ;SERVICE_ERROR_NORMAL ServiceBinary = %12%\ipfw.sys AddReg = Ipfw.AddService.AddReg [Ipfw.AddService.AddReg] ;file copy related sections [SourceDisksNames] 1=%DiskDescription%,"",, [SourceDisksFiles] ipfw.sys=1 [DestinationDirs] DefaultDestDir = 12 Ipfw.Files.Sys = 12 ; %windir%\System32\drivers ; ddinstall->copyfiles points here [Ipfw.Files.Sys] ipfw.sys,,,2 ; ddinstall->addreg points here [Ipfw.ndi.AddReg] HKR, Ndi, HelpText, , %HELP% ; this is displayed at the bottom of the General page of the Connection Properties dialog box HKR, Ndi, FilterClass, , failover HKR, Ndi, FilterDeviceInfId, , unipi_ipfwmp HKR, Ndi, Service, , Ipfw HKR, Ndi\Interfaces, UpperRange, , noupper HKR, Ndi\Interfaces, LowerRange, , nolower HKR, Ndi\Interfaces, FilterMediaTypes, , "ethernet, tokenring, fddi, wan" ;strings section [Strings] Unipi = "Unipi" DiskDescription = "Ipfw Driver Disk" Desc = "ipfw+dummynet" HELP = "This is ipfw and dummynet network emulator, developed by unipi.it" ServiceDesc = "ipfw service" ipfw3-2012/kipfw/win-passthru.diff000644 000423 000000 00000022646 12006744005 017354 0ustar00luigiwheel000000 000000 diff -ubwrp original_passthru/miniport.c kipfw/miniport.c --- original_passthru/miniport.c 2012-08-01 14:34:15.096679600 +0200 +++ kipfw/miniport.c 2012-08-01 14:34:11.377929600 +0200 @@ -223,6 +223,7 @@ Return Value: // // Use NDIS 5.1 packet stacking: // + if (0) // XXX IPFW - make sure we don't go in here { PNDIS_PACKET_STACK pStack; BOOLEAN Remaining; @@ -347,6 +348,25 @@ Return Value: MediaSpecificInfo, MediaSpecificInfoSize); } +#if 1 /* IPFW: query the firewall */ + /* if dummynet keeps the packet, we mimic success. + * otherwise continue as usual. + */ + { + int ret = ipfw2_qhandler_w32(MyPacket, OUTGOING, + MiniportAdapterContext); + if (ret != PASS) { + if (ret == DROP) + return NDIS_STATUS_FAILURE; + else { //dummynet kept the packet +#ifndef WIN9X + NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket); +#endif + return NDIS_STATUS_SUCCESS; //otherwise simply continue + } + } + } +#endif /* end of IPFW code */ NdisSend(&Status, pAdapt->BindingHandle, diff -ubwrp original_passthru/passthru.c kipfw/passthru.c --- original_passthru/passthru.c 2012-08-01 14:34:15.268554600 +0200 +++ kipfw/passthru.c 2012-08-01 14:34:11.534179600 +0200 @@ -47,8 +47,15 @@ NDIS_HANDLE NdisWrapperHandle; // To support ioctls from user-mode: // -#define LINKNAME_STRING L"\\DosDevices\\Passthru" -#define NTDEVICE_STRING L"\\Device\\Passthru" +#define STR2(x) #x +#define STR(x) STR2(x) +#define DOSPREFIX "\\DosDevices\\" +#define NTPREFIX "\\Device\\" +#define WIDEN2(x) L ## x +#define WIDEN(x) WIDEN2(x) +#define LINKNAME_STRING WIDEN(DOSPREFIX) WIDEN(STR(MODULENAME)) +#define NTDEVICE_STRING WIDEN(NTPREFIX) WIDEN(STR(MODULENAME)) +#define PROTOCOLNAME_STRING WIDEN(STR(MODULENAME)) NDIS_HANDLE NdisDeviceHandle = NULL; PDEVICE_OBJECT ControlDeviceObject = NULL; @@ -136,8 +143,8 @@ Return Value: // Either the Send or the SendPackets handler should be specified. // If SendPackets handler is specified, SendHandler is ignored // - MChars.SendHandler = NULL; // MPSend; - MChars.SendPacketsHandler = MPSendPackets; + MChars.SendHandler = MPSend; // IPFW: use MPSend, not SendPackets + MChars.SendPacketsHandler = NULL; Status = NdisIMRegisterLayeredMiniport(NdisWrapperHandle, &MChars, @@ -165,7 +172,7 @@ Return Value: // This is needed to ensure that NDIS can correctly determine // the binding and call us to bind to miniports below. // - NdisInitUnicodeString(&Name, L"Passthru"); // Protocol name + NdisInitUnicodeString(&Name, PROTOCOLNAME_STRING); // Protocol name PChars.Name = Name; PChars.OpenAdapterCompleteHandler = PtOpenAdapterComplete; PChars.CloseAdapterCompleteHandler = PtCloseAdapterComplete; @@ -205,6 +212,8 @@ Return Value: NdisTerminateWrapper(NdisWrapperHandle, NULL); } + ipfw_module_init(); // IPFW - start the system + return(Status); } @@ -276,7 +285,8 @@ Return Value: DispatchTable[IRP_MJ_CREATE] = PtDispatch; DispatchTable[IRP_MJ_CLEANUP] = PtDispatch; DispatchTable[IRP_MJ_CLOSE] = PtDispatch; - DispatchTable[IRP_MJ_DEVICE_CONTROL] = PtDispatch; + // IPFW we use DevIoControl ? + DispatchTable[IRP_MJ_DEVICE_CONTROL] = DevIoControl; NdisInitUnicodeString(&DeviceName, NTDEVICE_STRING); @@ -453,6 +463,7 @@ PtUnload( NdisFreeSpinLock(&GlobalLock); + ipfw_module_exit(); // IPFW unloading dummynet + DBGPRINT(("PtUnload: done!\n")); } - diff -ubwrp original_passthru/passthru.h kipfw/passthru.h --- original_passthru/passthru.h 2012-08-01 14:34:15.049804600 +0200 +++ kipfw/passthru.h 2012-08-01 14:34:11.362304600 +0200 @@ -61,6 +61,13 @@ PtDispatch( IN PIRP Irp ); +DRIVER_DISPATCH DevIoControl; +NTSTATUS +DevIoControl( + IN PDEVICE_OBJECT pDeviceObject, + IN PIRP pIrp + ); + NDIS_STATUS PtRegisterDevice( VOID @@ -366,6 +373,7 @@ PtDereferenceAdapt( typedef struct _SEND_RSVD { PNDIS_PACKET OriginalPkt; + struct mbuf* pMbuf; // IPFW extension, reference to the mbuf } SEND_RSVD, *PSEND_RSVD; // @@ -376,6 +384,7 @@ typedef struct _SEND_RSVD typedef struct _RECV_RSVD { PNDIS_PACKET OriginalPkt; + struct mbuf* pMbuf; // IPFW extension, reference to the mbuf } RECV_RSVD, *PRECV_RSVD; C_ASSERT(sizeof(RECV_RSVD) <= sizeof(((PNDIS_PACKET)0)->MiniportReserved)); @@ -475,3 +484,17 @@ IsIMDeviceStateOn( */ #define IsIMDeviceStateOn(_pP) ((_pP)->MPDeviceState == NdisDeviceStateD0 && (_pP)->PTDeviceState == NdisDeviceStateD0 ) +#include "winmissing.h" + +int ipfw_module_init(void); +void ipfw_module_exit(void); +int ipfw2_qhandler_w32(PNDIS_PACKET pNdisPacket, int direction, + NDIS_HANDLE Context); +int ipfw2_qhandler_w32_oldstyle(int direction, NDIS_HANDLE ProtocolBindingContext, + unsigned char* HeaderBuffer, unsigned int HeaderBufferSize, + unsigned char* LookAheadBuffer, unsigned int LookAheadBufferSize, + unsigned int PacketSize); +void CleanupReinjected(PNDIS_PACKET Packet, struct mbuf* m, PADAPT pAdapt); +void hexdump(PUCHAR,int, const char *); +void my_init(); +void my_exit(); \ Manca newline alla fine del file Solo in original_passthru: passthru.htm Solo in original_passthru: passthru.rc diff -ubwrp original_passthru/protocol.c kipfw/protocol.c --- original_passthru/protocol.c 2012-08-01 14:34:15.112304600 +0200 +++ kipfw/protocol.c 2012-08-01 14:34:11.409179600 +0200 @@ -841,6 +841,14 @@ Return Value: SendRsvd = (PSEND_RSVD)(Packet->ProtocolReserved); Pkt = SendRsvd->OriginalPkt; +#if 1 // IPFW - new code + //DbgPrint("SendComplete: packet %p pkt %p\n", Packet, Pkt); + if (Pkt == NULL) { //this is a reinjected packet, with no 'father' + CleanupReinjected(Packet, SendRsvd->pMbuf, pAdapt); + return; + } +#endif /* IPFW */ + #ifndef WIN9X NdisIMCopySendCompletePerPacketInfo (Pkt, Packet); #endif @@ -1021,6 +1029,13 @@ Return Value: if (pAdapt->MiniportHandle != NULL) { +#if 1 /* IPFW: query the firewall */ + int ret; + ret = ipfw2_qhandler_w32(MyPacket, INCOMING, + ProtocolBindingContext); + if (ret != PASS) + return 0; //otherwise simply continue +#endif /* end of IPFW code */ NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); } @@ -1055,6 +1070,13 @@ Return Value: { case NdisMedium802_3: case NdisMediumWan: + //DbgPrint("EthIndicateReceive context %p, header at %p len %u, lookahead at %p len %u, packetsize %u\n",ProtocolBindingContext,HeaderBuffer,HeaderBufferSize,LookAheadBuffer,LookAheadBufferSize,PacketSize); + //hexdump(HeaderBuffer,HeaderBufferSize+LookAheadBufferSize,"EthIndicateReceive"); + { + int ret = ipfw2_qhandler_w32_oldstyle(INCOMING, ProtocolBindingContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize); + if (ret != PASS) + return NDIS_STATUS_SUCCESS; + } NdisMEthIndicateReceive(pAdapt->MiniportHandle, MacReceiveContext, HeaderBuffer, @@ -1120,6 +1142,21 @@ Return Value: PADAPT pAdapt =(PADAPT)ProtocolBindingContext; ULONG Proc = KeGetCurrentProcessorNumber(); + /* Warning: this is a poor implementation of the PtReceiveComplete + * made by MS, and it's a well known (but never fixed) issue. + * Since the ProcessorNumber here can be different from the one + * that processed the PtReceive, sometimes NdisMEthIndicateReceiveComplete + * will not be called, causing poor performance in the incoming traffic. + * In our driver, PtReceive is called for IP packets ONLY by particulary + * old NIC drivers, and the poor performance can be seen even + * in traffic not handled by ipfw or dummynet. + * Fortunately, this is quite rare, all the incoming IP packets + * will arrive through PtReceivePacket, and this callback will never + * be called. For reinjected traffic, a workaround is done + * commuting the ReceivedIndicationFlag and calling + * NdisMEthIndicateReceiveComplete manually for each packet. + */ + if (((pAdapt->MiniportHandle != NULL) && (pAdapt->MPDeviceState == NdisDeviceStateD0)) && (pAdapt->ReceivedIndicationFlags[Proc])) @@ -1199,7 +1236,7 @@ Return Value: // See also: PtReceive(). // (VOID)NdisIMGetCurrentPacketStack(Packet, &Remaining); - if (Remaining) + if (0 && Remaining) { // // We can reuse "Packet". Indicate it up and be done with it. @@ -1247,6 +1284,13 @@ Return Value: if (pAdapt->MiniportHandle != NULL) { +#if 1 /* IPFW: query the firewall */ + int ret; + ret = ipfw2_qhandler_w32(MyPacket, INCOMING, + ProtocolBindingContext); + if (ret != PASS) + return 0; //otherwise simply continue +#endif /* end of IPFW code */ NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); } ipfw3-2012/kipfw/bsd_compat.c000644 000423 000000 00000032103 12006744005 016322 0ustar00luigiwheel000000 000000 /* * Copyright (C) 2009 Luigi Rizzo, Marta Carbone, Universita` di Pisa * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: bsd_compat.c 11530 2012-08-01 10:29:32Z luigi $ * * kernel variables and functions that are not available in linux. */ #include #include /* do_div on 2.4 */ #include /* get_random_bytes on 2.4 */ #include #include #include /* * gettimeofday would be in sys/time.h but it is not * visible if _KERNEL is defined */ int gettimeofday(struct timeval *, struct timezone *); int ticks; /* kernel ticks counter */ int hz = 1000; /* default clock time */ long tick = 1000; /* XXX is this 100000/hz ? */ int bootverbose = 0; struct timeval boottime; int ip_defttl = 64; /* XXX set default value */ int max_linkhdr = 16; int fw_one_pass = 1; u_long in_ifaddrhmask; /* mask for hash table */ struct in_ifaddrhashhead *in_ifaddrhashtbl; /* inet addr hash table */ u_int rt_numfibs = RT_NUMFIBS; /* * pfil hook support. * We make pfil_head_get return a non-null pointer, which is then ignored * in our 'add-hook' routines. */ struct pfil_head; typedef int (pfil_hook_t) (void *, struct mbuf **, struct ifnet *, int, struct inpcb *); struct pfil_head * pfil_head_get(int proto, u_long flags) { static int dummy; return (struct pfil_head *)&dummy; } int pfil_add_hook(pfil_hook_t *func, void *arg, int dir, struct pfil_head *h) { return 0; } int pfil_remove_hook(pfil_hook_t *func, void *arg, int dir, struct pfil_head *h) { return 0; } /* define empty body for kernel function */ int priv_check(struct thread *td, int priv) { return 0; } int securelevel_ge(struct ucred *cr, int level) { return 0; } int sysctl_handle_int(SYSCTL_HANDLER_ARGS) { return 0; } int sysctl_handle_long(SYSCTL_HANDLER_ARGS) { return 0; } void ether_demux(struct ifnet *ifp, struct mbuf *m) { return; } int ether_output_frame(struct ifnet *ifp, struct mbuf *m) { return 0; } void in_rtalloc_ign(struct route *ro, u_long ignflags, u_int fibnum) { return; } void icmp_error(struct mbuf *n, int type, int code, uint32_t dest, int mtu) { return; } u_short in_cksum_skip(struct mbuf *m, int len, int skip) { return 0; } u_short in_cksum_hdr(struct ip *ip) { return 0; } /* * we don't really reassemble, just return whatever we had. */ struct mbuf * ip_reass(struct mbuf *clone) { return clone; } #ifdef INP_LOCK_ASSERT #undef INP_LOCK_ASSERT #define INP_LOCK_ASSERT(a) #endif /* credentials check */ #include #ifdef __linux__ int cred_check(void *_insn, int proto, struct ifnet *oif, struct in_addr dst_ip, u_int16_t dst_port, struct in_addr src_ip, u_int16_t src_port, struct bsd_ucred *u, int *ugid_lookupp, struct sk_buff *skb) { int match = 0; ipfw_insn_u32 *insn = (ipfw_insn_u32 *)_insn; if (*ugid_lookupp == 0) { /* actively lookup and copy in cache */ /* returns null if any element of the chain up to file is null. * if sk != NULL then we also have a reference */ *ugid_lookupp = linux_lookup(proto, src_ip.s_addr, htons(src_port), dst_ip.s_addr, htons(dst_port), skb, oif ? 1 : 0, u); } if (*ugid_lookupp < 0) return 0; if (insn->o.opcode == O_UID) match = (u->uid == (uid_t)insn->d[0]); else if (insn->o.opcode == O_JAIL) match = (u->xid == (uid_t)insn->d[0]); else if (insn->o.opcode == O_GID) match = (u->gid == (uid_t)insn->d[0]); return match; } #endif /* __linux__ */ int jailed(struct ucred *cred) { return 0; } /* * Return 1 if an internet address is for a ``local'' host * (one to which we have a connection). If subnetsarelocal * is true, this includes other subnets of the local net. * Otherwise, it includes only the directly-connected (sub)nets. */ int in_localaddr(struct in_addr in) { return 1; } int sooptcopyout(struct sockopt *sopt, const void *buf, size_t len) { size_t valsize = sopt->sopt_valsize; if (len < valsize) sopt->sopt_valsize = valsize = len; //printf("copyout buf = %p, sopt = %p, soptval = %p, len = %d \n", buf, sopt, sopt->sopt_val, len); bcopy(buf, sopt->sopt_val, valsize); return 0; } /* * copy data from userland to kernel */ int sooptcopyin(struct sockopt *sopt, void *buf, size_t len, size_t minlen) { size_t valsize = sopt->sopt_valsize; if (valsize < minlen) return EINVAL; if (valsize > len) sopt->sopt_valsize = valsize = len; //printf("copyin buf = %p, sopt = %p, soptval = %p, len = %d \n", buf, sopt, sopt->sopt_val, len); bcopy(sopt->sopt_val, buf, valsize); return 0; } void getmicrouptime(struct timeval *tv) { do_gettimeofday(tv); } #include char * inet_ntoa_r(struct in_addr ina, char *buf) { #ifdef _WIN32 #else unsigned char *ucp = (unsigned char *)&ina; sprintf(buf, "%d.%d.%d.%d", ucp[0] & 0xff, ucp[1] & 0xff, ucp[2] & 0xff, ucp[3] & 0xff); #endif return buf; } char * inet_ntoa(struct in_addr ina) { static char buf[16]; return inet_ntoa_r(ina, buf); } int random(void) { #ifdef _WIN32 static unsigned long seed; if (seed == 0) { LARGE_INTEGER tm; KeQuerySystemTime(&tm); seed = tm.LowPart; } return RtlRandomEx(&seed) & 0x7fffffff; #else int r; get_random_bytes(&r, sizeof(r)); return r & 0x7fffffff; #endif } /* * do_div really does a u64 / u32 bit division. * we save the sign and convert to uint befor calling. * We are safe just because we always call it with small operands. */ int64_t div64(int64_t a, int64_t b) { #ifdef _WIN32 int a1 = a, b1 = b; return a1/b1; #else uint64_t ua, ub; int sign = ((a>0)?1:-1) * ((b>0)?1:-1); ua = ((a>0)?a:-a); ub = ((b>0)?b:-b); do_div(ua, ub); return sign*ua; #endif } #ifdef __MIPSEL__ size_t strlcpy(char *dst, const char *src, size_t siz) { char *d = dst; const char *s = src; size_t n = siz; /* Copy as many bytes as will fit */ if (n != 0 && --n != 0) { do { if ((*d++ = *s++) == 0) break; } while (--n != 0); } /* Not enough room in dst, add NUL and traverse rest of src */ if (n == 0) { if (siz != 0) *d = '\0'; /* NUL-terminate dst */ while (*s++) ; } return(s - src - 1); /* count does not include NUL */ } #endif // __MIPSEL__ /* * compact version of fnmatch. */ int fnmatch(const char *pattern, const char *string, int flags) { char s; if (!string || !pattern) return 1; /* no match */ while ( (s = *string++) ) { char p = *pattern++; if (p == '\0') /* pattern is over, no match */ return 1; if (p == '*') /* wildcard, match */ return 0; if (p == '.' || p == s) /* char match, continue */ continue; return 1; /* no match */ } /* end of string, make sure the pattern is over too */ if (*pattern == '\0' || *pattern == '*') return 0; return 1; /* no match */ } /* * linux 2.6.33 defines these functions to access to * skbuff internal structures. Define the missing * function for the previous versions too. */ #ifdef linux #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31) inline void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst) { skb->dst = dst; } inline struct dst_entry *skb_dst(const struct sk_buff *skb) { return (struct dst_entry *)skb->dst; } #endif /* < 2.6.31 */ #endif /* linux */ /* support for sysctl emulation. * XXX this is actually MI code that should be enabled also on openwrt */ #ifdef EMULATE_SYSCTL static struct sysctltable GST; int kesysctl_emu_get(struct sockopt* sopt) { struct dn_id* oid = sopt->sopt_val; struct sysctlhead* entry; int sizeneeded = sizeof(struct dn_id) + GST.totalsize + sizeof(struct sysctlhead); unsigned char* pstring; unsigned char* pdata; int i; if (sopt->sopt_valsize < sizeneeded) { // this is a probe to retrieve the space needed for // a dump of the sysctl table oid->id = sizeneeded; sopt->sopt_valsize = sizeof(struct dn_id); return 0; } entry = (struct sysctlhead*)(oid+1); for( i=0; iblocklen = GST.entry[i].head.blocklen; entry->namelen = GST.entry[i].head.namelen; entry->flags = GST.entry[i].head.flags; entry->datalen = GST.entry[i].head.datalen; pdata = (unsigned char*)(entry+1); pstring = pdata+GST.entry[i].head.datalen; bcopy(GST.entry[i].data, pdata, GST.entry[i].head.datalen); bcopy(GST.entry[i].name, pstring, GST.entry[i].head.namelen); entry = (struct sysctlhead*) ((unsigned char*)(entry) + GST.entry[i].head.blocklen); } sopt->sopt_valsize = sizeneeded; return 0; } int kesysctl_emu_set(void* p, int l) { struct sysctlhead* entry; unsigned char* pdata; unsigned char* pstring; int i = 0; entry = (struct sysctlhead*)(((struct dn_id*)p)+1); pdata = (unsigned char*)(entry+1); pstring = pdata + entry->datalen; for (i=0; idatalen != GST.entry[i].head.datalen) { printf("%s: len mismatch, user %d vs kernel %d\n", __FUNCTION__, entry->datalen, GST.entry[i].head.datalen); return -1; } // check access (at the moment flags handles only the R/W rights //later on will be type + access if( (GST.entry[i].head.flags & 3) == CTLFLAG_RD) { printf("%s: the entry %s is read only\n", __FUNCTION__,GST.entry[i].name); return -1; } bcopy(pdata, GST.entry[i].data, GST.entry[i].head.datalen); return 0; } printf("%s: match not found\n",__FUNCTION__); return 0; } /* convert all _ to . until the first . */ static void underscoretopoint(char* s) { for (; *s && *s != '.'; s++) if (*s == '_') *s = '.'; } static int formatnames() { int i; int size=0; char* name; for (i=0; i> 2, GST.entry[i].head.flags & 0x00000003); printf("data %i\n", *(int*)(GST.entry[i].data)); printf("datalen %i\n", GST.entry[i].head.datalen); printf("blocklen %i\n", GST.entry[i].head.blocklen); } } void sysctl_addgroup_f1(); void sysctl_addgroup_f2(); void sysctl_addgroup_f3(); void sysctl_addgroup_f4(); void keinit_GST() { int ret; sysctl_addgroup_f1(); sysctl_addgroup_f2(); sysctl_addgroup_f3(); sysctl_addgroup_f4(); ret = formatnames(); if (ret != 0) printf("conversion of names failed for some reason\n"); //dumpGST(); printf("*** Global Sysctl Table entries = %i, total size = %i ***\n", GST.count, GST.totalsize); } void keexit_GST() { if (GST.namebuffer != NULL) free(GST.namebuffer,0); bzero(&GST, sizeof(GST)); } void sysctl_pushback(char* name, int flags, int datalen, void* data) { if (GST.count >= GST_HARD_LIMIT) { printf("WARNING: global sysctl table full, this entry will not be added," "please recompile the module increasing the table size\n"); return; } GST.entry[GST.count].head.namelen = strlen(name)+1; //add space for '\0' GST.entry[GST.count].name = name; GST.entry[GST.count].head.flags = flags; GST.entry[GST.count].data = data; GST.entry[GST.count].head.datalen = datalen; GST.entry[GST.count].head.blocklen = ((sizeof(struct sysctlhead) + GST.entry[GST.count].head.namelen + GST.entry[GST.count].head.datalen)+3) & ~3; GST.totalsize += GST.entry[GST.count].head.blocklen; GST.count++; } #endif /* EMULATE_SYSCTL */ ipfw3-2012/kipfw/Makefile000644 000423 000000 00000030274 12012013736 015507 0ustar00luigiwheel000000 000000 # $Id: Makefile 11690 2012-08-12 21:14:53Z luigi $ # gnu Makefile to build linux/Windows module for ipfw+dummynet. # # The defaults are set to build without modifications on PlanetLab # and possibly 2.6 versions. # On Windows, we use gnu-make and MSC # Some variables need to have specific names, because they are used # by the build infrastructure on Linux and OpenWrt. They are: # # ccflags-y additional $(CC) flags # M used by Kbuild, we must set it to `pwd` # obj-m list of .o modules to build # $(MOD)-y for each $MOD in obj-m, the list of objects # obj-y same as above, for openwrt # O_TARGET the link target, for openwrt # EXTRA_CFLAGS as the name says... in openwrt # EXTRA_CFLAGS is used in 2.6.22 module kernel compilation too # KERNELPATH the path to the kernel sources or headers # (on planetlab it is set already by the build system, # for other systems we take KSRC which is either guessed # or taken from the command line. # # Not sure about this (the name might be reserved) # ipfw-cflags our flags for building the module # # Other variables are only private and can be renamed. They include: # # VER linux version we are building for (2.4 2.6 or openwrt) # #--- # # The windows files (passthru etc.) are modified version of the # examples found in the $(DDK)/src/network/ndis/passthru/driver/ # They can be re-created using the 'ndis-glue' target in the include $(PWD)/../Makefile.inc TARGET = kipfw # lets default for 2.6 for planetlab builds VER ?= 2.6 #--- General values for all types of build --- # obj-m is the target module obj-m := ipfw_mod.o #-- the list of source files. IPFW_SRCS is our own name. # Original ipfw and dummynet sources + FreeBSD stuff, IPFW_SRCS := ip_fw2.c ip_fw_pfil.c ip_fw_sockopt.c IPFW_SRCS += ip_fw_dynamic.c ip_fw_table.c ip_fw_log.c IPFW_SRCS += radix.c in_cksum.c IPFW_SRCS += ip_dummynet.c ip_dn_io.c ip_dn_glue.c IPFW_SRCS += dn_heap.c IPFW_SRCS += dn_sched_fifo.c dn_sched_wf2q.c IPFW_SRCS += dn_sched_rr.c dn_sched_qfq.c IPFW_SRCS += dn_sched_prio.c # Module glue and functions missing in linux IPFW_SRCS += ipfw2_mod.c bsd_compat.c # generic cflags used on all systems #ipfw-cflags += -DIPFW_HASHTABLES ipfw-cflags += -DIPFIREWALL_DEFAULT_TO_ACCEPT # _BSD_SOURCE enables __FAVOR_BSD (udp/tcp bsd structs instead of posix) ipfw-cflags += -D_BSD_SOURCE ipfw-cflags += -DKERNEL_MODULE # build linux kernel module # the two header trees for empty and override files ipfw-cflags += -I $(M)/include_e ipfw-cflags += -I $(M)/../sys ipfw-cflags += -include $(M)/../glue.h # headers ipfw-cflags += -include $(M)/missing.h # headers ifeq ($(OSARCH),Windows) #--- { Windows block ifeq ($(VER),win64) $(warning ---- building for 64-bit windows ---) win_arch= -DAMD64=1 else win_arch= -Di386=1 endif M ?= $(shell pwd) WIN_SRCS += md_win.c WIN_SRCS += miniport.c protocol.c passthru.c debug.c #compiler, linker, target, sources and objects #DDK is exported from the root makefile #DDK = C:/WinDDK/7600.16385.1 CSOURCES = $(IPFW_SRCS) $(WIN_SRCS) COBJS := $(CSOURCES:.c=.obj) COBJS := $(addprefix $(OBJDIR)/,$(COBJS)) #include paths INCLUDE_PATHS = -Ii386 -I../sys -Iinclude_e -I. # INCLUDE_PATHS += -I$(OBJDIR) INCLUDE_PATHS += -I$(DDK)/inc/api INCLUDE_PATHS += -I$(DDK)/inc/ddk INCLUDE_PATHS += -I$(DDK)/inc/crt # #preprocessor MS defines PREPROC = -D_X86_=1 -Di386=1 -DSTD_CALL -DCONDITION_HANDLING=1 PREPROC += -DNT_UP=0 -DNT_INST=0 -DWIN32=100 -D_NT1X_=100 -DWINNT=1 PREPROC += -D_WIN32_WINNT=0x0501 -DWINVER=0x0501 -D_WIN32_IE=0x0603 PREPROC += -DWIN32_LEAN_AND_MEAN=1 PREPROC += -D__BUILDMACHINE__=WinDDK -DFPO=0 -D_DLL=1 PREPROC += -DNDIS_MINIPORT_DRIVER -DNDIS_WDM=1 PREPROC += -DNDIS51_MINIPORT=1 -DNDIS51=1 PREPROC += -DMSC_NOOPT -DNTDDI_VERSION=0x05010200 PREPROC += -DKMDF_MAJOR_VERSION_STRING=01 -DKMDF_MINOR_VERSION_STRING=009 #PREPROC += -DDBG=1 #debug PREPROC += -DNDEBUG #always up, seems no effect, possibly no debug? PREPROC += -DDEVL=1 #always up, seems no effect #macroing module name, WARNING: must match the one in .inf files PREPROC += -DMODULENAME=Ipfw #our defines OUR_PREPROC = -D_KERNEL -DKERNEL_MODULE -DKLD_MODULE OUR_PREPROC += -D__BSD_VISIBLE -DIPFIREWALL_DEFAULT_TO_ACCEPT OUR_PREPROC += -D__LITTLE_ENDIAN -DSYSCTL_NODE -DEMULATE_SYSCTL ifeq ($(TCC),) # Microsoft C compiler CC = $(DDK)/bin/x86/x86/cl.exe LD = $(DDK)/bin/x86/x86/link.exe # #complier options CFLAGS = -Fo$(OBJDIR)/ -c -FC -Zc:wchar_t- CFLAGS += -Zl -Zp8 -Gy -Gm- -GF -cbstring -Gz -hotpatch -EHs-c- CFLAGS += -W2 # -W3 gives too many conversion errors CFLAGS += -GR- -GF -GS -Zi # XXX do we need this ? CFLAGS += -Fd$(OBJDIR)/ CFLAGS += -wd4603 -wd4627 -typedil- CFLAGS += -FI $(DDK)/inc/api/warning.h CFLAGS += -FI winmissing.h CFLAGS += -FI missing.h # headers CFLAGS += -FI ../glue.h # headers #optimization options OPTIMIZE = -Od -Oi -Oy- #linker options LDFLAGS = /MERGE:_PAGE=PAGE /MERGE:_TEXT=.text LDFLAGS += /SECTION:INIT,d /OPT:REF /OPT:ICF LDFLAGS += /IGNORE:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221 LDFLAGS += /INCREMENTAL:NO /release /NODEFAULTLIB /WX LDFLAGS += /debug /debugtype:cv,fixup,pdata LDFLAGS += /version:6.1 /osversion:6.1 /functionpadmin:5 LDFLAGS += /safeseh /pdbcompress LDFLAGS += /STACK:0x40000,0x1000 /driver /base:0x10000 /align:0x80 LDFLAGS += /stub:$(DDK)\\lib\\wxp\\stub512.com LDFLAGS += /subsystem:native,5.01 /entry:GsDriverEntry@8 LDFLAGS += /out:$(OBJDIR)/ipfw.sys #libraries to build against LIBS = $(DDK)/lib/wxp/i386/BufferOverflowK.lib LIBS += $(DDK)/lib/wxp/i386/ntoskrnl.lib LIBS += $(DDK)/lib/wxp/i386/hal.lib LIBS += $(DDK)/lib/wxp/i386/wmilib.lib LIBS += $(DDK)/lib/wxp/i386/ndis.lib LIBS += $(DDK)/lib/wxp/i386/sehupd.lib else # use tcc. not working yet for the kernel module. # TCC points to the root of tcc tree CC=$(TCC)/bin/wintcc EXTRA_CFLAGS += -DTCC -I.. EXTRA_CFLAGS += -I$(TCC)/include/winapi -I$(TCC)/include EXTRA_CFLAGS += -nostdinc CFLAGS += -include winmissing.h -include missing.h -include ../glue.h CFLAGS += -I../../inc/api -I../../inc/ddk -I../../inc/crt CFLAGS += -DRC_INVOKED endif # use tcc #empty include directory to be built M ?= $(shell pwd) EFILES_asm += div64.h EFILES_linux += if.h random.h errno.h EFILES_net += if_types.h inet_hashtables.h route.h #targets all: $(TARGET) $(TARGET): include_e # XXX dangerous rm -rf $(OBJDIR) mkdir -p $(OBJDIR) $(MSG) " CC [$(CC)] $(CSOURCES)" $(HIDE) $(CC) $(INCLUDE_PATHS) $(PREPROC) $(OUR_PREPROC) $(CFLAGS) $(OPTIMIZE) $(CSOURCES) $(MSG) " LD [$(LD)] $(COBJS)" $(HIDE) $(LD) $(LDFLAGS) $(COBJS) $(LIBS) else # } { linux variables and targets # We have three sections: OpenWrt, Linux 2.4 and Linux 2.6 ifeq ($(VER),openwrt) #--- { The Makefile section for openwrt --- # We do not include a dependency on include_e as it is called # by Makefile.openwrt in Build/Prepare M=. obj-y := $(IPFW_SRCS:%.c=%.o) O_TARGET := $(obj-m) # xcflags-y is a temporary variable where we store build options xcflags-y += -O1 -DLINUX_24 xcflags-y += -g EXTRA_CFLAGS := $(xcflags-y) $(ipfw-cflags) -DSYSCTL_NODE -DEMULATE_SYSCTL # we should not export anything #export-objs := ipfw2_mod.o -include $(TOPDIR)/Rules.make endif # ---- } end openwrt version ifneq ($(shell echo $(VER)|grep '2.4'),) #--- { # Makefile section for the linux 2.4 version # tested on linux-2.4.35.4, does not work with 2.4.37 # # guess the kernel path -- or is it under /lib/modules ? KERNELPATH ?= $(KSRC) # We need to figure out the gcc include directory, if not # set by the user through MYGCC_INCLUDE # Find compiler version (3rd field in last line returned by gcc -v) # e.g. gcc version 4.3.2 (Debian 4.3.2-1.1) MYGCC_VER ?= $(shell $(CC) -v 2>&1 |tail -n 1 | cut -d " " -f 3) # We don't know the exact directory under /usr/lib/gcc so we guess MYGCC_INCLUDE ?= $(shell echo /usr/lib/gcc/*/$(MYGCC_VER) | cut -d " " -f 1)/include $(warning "---- gcc includes guessed to $(MYGCC_INCLUDE)") # additional warning WARN += -Wall -Wundef WARN += -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing WARN += -fno-common -Werror-implicit-function-declaration # WARN += -O2 -fno-stack-protector -m32 -msoft-float -mregparm=3 # -mregparm=3 gives a printk error WARN += -m32 -msoft-float # -mregparm=3 #WARN += -freg-struct-return -mpreferred-stack-boundary=2 WARN += -Wno-sign-compare WARN += -Wdeclaration-after-statement ifneq ($(MYGCC_VER),3.4.6) WARN += -Wno-pointer-sign endif ccflags-y += -O1 -DLINUX_24 CFLAGS = -DMODULE -D__KERNEL__ -nostdinc \ -isystem ${KERNELPATH}/include -isystem $(MYGCC_INCLUDE) \ ${ccflags-y} # The Main target all: mod24 else # --- } { linux 2.6 and newer # This is the Makefile section for Linux 2.6.x including planetlab ifeq ($(IPFW_PLANETLAB),1) $(warning "---- Building for PlanetLab") ipfw-cflags += -DIPFW_PLANETLAB # PlanetLab compilation endif # if not set, use the version from the installed system KERNELPATH ?= $(KSRC) # $(warning "---- Building Version 2.6 $(VER) in $(KERNELPATH)") WARN := -O1 -Wall -Werror -DDEBUG_SPINLOCK -DDEBUG_MUTEXES # The main target # Required by GCC 4.6 ccflags-y += -Wno-unused-but-set-variable # Required by kernel <= 2.6.22, ccflags-y is used on newer version LINUX_VERSION_CODE := $(shell grep LINUX_VERSION_CODE $(KERNELPATH)/include/linux/version.h|cut -d " " -f3) ifeq ($(shell if [ -z $(LINUX_VERSION_CODE) ] ; then echo "true"; fi),true) $(warning "---- Perhaps you miss a (cd $(KERNELPATH); make oldconfig; make prepare; make scripts)"); endif ifeq ($(shell if [ "$(LINUX_VERSION_CODE)" -le 132630 ] ; then echo "true"; fi),true) EXTRA_CFLAGS += $(ccflags-y) endif all: $(TARGET) $(TARGET): include_e $(MAKE) -C $(KERNELPATH) V=$(V) M=`pwd` modules endif # } --- linux 2.6 and newer #-- back to the common section for linux # the list of objects used to build the module ipfw_mod-y = $(IPFW_SRCS:%.c=%.o) # additional $(CC) flags ccflags-y += $(WARN) ccflags-y += $(ipfw-cflags) # if we really want debug symbols... ccflags-y += -g mod24: include_e $(obj-m) $(obj-m): $(ipfw_mod-y) $(LD) $(LDFLAGS) -m elf_i386 -r -o $@ $^ # M is the current directory, used in recursive builds # so we allow it to be overridden M ?= $(shell pwd) endif # } ----- end of the non-Windows block ifneq ($(OBJDIR),mia) $(error objdir set to $(OBJDIR)) endif #--- various common targets clean: -@rm -f *.o *.ko Module.symvers *.mod.c -@# rm -rf $(OBJDIR) -@rm -rf include_e distclean: clean -@rm -f .*cmd modules.order opt_* -@rm -rf .tmp_versions .*.o.d _CL_* # support to create empty dirs and files in include_e/ # EFILES_foo/bar is the list of files to be created in foo/bar # (/ and . are allowed in gmake variable names) EFILES_. += opt_inet.h opt_inet6.h opt_ipfw.h opt_ipsec.h opt_mpath.h EFILES_. += opt_mbuf_stress_test.h opt_param.h opt_ipdivert.h EFILES_altq += if_altq.h EFILES_arpa += inet.h EFILES_machine += in_cksum.h EFILES_net += ethernet.h netisr.h pf_mtag.h bpf.h if_types.h vnet.h EFILES_netinet += ether.h icmp6.h if_ether.h in.h in_pcb.h in_var.h EFILES_netinet += in_systm.h ip_carp.h ip_var.h pim.h EFILES_netinet += sctp.h tcp_timer.h tcpip.h udp_var.h EFILES_netinet6 += ip6_var.h EFILES_sys += _lock.h _rwlock.h rmlock.h _mutex.h jail.h EFILES_sys += condvar.h eventhandler.h domain.h EFILES_sys += limits.h lock.h mutex.h priv.h EFILES_sys += proc.h rwlock.h socket.h socketvar.h EFILES_sys += sysctl.h time.h ucred.h # first make a list of directories from variable names EDIRS= $(subst EFILES_,,$(filter EFILES_%,$(.VARIABLES))) # then prepend the directory name to individual files. # $(empty) serves to interpret the following space literally, # and the ": = " substitution packs spaces into one. EFILES = $(foreach i,$(EDIRS),$(subst $(empty) , $(i)/, $(EFILES_$(i): = ))) include_e: -@rm -rf $(M)/include_e opt_* -@mkdir -p $(M)/include_e -@(cd $(M)/include_e; mkdir -p $(EDIRS); touch $(EFILES) ) #--- some other targets for testing purposes test_radix: test_radix.o radix.o test_lookup: ip_fw_lookup.o test_radix test_lookup: CFLAGS=-Wall -Werror -O1 ipfw3-2012/kipfw/winmissing.h000644 000423 000000 00000016037 12010047557 016416 0ustar00luigiwheel000000 000000 /* * Copyright (c) 2010 Francesco Magno, Universita` di Pisa * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: winmissing.h 11647 2012-08-06 23:20:21Z luigi $ * definitions and other things needed to build freebsd kernel * modules in Windows (with the MSVC compiler) */ #ifndef _WINMISSING_H_ #define _WINMISSING_H_ #include #include #include #include #include #include typedef UCHAR u_char; typedef UCHAR u_int8_t; typedef UCHAR uint8_t; typedef USHORT u_short; typedef USHORT u_int16_t; typedef USHORT uint16_t; typedef USHORT n_short; typedef UINT u_int; typedef INT32 int32_t; typedef UINT32 u_int32_t; typedef UINT32 uint32_t; typedef ULONG u_long; typedef ULONG n_long; typedef UINT64 uint64_t; typedef UINT64 u_int64_t; typedef INT64 int64_t; typedef UINT32 in_addr_t; typedef UCHAR sa_family_t; typedef USHORT in_port_t; typedef UINT32 __gid_t; typedef UINT32 gid_t; typedef UINT32 __uid_t; typedef UINT32 uid_t; typedef ULONG n_time; typedef char* caddr_t; /* linux_lookup uses __be32 and __be16 in the prototype */ typedef uint32_t __be32; /* XXX __u32 __bitwise __be32 */ typedef uint16_t __be16; /* XXX */ //*** DEBUG STUFF *** /* * To see the debugging messages you need DbgView http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx */ #define printf DbgPrint #define log(lev, ...) DbgPrint(__VA_ARGS__) const char* texify_cmd(int i); const char* texify_proto(unsigned int p); //*** end DEBUG STUFF *** #define snprintf _snprintf #define timespec timeval struct timeval { long tv_sec; long tv_usec; }; struct in_addr { in_addr_t s_addr; }; struct sockaddr_in { uint8_t sin_len; sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; char sin_zero[8]; }; /* XXX watch out, windows names are actually longer */ #define IFNAMSIZ 16 #define IF_NAMESIZE 16 #define ETHER_ADDR_LEN 6 /* we do not include the windows headers for in6_addr so * we need to provide our own definition for the kernel. */ struct in6_addr { union { uint8_t __u6_addr8[16]; uint16_t __u6_addr16[8]; uint32_t __u6_addr32[4]; } __u6_addr; /* 128-bit IP6 address */ }; #define htons(x) RtlUshortByteSwap(x) #define ntohs(x) RtlUshortByteSwap(x) #define htonl(x) RtlUlongByteSwap(x) #define ntohl(x) RtlUlongByteSwap(x) #define ENOSPC 28 /* No space left on device */ #define EOPNOTSUPP 45 /* Operation not supported */ #define EACCES 13 /* Permission denied */ #define ENOENT 2 /* No such file or directory */ #define EINVAL 22 /* Invalid argument */ #define EPROTONOSUPPORT 43 /* Protocol not supported */ #define ENOMEM 12 /* Cannot allocate memory */ #define EEXIST 17 /* File exists */ #define ESRCH 3 #define ENOBUFS 55 /* No buffer space available */ #define EBUSY 16 /* Module busy */ #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) #define __packed #define __aligned(x); #define __user #define __init #define __exit #define __func__ __FUNCTION__ #define inline __inline struct sockaddr_in6 { int dummy; }; //SPINLOCKS #define DEFINE_SPINLOCK(x) NDIS_SPIN_LOCK x #define mtx_init(m,a,b,c) NdisAllocateSpinLock(m) #define mtx_lock(_l) NdisAcquireSpinLock(_l) #define mtx_unlock(_l) NdisReleaseSpinLock(_l) #define mtx_destroy(m) NdisFreeSpinLock(m) #define mtx_assert(a, b) #define rw_rlock(_l) NdisAcquireSpinLock(_l) #define rw_runlock(_l) NdisReleaseSpinLock(_l) #define rw_assert(a, b) #define rw_wlock(_l) NdisAcquireSpinLock(_l) #define rw_wunlock(_l) NdisReleaseSpinLock(_l) #define rw_destroy(_l) NdisFreeSpinLock(_l) #define rw_init(_l, msg) NdisAllocateSpinLock(_l) #define rw_init_flags(_l, s, v) NdisAllocateSpinLock(_l) #define rwlock_t NDIS_SPIN_LOCK #define spinlock_t NDIS_SPIN_LOCK #define s6_addr __u6_addr.__u6_addr8 struct icmphdr { u_char icmp_type; /* type of message, see below */ u_char icmp_code; /* type sub code */ u_short icmp_cksum; /* ones complement cksum of struct */ }; #define ICMP_ECHO 8 /* echo service */ #define IPOPT_OPTVAL 0 /* option ID */ #define IPOPT_OLEN 1 /* option length */ #define IPOPT_EOL 0 /* end of option list */ #define IPOPT_NOP 1 /* no operation */ #define IPOPT_LSRR 131 /* loose source route */ #define IPOPT_SSRR 137 /* strict source route */ #define IPOPT_RR 7 /* record packet route */ #define IPOPT_TS 68 /* timestamp */ #define IPPROTO_ICMP 1 /* control message protocol */ #define IPPROTO_TCP 6 /* tcp */ #define IPPROTO_UDP 17 /* user datagram protocol */ #define IPPROTO_ICMPV6 58 /* ICMP6 */ #define IPPROTO_SCTP 132 /* SCTP */ #define IPPROTO_HOPOPTS 0 /* IP6 hop-by-hop options */ #define IPPROTO_ROUTING 43 /* IP6 routing header */ #define IPPROTO_FRAGMENT 44 /* IP6 fragmentation header */ #define IPPROTO_DSTOPTS 60 /* IP6 destination option */ #define IPPROTO_AH 51 /* IP6 Auth Header */ #define IPPROTO_ESP 50 /* IP6 Encap Sec. Payload */ #define IPPROTO_NONE 59 /* IP6 no next header */ #define IPPROTO_PIM 103 /* Protocol Independent Mcast */ #define IPPROTO_IPV6 41 #define IPPROTO_IPV4 4 /* IPv4 encapsulation */ #define INADDR_ANY (uint32_t)0x00000000 #define AF_INET 2 /* internetwork: UDP, TCP, etc. */ #define AF_LINK 18 /* Link layer interface */ #define IN_CLASSD(i) (((uint32_t)(i) & 0xf0000000) == 0xe0000000) #define IN_MULTICAST(i) IN_CLASSD(i) #define DROP 0 #define PASS 1 #define DUMMYNET 2 #define INCOMING 0 #define OUTGOING 1 size_t strlcpy(char *dst, const char *src, size_t siz); void do_gettimeofday(struct timeval *tv); int ffs(int bits); int time_uptime_w32(); #endif /* _WINMISSING_H_ */ ipfw3-2012/kipfw/md_win.c000644 000423 000000 00000047557 12010150105 015472 0ustar00luigiwheel000000 000000 /* * Copyright (C) 2010 Luigi Rizzo, Francesco Magno, Universita` di Pisa * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * kernel variables and functions that are not available in Windows. */ #include /* provides PFIL_IN and PFIL_OUT */ #include #include /* in_addr */ #include #include #include /* credentials check */ int cred_check(void *_insn, int proto, struct ifnet *oif, struct in_addr dst_ip, u_int16_t dst_port, struct in_addr src_ip, u_int16_t src_port, struct bsd_ucred *u, int *ugid_lookupp, struct sk_buff *skb) { return 0; } /* * as good as anywhere, place here the missing calls */ void * my_alloc(int size) { void *_ret = ExAllocatePoolWithTag(NonPagedPool, size, 'wfpi'); if (_ret) memset(_ret, 0, size); return _ret; } void panic(const char *fmt, ...) { printf("%s", fmt); for (;;); } int securelevel = 0; int ffs(int bits) { int i; if (bits == 0) return (0); for (i = 1; ; i++, bits >>= 1) { if (bits & 1) break; } return (i); } void do_gettimeofday(struct timeval *tv) { static LARGE_INTEGER prevtime; //system time in 100-nsec resolution static LARGE_INTEGER prevcount; //RTC counter value static LARGE_INTEGER freq; //frequency LARGE_INTEGER currtime; LARGE_INTEGER currcount; if (prevtime.QuadPart == 0) { //first time we ask for system time KeQuerySystemTime(&prevtime); prevcount = KeQueryPerformanceCounter(&freq); currtime.QuadPart = prevtime.QuadPart; } else { KeQuerySystemTime(&currtime); currcount = KeQueryPerformanceCounter(&freq); if (currtime.QuadPart == prevtime.QuadPart) { //time has NOT changed, calculate time using ticks and DO NOT update LONGLONG difftime = 0; //difference in 100-nsec LONGLONG diffcount = 0; //clock count difference //printf("time has NOT changed\n"); diffcount = currcount.QuadPart - prevcount.QuadPart; diffcount *= 10000000; difftime = diffcount / freq.QuadPart; currtime.QuadPart += difftime; } else { //time has changed, update and return SystemTime //printf("time has changed\n"); prevtime.QuadPart = currtime.QuadPart; prevcount.QuadPart = currcount.QuadPart; } } currtime.QuadPart /= 10; //convert in usec tv->tv_sec = currtime.QuadPart / (LONGLONG)1000000; tv->tv_usec = currtime.QuadPart % (LONGLONG)1000000; //printf("sec %d usec %d\n",tv->tv_sec, tv->tv_usec); } int time_uptime_w32() { int ret; LARGE_INTEGER tm; KeQuerySystemTime(&tm); ret = (int)(tm.QuadPart / (LONGLONG)1000000); return ret; } /* * Windows version of firewall hook. We receive a partial copy of * the packet which points to the original buffers. In output, * the refcount has been already incremented. * The function reconstructs * the whole packet in a contiguous memory area, builds a fake mbuf, * calls the firewall, does the eventual cleaning and returns * to MiniportSend or ProtocolReceive, which will silently return * (dropping packet) or continue its execution (allowing packet). * The memory area contains: * - the fake mbuf, filled with data needed by ipfw, and information * for reinjection * - the packet data */ void hexdump(PUCHAR,int, const char *); static char _if_in[] = "incoming"; static char _if_out[] = "outgoing"; int ipfw2_qhandler_w32(PNDIS_PACKET pNdisPacket, int direction, NDIS_HANDLE Context) { unsigned int BufferCount = 0; unsigned TotalPacketLength = 0; PNDIS_BUFFER pCurrentBuffer = NULL; PNDIS_BUFFER pNextBuffer = NULL; struct mbuf* m; unsigned char* payload = NULL; unsigned int ofs, l; unsigned short EtherType = 0; unsigned int i = 0; int ret = 0; PNDIS_BUFFER pNdisBuffer, old_head, old_tail; NDIS_HANDLE PacketPool; PADAPT pAdapt; NDIS_STATUS Status; /* In NDIS, packets are a chain of NDIS_BUFFER. We query * the packet to get a pointer of chain's head, the length * of the chain, and the length of the packet itself. * Then allocate a buffer for the mbuf and the payload. */ NdisQueryPacket(pNdisPacket, NULL, &BufferCount, &pCurrentBuffer, &TotalPacketLength); m = malloc(sizeof(struct mbuf) + TotalPacketLength, 0, 0 ); if (m == NULL) //resource shortage, drop the packet goto drop_pkt; /* set mbuf fields to point past the MAC header. * Also set additional W32 info */ payload = (unsigned char*)(m + 1); m->m_len = m->m_pkthdr.len = TotalPacketLength-14; m->m_pkthdr.rcvif = (void *)((direction==INCOMING) ? _if_in : NULL); m->m_data = payload + 14; /* past the MAC header */ m->direction = direction; m->context = Context; m->pkt = pNdisPacket; /* m_skb != NULL is used in the ip_output routine to check * for packets that come from the stack and differentiate * from those internally generated by ipfw. * The pointer is not used, just needs to be non-null. */ m->m_skb = (void *)pNdisPacket; /* * Now copy the data from the Windows buffers to the mbuf. */ for (i=0, ofs = 0; i < BufferCount; i++) { unsigned char* src; NdisQueryBufferSafe(pCurrentBuffer, &src, &l, NormalPagePriority); bcopy(src, payload + ofs, l); ofs += l; NdisGetNextBuffer(pCurrentBuffer, &pNextBuffer); pCurrentBuffer = pNextBuffer; } /* * Identify EtherType. If the packet is not IP, simply allow * and don't bother the firewall. XXX should be done before. */ EtherType = *(unsigned short*)(payload + 12); EtherType = RtlUshortByteSwap(EtherType); if (EtherType != 0x0800) { //DbgPrint("ethertype = %X, skipping ipfw\n",EtherType); free(m, 0); return PASS; } /* * Now build a buffer descriptor to replace the original chain. */ pAdapt = Context; PacketPool = direction == OUTGOING ? pAdapt->SendPacketPoolHandle : pAdapt->RecvPacketPoolHandle; NdisAllocateBuffer(&Status, &pNdisBuffer, PacketPool, payload, m->m_pkthdr.len+14); if (Status != NDIS_STATUS_SUCCESS) goto drop_pkt; /* * Save the old buffer pointers, and put the new one * into the chain. */ pNdisBuffer->Next = NULL; old_head = NDIS_PACKET_FIRST_NDIS_BUFFER(pNdisPacket); old_tail = NDIS_PACKET_LAST_NDIS_BUFFER(pNdisPacket); NdisReinitializePacket(pNdisPacket); NdisChainBufferAtFront(pNdisPacket, pNdisBuffer); #if 0 if (direction == INCOMING) { DBGPRINT(("incoming: proto %u (%s), src %08X, dst %08X, sport %u, dport %u, len %u\n", *(payload+14+9), texify_proto(*(payload+14+9)), *(unsigned int*)(payload+14+12), *(unsigned int*)(payload+14+16), ntohs((*((unsigned short int*)(payload+14+20)))), ntohs((*((unsigned short int*)(payload+14+22)))), TotalPacketLength)); } else { DBGPRINT(("outgoing: proto %u (%s), src %08X, dst %08X, sport %u, dport %u, len %u\n", *(payload+14+9), texify_proto(*(payload+14+9)), *(unsigned int*)(payload+14+12), *(unsigned int*)(payload+14+16), ntohs((*((unsigned short int*)(payload+14+20)))), ntohs((*((unsigned short int*)(payload+14+22)))), TotalPacketLength)); } #endif if (direction == INCOMING) ret = ipfw_check_hook(NULL, &m, NULL, PFIL_IN, NULL); else ret = ipfw_check_hook(NULL, &m, (struct ifnet*)_if_out, PFIL_OUT, NULL); if (m != NULL) { /* Accept. Restore the old buffer chain, free * the mbuf and return PASS. */ //DBGPRINT(("accepted\n")); NdisReinitializePacket(pNdisPacket); NDIS_PACKET_FIRST_NDIS_BUFFER(pNdisPacket) = old_head; NDIS_PACKET_LAST_NDIS_BUFFER(pNdisPacket) = old_tail; NdisFreeBuffer(pNdisBuffer); m_freem(m); return PASS; } else if (ret == 0) { /* dummynet has kept the packet, will reinject later. */ //DBGPRINT(("kept by dummynet\n")); return DUMMYNET; } else { /* * Packet dropped by ipfw or dummynet. Nothing to do as * FREE_PKT already freed the fake mbuf */ //DBGPRINT(("dropped by dummynet, ret = %i\n", ret)); return DROP; } drop_pkt: /* for some reason we cannot proceed. Free any resources * including those received from above, and return * faking success. XXX this must be fixed later. */ NdisFreePacket(pNdisPacket); return DROP; } /* * Windows reinjection function. * The packet is already available as m->pkt, so we only * need to send it to the right place. * Normally a ndis intermediate driver allocates * a fresh descriptor, while the actual data's ownership is * retained by the protocol, or the miniport below. * Since an intermediate driver behaves as a miniport driver * at the upper edge (towards the protocol), and as a protocol * driver at the lower edge (towards the NIC), when we handle a * packet we have a reserved area in both directions (we can use * only one for each direction at our own discretion). * Normally this area is used to save a pointer to the original * packet, so when the driver is done with it, the original descriptor * can be retrieved, and the resources freed (packet descriptor, * buffer descriptor(s) and the actual data). In our driver this * area is used to mark the reinjected packets as 'orphan', because * the original descriptor is gone long ago. This way we can handle * correctly the resource freeing when the callback function * is called by NDIS. */ void netisr_dispatch(int num, struct mbuf *m) { unsigned char* payload = (unsigned char*)(m+1); PADAPT pAdapt = m->context; NDIS_STATUS Status; PNDIS_PACKET pPacket = m->pkt; PNDIS_BUFFER pNdisBuffer; NDIS_HANDLE PacketPool; if (num < 0) goto drop_pkt; //debug print #if 0 DbgPrint("reinject %s\n", m->direction == OUTGOING ? "outgoing" : "incoming"); #endif NdisAcquireSpinLock(&pAdapt->Lock); if (m->direction == OUTGOING) { //we must first check if the adapter is going down, // in this case abort the reinjection if (pAdapt->PTDeviceState > NdisDeviceStateD0) { pAdapt->OutstandingSends--; // XXX should we notify up ? NdisReleaseSpinLock(&pAdapt->Lock); goto drop_pkt; } } else { /* if the upper miniport edge is not initialized or * the miniport edge is in low power state, abort * XXX we should notify the error. */ if (!pAdapt->MiniportHandle || pAdapt->MPDeviceState > NdisDeviceStateD0) { NdisReleaseSpinLock(&pAdapt->Lock); goto drop_pkt; } } NdisReleaseSpinLock(&pAdapt->Lock); if (m->direction == OUTGOING) { PSEND_RSVD SendRsvd; /* use the 8-bytes protocol reserved area, the first * field is used to mark/the packet as 'orphan', the * second stores the pointer to the mbuf, so in the * the SendComplete handler we know that this is a * reinjected packet and can free correctly. */ SendRsvd = (PSEND_RSVD)(pPacket->ProtocolReserved); SendRsvd->OriginalPkt = NULL; SendRsvd->pMbuf = m; //do the actual send NdisSend(&Status, pAdapt->BindingHandle, pPacket); if (Status != NDIS_STATUS_PENDING) { /* done, call the callback now */ PtSendComplete(m->context, m->pkt, Status); } return; /* unconditional return here. */ } else { /* There's no need to check the 8-bytes miniport * reserved area since the path going up will be always * syncronous, and all the cleanup will be done inline. * If the reinjected packed comes from a PtReceivePacket, * there will be no callback. * Otherwise PtReceiveComplete will be called but will just * return since all the cleaning is alreqady done */ // do the actual receive. ULONG Proc = KeGetCurrentProcessorNumber(); pAdapt->ReceivedIndicationFlags[Proc] = TRUE; NdisMEthIndicateReceive(pAdapt->MiniportHandle, NULL, payload, 14, payload+14, m->m_len, m->m_len); NdisMEthIndicateReceiveComplete(pAdapt->MiniportHandle); pAdapt->ReceivedIndicationFlags[Proc] = FALSE; } drop_pkt: /* NDIS_PACKET exists and must be freed only if * the packet come from a PtReceivePacket, oherwise * m->pkt will ne null. */ if (m->pkt != NULL) { NdisUnchainBufferAtFront(m->pkt, &pNdisBuffer); NdisFreeBuffer(pNdisBuffer); NdisFreePacket(m->pkt); } m_freem(m); } void win_freem(void *); /* wrapper for m_freem() for protocol.c */ void win_freem(void *_m) { struct mbuf *m = _m; m_freem(m); } /* * not implemented in linux. * taken from /usr/src/lib/libc/string/strlcpy.c */ size_t strlcpy(char *dst, const char *src, size_t siz) { char *d = dst; const char *s = src; size_t n = siz; /* Copy as many bytes as will fit */ if (n != 0 && --n != 0) { do { if ((*d++ = *s++) == 0) break; } while (--n != 0); } /* Not enough room in dst, add NUL and traverse rest of src */ if (n == 0) { if (siz != 0) *d = '\0'; /* NUL-terminate dst */ while (*s++) ; } return(s - src - 1); /* count does not include NUL */ } void CleanupReinjected(PNDIS_PACKET Packet, struct mbuf* m, PADAPT pAdapt) { PNDIS_BUFFER pNdisBuffer; NdisQueryPacket(Packet, NULL, NULL, &pNdisBuffer, NULL); NdisUnchainBufferAtFront(Packet, &pNdisBuffer); NdisFreeBuffer(pNdisBuffer); win_freem(m); NdisFreePacket(Packet); ADAPT_DECR_PENDING_SENDS(pAdapt); } int ipfw2_qhandler_w32_oldstyle(int direction, NDIS_HANDLE ProtocolBindingContext, unsigned char* HeaderBuffer, unsigned int HeaderBufferSize, unsigned char* LookAheadBuffer, unsigned int LookAheadBufferSize, unsigned int PacketSize) { struct mbuf* m; unsigned char* payload = NULL; unsigned short EtherType = 0; int ret = 0; /* We are in a special case when NIC signals an incoming * packet using old style calls. This is done passing * a pointer to the MAC header and a pointer to the * rest of the packet. * We simply allocate space for the mbuf and the * subsequent payload section. */ m = malloc(sizeof(struct mbuf) + HeaderBufferSize + LookAheadBufferSize, 0, 0 ); if (m == NULL) //resource shortage, drop the packet return DROP; /* set mbuf fields to point past the MAC header. * Also set additional W32 info. * m->pkt here is set to null because the notification * from the NIC has come with a header+loolahead buffer, * no NDIS_PACKET has been provided. */ payload = (unsigned char*)(m + 1); m->m_len = m->m_pkthdr.len = HeaderBufferSize+LookAheadBufferSize-14; m->m_data = payload + 14; /* past the MAC header */ m->direction = direction; m->context = ProtocolBindingContext; m->pkt = NULL; /* * Now copy the data from the Windows buffers to the mbuf. */ bcopy(HeaderBuffer, payload, HeaderBufferSize); bcopy(LookAheadBuffer, payload+HeaderBufferSize, LookAheadBufferSize); //hexdump(payload,HeaderBufferSize+LookAheadBufferSize,"qhandler"); /* * Identify EtherType. If the packet is not IP, simply allow * and don't bother the firewall. XXX should be done before. */ EtherType = *(unsigned short*)(payload + 12); EtherType = RtlUshortByteSwap(EtherType); if (EtherType != 0x0800) { //DbgPrint("ethertype = %X, skipping ipfw\n",EtherType); free(m, 0); return PASS; } //DbgPrint("incoming_raw: proto %u (%s), src %08X, dst %08X, sport %u, dport %u, len %u\n", *(payload+14+9), texify_proto(*(payload+14+9)), *(unsigned int*)(payload+14+12), *(unsigned int*)(payload+14+16), ntohs((*((unsigned short int*)(payload+14+20)))), ntohs((*((unsigned short int*)(payload+14+22)))), HeaderBufferSize+LookAheadBufferSize); /* Query the firewall */ ret = ipfw_check_hook(NULL, &m, NULL, PFIL_IN, NULL); if (m != NULL) { /* Accept. Free the mbuf and return PASS. */ //DbgPrint("accepted\n"); m_freem(m); return PASS; } else if (ret == 0) { /* dummynet has kept the packet, will reinject later. */ //DbgPrint("kept by dummynet\n"); return DUMMYNET; } else { /* * Packet dropped by ipfw or dummynet. Nothing to do as * FREE_PKT already freed the fake mbuf */ //DbgPrint("dropped by dummynet, ret = %i\n", ret); return DROP; } } /* forward declaration because those functions are used only here, * no point to make them visible in passthru/protocol/miniport */ int do_ipfw_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len); int do_ipfw_get_ctl(struct sock *sk, int cmd, void __user *user, int *len); NTSTATUS DevIoControl( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp ) /*++ Routine Description: This is the dispatch routine for handling device ioctl requests. Arguments: pDeviceObject - Pointer to the device object. pIrp - Pointer to the request packet. Return Value: Status is returned. --*/ { PIO_STACK_LOCATION pIrpSp; NTSTATUS NtStatus = STATUS_SUCCESS; unsigned long BytesReturned = 0; unsigned long FunctionCode; unsigned long len; struct sockopt *sopt; int ret = 0; UNREFERENCED_PARAMETER(pDeviceObject); pIrpSp = IoGetCurrentIrpStackLocation(pIrp); /* * Using METHOD_BUFFERED as communication method, the userland * side calls DeviceIoControl passing an input buffer and an output * and their respective length (ipfw uses the same length for both). * The system creates a single I/O buffer, with len=max(inlen,outlen). * In the kernel we can read information from this buffer (which is * directly accessible), overwrite it with our results, and set * IoStatus.Information with the number of bytes that the system must * copy back to userland. * In our sockopt emulation, the initial part of the buffer contains * a struct sockopt, followed by the data area. */ len = pIrpSp->Parameters.DeviceIoControl.InputBufferLength; if (len < sizeof(struct sockopt)) { return STATUS_NOT_SUPPORTED; // XXX find better value } sopt = pIrp->AssociatedIrp.SystemBuffer; FunctionCode = pIrpSp->Parameters.DeviceIoControl.IoControlCode; len = sopt->sopt_valsize; switch (FunctionCode) { case IP_FW_SETSOCKOPT: ret = do_ipfw_set_ctl(NULL, sopt->sopt_name, sopt+1, len); break; case IP_FW_GETSOCKOPT: ret = do_ipfw_get_ctl(NULL, sopt->sopt_name, sopt+1, &len); sopt->sopt_valsize = len; //sanity check on len if (len + sizeof(struct sockopt) <= pIrpSp->Parameters.DeviceIoControl.InputBufferLength) BytesReturned = len + sizeof(struct sockopt); else BytesReturned = pIrpSp->Parameters.DeviceIoControl.InputBufferLength; break; default: NtStatus = STATUS_NOT_SUPPORTED; break; } pIrp->IoStatus.Information = BytesReturned; pIrp->IoStatus.Status = NtStatus; IoCompleteRequest(pIrp, IO_NO_INCREMENT); return NtStatus; } void dummynet(void * unused); void ipfw_tick(void * vnetx); VOID dummynet_dpc( __in struct _KDPC *Dpc, __in_opt PVOID DeferredContext, __in_opt PVOID SystemArgument1, __in_opt PVOID SystemArgument2 ) { dummynet(NULL); } VOID ipfw_dpc( __in struct _KDPC *Dpc, __in_opt PVOID DeferredContext, __in_opt PVOID SystemArgument1, __in_opt PVOID SystemArgument2 ) { ipfw_tick(DeferredContext); } ipfw3-2012/kipfw/sources000644 000423 000000 00000001736 12006744010 015455 0ustar00luigiwheel000000 000000 TARGETNAME=ipfw TARGETTYPE=DRIVER C_DEFINES=$(C_DEFINES) -DNDIS_MINIPORT_DRIVER -DNDIS_WDM=1 MSC_WARNING_LEVEL=/W2 # The driver is built in the XP or .NET build environment # So let us build NDIS 5.1 version. C_DEFINES=$(C_DEFINES) -DNDIS51_MINIPORT=1 C_DEFINES=$(C_DEFINES) -DNDIS51=1 # Enable dummynet preprocessing macros C_DEFINES=$(C_DEFINES) /D_WIN32 /DMODULENAME=Ipfw /D_BSD_SOURCE /DKERNEL_MODULE /D_KERNEL /DKLD_MODULE /D__BSD_VISIBLE /DIPFIREWALL_DEFAULT_TO_ACCEPT /D__LITTLE_ENDIAN /DSYSCTL_NODE /DEMULATE_SYSCTL -FIwinmissing.h -FImissing.h -FI../glue.h /DWIN32_LEAN_AND_MEAN=1 TARGETLIBS=$(DDK_LIB_PATH)\ndis.lib INCLUDES= include_e ; ../sys SOURCES= ip_fw2.c ip_fw_pfil.c ip_fw_sockopt.c ip_fw_dynamic.c ip_fw_table.c ip_fw_log.c radix.c in_cksum.c ip_dummynet.c ip_dn_io.c ip_dn_glue.c dn_heap.c dn_sched_fifo.c dn_sched_wf2q.c dn_sched_rr.c dn_sched_qfq.c dn_sched_prio.c ipfw2_mod.c bsd_compat.c md_win.c miniport.c protocol.c passthru.c debug.c ipfw3-2012/kipfw/mysetenv.sh000644 000423 000000 00000010047 12006744010 016250 0ustar00luigiwheel000000 000000 #!/bin/bash # bash script to set a suitable environment to call MSVC's build # to build a 64-bit version of the kernel. # # inspired by C:/winddk/7600.16385.1/bin/setenv.bat # see http://www.osronline.com/ddkx/ddtools/build_ref_0kqb.htm ############################################################# # edit theese variables to meet your configuration # # - DRIVE is the hard drive letter where DDK is installed # # - DDK is the path to the DDK's root directory # # - CYGDDK is the complete cygwin path to DDK # ############################################################# if [ $# -ne 3 ]; then echo "invalid params" && exit 1 fi DRIVE=$1 DDK=$2 CYGDDK=/cygdrive/c/${DDK} TARGETOS=$3 MYDIR=`pwd` # XXX luigi if [ "$TARGETOS" = "wnet" ]; then export DDK_TARGET_OS=WinNET export _NT_TARGET_VERSION=0x502 fi if [ "$TARGETOS" = "wlh" ]; then export DDK_TARGET_OS=WinLH export _NT_TARGET_VERSION=0x600 fi if [ "$TARGETOS" = "win7" ]; then export DDK_TARGET_OS=Win7 export _NT_TARGET_VERSION=0x601 fi ############################################################# # don't edit anything else below this point # ############################################################# D=${DRIVE}${DDK} DB=${D}/bin DI=${D}/inc DL=${D}/lib export AMD64=1 export ATL_INC_PATH=$DI # defaults to DDKROOT/inc export ATL_INC_ROOT=$DI # XXX redundant ? export ATL_LIB_PATH=${DL}/atl/* export BASEDIR=$D # default export BUFFER_OVERFLOW_CHECKS=1 export BUILD_ALLOW_COMPILER_WARNINGS=1 export BUILD_ALT_DIR=chk_${TARGETOS}_AMD64 export BUILD_DEFAULT="-ei -nmake -i -nosqm" # can go on the command line export BUILD_DEFAULT_TARGETS="-amd64" # can also go on the command line export BUILD_MAKE_PROGRAM=nmake.exe # default to nmake export BUILD_MULTIPROCESSOR=1 # parallel make, same as -M export BUILD_OPTIONS=" ~imca ~toastpkg" export COFFBASE_TXT_FILE=${DB}/coffbase.txt export CPU=AMD64 export CRT_INC_PATH=${DI}/crt # default export CRT_LIB_PATH=${DL}/crt/* # not default, it seems uses lib/{wnet,win7}/* export DDKBUILDENV=chk # checked or free export DDK_INC_PATH=${DI}/ddk export DDK_LIB_DEST=${DL}/${TARGETOS} export DDK_LIB_PATH=${DL}/${TARGETOS}/* export DEPRECATE_DDK_FUNCTIONS=1 export DRIVER_INC_PATH=${DI}/ddk export HALKIT_INC_PATH=${DI}/ddk export HALKIT_LIB_PATH=${DL}/${TARGETOS}/* export IFSKIT_INC_PATH=${DI}/ddk export IFSKIT_LIB_DEST=${DL}/${TARGETOS} export IFSKIT_LIB_PATH=${DL}/${TARGETOS}/* export Include=${DI}/api export KMDF_INC_PATH=${DI}/wdf/kmdf export KMDF_LIB_PATH=${DL}/wdf/kmdf/* export LANGUAGE_NEUTRAL=0 export Lib=${DL} export LINK_LIB_IGNORE=4198 export MFC_INC_PATH=${DI}/mfc42 export MFC_LIB_PATH=${DL}/mfc/* export MSC_OPTIMIZATION="/Od /Oi" export NEW_CRTS=1 export NO_BINPLACE=TRUE export NO_BROWSER_FILE=TRUE export NTDBGFILES=1 export NTDEBUG=ntsd export NTDEBUGTYPE=both # need NTMAKEENV to point to the binary dir export NTMAKEENV=${DB} export OAK_INC_PATH=${DI}/api export PATH="${CYGDDK}/bin/amd64:${CYGDDK}/tools/sdv/bin:${CYGDDK}/tools/pfd/bin/bin/x86_AMD64\ :${CYGDDK}/bin/SelfSign:${CYGDDK}/bin/x86/amd64:${CYGDDK}/bin/x86\ :${CYGDDK}/tools/pfd/bin/bin/AMD64:${CYGDDK}/tools/tracing/amd64:$PATH" export PATHEXT=".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC" export PROJECT_ROOT=${D}/src export PUBLIC_ROOT=${D} export RAZZLETOOLPATH=${DB} export RCNOFONTMAP=1 export SDK_INC_PATH=${DI}/api export SDK_LIB_DEST=${DL}/${TARGETOS} export SDK_LIB_PATH=${DL}/${TARGETOS}/* export SDV=${D}/tools/sdv export separate_object_root=FALSE export TEMP=tmpbuild export TMP=tmpbuild export UMDF_INC_PATH=${DI}/wdf/umdf export USE_OBJECT_ROOT=1 export WDM_INC_PATH=${DI}/ddk export WPP_CONFIG_PATH=${DB}/wppconfig export _AMD64bit=true export _BUILDARCH=AMD64 export _BuildType=chk export _NTDRIVE=${DRIVE} export _NTROOT=${DDK} # # --- XXX note, it spams C:/winddk/7600.16385.1/build.dat # -c: delete objs, -e: generare build.* logfiles, -f rescan sources, -g color errors unset MAKEFLAGS echo "emv ${MAKE} flags ${MAKEFLAGS}" cd kipfw-mod && build -cefg echo "done" #cp objchk_${TARGETOS}_amd64/amd64/ipfw.sys ../binary/ipfw.sys ipfw3-2012/glue.h000644 000423 000000 00000042467 12010150105 014031 0ustar00luigiwheel000000 000000 /* * Copyright (c) 2009 Luigi Rizzo, Marta Carbone, Universita` di Pisa * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: glue.h 11660 2012-08-07 08:44:44Z luigi $ * * glue code to adapt the FreeBSD version to linux and windows, * userland and kernel. * This is included before any other headers, so we do not have * a chance to override any #define that should appear in other * headers. * First handle headers for userland and kernel. Then common code * (including headers that require a specific order of inclusion), * then the user- and kernel- specific parts. */ #if defined __FreeBSD__ #define _GLUE_H #endif /* __FreeBSD__ */ #ifndef _GLUE_H #define _GLUE_H /* * common definitions to allow portability */ #ifndef __FBSDID #define __FBSDID(x) #endif /* FBSDID */ #ifndef KERNEL_MODULE /* Userland headers */ #if defined(__CYGWIN32__) && !defined(_WIN32) #define _WIN32 #endif #if defined(TCC) && defined(_WIN32) #include #endif /* TCC */ #include /* linux needs it in addition to sys/types.h */ #include /* for size_t */ #include #include #include #ifdef __linux__ #include /* linux only 20111031 */ #endif #else /* KERNEL_MODULE, kernel headers */ #define INET # want inet support #ifdef __linux__ #include #define ifnet net_device /* remap */ #define _KERNEL # make kernel structure visible #define KLD_MODULE # add the module glue #include /* linux kernel */ #include /* linux kernel */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17) // or 2.4.x #include /* linux/msg.h require this */ #include /* just MAX_ADDR_LEN 8 on 2.4 32 on 2.6, also brings in byteorder */ #endif /* on 2.6.22, msg.h requires spinlock_types.h */ /* XXX spinlock_type.h was introduced in 2.6.14 */ #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13) && \ LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23) #include #endif /* XXX m_type define conflict with include/sys/mbuf.h, * so early include msg.h (to be solved) */ #include #include #include /* struct in_addr */ #include /* struct in6_addr */ #include /* * LIST_HEAD in queue.h conflict with linux/list.h * some previous linux include need list.h definition */ #undef LIST_HEAD #define IF_NAMESIZE (16) typedef uint32_t in_addr_t; #define printf(fmt, arg...) printk(KERN_ERR fmt, ##arg) #endif /* __linux__ */ #endif /* KERNEL_MODULE end of kernel headers */ /* * Part 2: common userland and kernel definitions */ #ifndef ETHER_ADDR_LEN #define ETHER_ADDR_LEN (6+0) /* length of an Ethernet address */ #endif #define ICMP6_DST_UNREACH_NOROUTE 0 /* no route to destination */ #define ICMP6_DST_UNREACH_ADMIN 1 /* administratively prohibited */ #define ICMP6_DST_UNREACH_ADDR 3 /* address unreachable */ #define ICMP6_DST_UNREACH_NOPORT 4 /* port unreachable */ /* * linux: sysctl are mapped into /sys/module/ipfw_mod parameters * windows: they are emulated via get/setsockopt */ #define CTLFLAG_RD 1 #define CTLFLAG_RDTUN 1 #define CTLFLAG_RW 2 #define CTLFLAG_SECURE3 0 // unsupported #define CTLFLAG_VNET 0 /* unsupported */ /* if needed, queue.h must be included here after list.h */ /* * struct thread is used in linux and windows kernel. * In windows, we need to emulate the sockopt interface * so also the userland needs to have the struct sockopt defined. * In order to achieve 64 bit compatibility, padding has been inserted. */ struct thread { void *sopt_td; void *td_ucred; }; enum sopt_dir { SOPT_GET, SOPT_SET }; struct sockopt { enum sopt_dir sopt_dir; /* is this a get or a set? */ int sopt_level; /* second arg of [gs]etsockopt */ int sopt_name; /* third arg of [gs]etsockopt */ #ifdef _X64EMU void* pad1; void* pad2; #endif void *sopt_val; /* fourth arg of [gs]etsockopt */ size_t sopt_valsize; /* (almost) fifth arg of [gs]etsockopt */ #ifdef _X64EMU void* pad3; void* pad4; #endif struct thread *sopt_td; /* calling thread or null if kernel */ }; #define INET_ADDRSTRLEN (16) /* missing in netinet/in.h */ /* * List of values used for set/getsockopt options. * The base value on FreeBSD is defined as a macro, * if not available we will use our own enum. * The TABLE_BASE value is used in the kernel. */ #ifndef IP_FW_TABLE_ADD #define _IPFW_SOCKOPT_BASE 100 /* 40 on freebsd */ enum ipfw_msg_type { IP_FW_TABLE_ADD = _IPFW_SOCKOPT_BASE, IP_FW_TABLE_DEL, IP_FW_TABLE_FLUSH, IP_FW_TABLE_GETSIZE, IP_FW_TABLE_LIST, IP_FW_DYN_GET, /* new addition */ /* IP_FW3 and IP_DUMMYNET3 are the new API */ IP_FW3 = _IPFW_SOCKOPT_BASE + 8, IP_DUMMYNET3, IP_FW_ADD = _IPFW_SOCKOPT_BASE + 10, IP_FW_DEL, IP_FW_FLUSH, IP_FW_ZERO, IP_FW_GET, IP_FW_RESETLOG, IP_FW_NAT_CFG, IP_FW_NAT_DEL, IP_FW_NAT_GET_CONFIG, IP_FW_NAT_GET_LOG, IP_DUMMYNET_CONFIGURE, IP_DUMMYNET_DEL , IP_DUMMYNET_FLUSH, /* 63 is missing */ IP_DUMMYNET_GET = _IPFW_SOCKOPT_BASE + 24, _IPFW_SOCKOPT_END }; #endif /* IP_FW_TABLE_ADD */ /* * Part 3: userland stuff */ #ifndef KERNEL_MODULE /* * internal names in struct in6_addr (netinet/in6.h) differ, * so we remap the FreeBSD names to the platform-specific ones. */ #ifndef _WIN32 #define __u6_addr in6_u #define __u6_addr32 u6_addr32 #define in6_u __in6_u /* missing type for ipv6 (linux 2.6.28) */ #else /* _WIN32 uses different naming */ #define __u6_addr __u6 #define __u6_addr32 __s6_addr32 #endif /* _WIN32 */ /* missing in linux netinet/ip.h */ #define IPTOS_ECN_ECT0 0x02 /* ECN-capable transport (0) */ #define IPTOS_ECN_CE 0x03 /* congestion experienced */ /* defined in freebsd netinet/icmp6.h */ #define ICMP6_MAXTYPE 201 /* on freebsd sys/socket.h pf specific */ #define NET_RT_IFLIST 3 /* survey interface list */ #if defined(__linux__) || defined(__CYGWIN32__) /* on freebsd net/if.h XXX used */ struct if_data { /* ... */ u_long ifi_mtu; /* maximum transmission unit */ }; /* * Message format for use in obtaining information about interfaces * from getkerninfo and the routing socket. * This is used in nat.c */ struct if_msghdr { u_short ifm_msglen; /* to skip over unknown messages */ u_char ifm_version; /* future binary compatibility */ u_char ifm_type; /* message type */ int ifm_addrs; /* like rtm_addrs */ int ifm_flags; /* value of if_flags */ u_short ifm_index; /* index for associated ifp */ struct if_data ifm_data;/* stats and other ifdata */ }; /* * Message format for use in obtaining information about interface * addresses from getkerninfo and the routing socket */ struct ifa_msghdr { u_short ifam_msglen; /* to skip over unknown messages */ u_char ifam_version; /* future binary compatibility */ u_char ifam_type; /* message type */ int ifam_addrs; /* like rtm_addrs */ int ifam_flags; /* value of ifa_flags */ u_short ifam_index; /* index for associated ifp */ int ifam_metric; /* value of ifa_metric */ }; #ifndef NO_RTM /* conflicting with netlink */ /* missing in net/route.h */ #define RTM_VERSION 5 /* Up the ante and ignore older versions */ #define RTM_IFINFO 0xe /* iface going up/down etc. */ #define RTM_NEWADDR 0xc /* address being added to iface */ #define RTA_IFA 0x20 /* interface addr sockaddr present */ #endif /* NO_RTM */ /* SA_SIZE is used in the userland nat.c modified */ #define SA_SIZE(sa) \ ( (!(sa) ) ? \ sizeof(long) : \ 1 + ( (sizeof(struct sockaddr) - 1) | (sizeof(long) - 1) ) ) /* sys/time.h */ /* * Getkerninfo clock information structure */ struct clockinfo { int hz; /* clock frequency */ int tick; /* micro-seconds per hz tick */ int spare; int stathz; /* statistics clock frequency */ int profhz; /* profiling clock frequency */ }; /* no sin_len in sockaddr, we only remap in userland */ #define sin_len sin_zero[0] #endif /* Linux/Win */ /* * linux does not have a reentrant version of qsort, * so we the FreeBSD stdlib version. */ void qsort_r(void *a, size_t n, size_t es, void *thunk, int cmp_t(void *, const void *, const void *)); /* prototypes from libutil */ /* humanize_number(3) */ #define HN_DECIMAL 0x01 #define HN_NOSPACE 0x02 #define HN_B 0x04 #define HN_DIVISOR_1000 0x08 #define HN_GETSCALE 0x10 #define HN_AUTOSCALE 0x20 int humanize_number(char *_buf, size_t _len, int64_t _number, const char *_suffix, int _scale, int _flags); int expand_number(const char *_buf, int64_t *_num); #define setprogname(x) /* not present in linux */ extern int optreset; /* not present in linux */ size_t strlcpy(char * dst, const char * src, size_t siz); long long int strtonum(const char *nptr, long long minval, long long maxval, const char **errstr); int sysctlbyname(const char *name, void *oldp, size_t *oldlenp, void *newp, size_t newlen); #else /* KERNEL_MODULE */ /* * Part 4: kernel stuff */ /* linux and windows kernel do not have bcopy ? */ #define bcopy(_s, _d, _l) memcpy(_d, _s, _l) /* definitions useful for the kernel side */ struct route_in6 { int dummy; }; #ifdef __linux__ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17) // or 2.4.x #include #endif /* skb_dst() and skb_dst_set() was introduced from linux 2.6.31 */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31) void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst); struct dst_entry *skb_dst(const struct sk_buff *skb); #endif /* The struct flowi changed */ #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,38) // check boundaries #define flow_daddr fl.u.ip4 #else #define flow_daddr fl.nl_u.ip4_u #endif #endif /* __linux__ */ /* * Do not load prio_heap.h header because of conflicting names * with our heap functions defined in include/netinet/ipfw/dn_heap.h */ #define _LINUX_PRIO_HEAP_H /* * The following define prevent the ipv6.h header to be loaded. * Starting from the 2.6.38 kernel the ipv6.h file, which is included * by include/net/inetpeer.h in turn included by net/route.h * include the system tcp.h file while we want to include * our include/net/tcp.h instead. */ #ifndef _NET_IPV6_H #define _NET_IPV6_H static inline void ipv6_addr_copy(struct in6_addr *a1, const struct in6_addr *a2) { memcpy(a1, a2, sizeof(struct in6_addr)); } #endif /* _NET_IPV6_H */ #endif /* KERNEL_MODULE */ /* * Part 5: windows specific stuff */ #ifdef _WIN32 #ifndef KERNEL_MODULE #define CTL_CODE( DeviceType, Function, Method, Access ) ( \ ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \ ) #define METHOD_BUFFERED 0 #define METHOD_IN_DIRECT 1 #define METHOD_OUT_DIRECT 2 #define METHOD_NEITHER 3 #define FILE_ANY_ACCESS 0 #define FILE_READ_DATA ( 0x0001 ) // file & pipe #define FILE_WRITE_DATA ( 0x0002 ) // file & pipe #endif /* !KERNEL_MODULE */ #define FILE_DEVICE_IPFW 0x00654324 #define IP_FW_BASE_CTL 0x840 #define IP_FW_SETSOCKOPT \ CTL_CODE(FILE_DEVICE_IPFW, IP_FW_BASE_CTL + 1, METHOD_BUFFERED, FILE_WRITE_DATA) #define IP_FW_GETSOCKOPT \ CTL_CODE(FILE_DEVICE_IPFW, IP_FW_BASE_CTL + 2, METHOD_BUFFERED, FILE_ANY_ACCESS) /********************************* * missing declarations in altq.c * **********************************/ #define _IOWR(x,y,t) _IOW(x,y,t) /********************************** * missing declarations in ipfw2.c * ***********************************/ #define ICMP_UNREACH_NET 0 /* bad net */ #define ICMP_UNREACH_HOST 1 /* bad host */ #define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */ #define ICMP_UNREACH_PORT 3 /* bad port */ #define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */ #define ICMP_UNREACH_SRCFAIL 5 /* src route failed */ #define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */ #define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */ #define ICMP_UNREACH_ISOLATED 8 /* src host isolated */ #define ICMP_UNREACH_NET_PROHIB 9 /* prohibited access */ #define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */ #define ICMP_UNREACH_TOSNET 11 /* bad tos for net */ #define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */ #define ICMP_UNREACH_FILTER_PROHIB 13 /* admin prohib */ #define ICMP_UNREACH_HOST_PRECEDENCE 14 /* host prec vio. */ #define ICMP_UNREACH_PRECEDENCE_CUTOFF 15 /* prec cutoff */ struct ether_addr; struct ether_addr * ether_aton(const char *a); /********************************* * missing declarations in ipv6.c * **********************************/ struct hostent* gethostbyname2(const char *name, int af); /******************** * windows wrappings * *********************/ int my_socket(int domain, int ty, int proto); #define socket(_a, _b, _c) my_socket(_a, _b, _c) #endif /* _WIN32 */ /******************* * SYSCTL emulation * ********************/ #if defined (_WIN32) || defined (EMULATE_SYSCTL) #define STRINGIFY(x) #x /* flag is set with the last 2 bits for access, as defined in glue.h * and the rest for type */ enum { SYSCTLTYPE_INT = 0, SYSCTLTYPE_UINT, SYSCTLTYPE_SHORT, SYSCTLTYPE_USHORT, SYSCTLTYPE_LONG, SYSCTLTYPE_ULONG, SYSCTLTYPE_STRING, }; struct sysctlhead { uint32_t blocklen; //total size of the entry uint32_t namelen; //strlen(name) + '\0' uint32_t flags; //type and access uint32_t datalen; }; #ifdef _KERNEL #ifdef SYSCTL_NODE #undef SYSCTL_NODE #endif #define SYSCTL_NODE(a,b,c,d,e,f) #define SYSCTL_DECL(a) #define SYSCTL_VNET_PROC(a,b,c,d,e,f,g,h,i) #define GST_HARD_LIMIT 100 /* In the module, GST is implemented as an array of * sysctlentry, but while passing data to the userland * pointers are useless, the buffer is actually made of: * - sysctlhead (fixed size, containing lengths) * - data (typically 32 bit) * - name (zero-terminated and padded to mod4) */ struct sysctlentry { struct sysctlhead head; char* name; void* data; }; struct sysctltable { int count; //number of valid tables int totalsize; //total size of valid entries of al the valid tables void* namebuffer; //a buffer for all chained names struct sysctlentry entry[GST_HARD_LIMIT]; }; #ifdef SYSBEGIN #undef SYSBEGIN #endif #define SYSBEGIN(x) void sysctl_addgroup_##x() { #ifdef SYSEND #undef SYSEND #endif #define SYSEND } /* XXX remove duplication */ #define SYSCTL_INT(a,b,c,d,e,f,g) \ sysctl_pushback(STRINGIFY(a) "." STRINGIFY(c) + 1, \ (d) | (SYSCTLTYPE_INT << 2), sizeof(*e), e) #define SYSCTL_VNET_INT(a,b,c,d,e,f,g) \ sysctl_pushback(STRINGIFY(a) "." STRINGIFY(c) + 1, \ (d) | (SYSCTLTYPE_INT << 2), sizeof(*e), e) #define SYSCTL_UINT(a,b,c,d,e,f,g) \ sysctl_pushback(STRINGIFY(a) "." STRINGIFY(c) + 1, \ (d) | (SYSCTLTYPE_UINT << 2), sizeof(*e), e) #define SYSCTL_VNET_UINT(a,b,c,d,e,f,g) \ sysctl_pushback(STRINGIFY(a) "." STRINGIFY(c) + 1, \ (d) | (SYSCTLTYPE_UINT << 2), sizeof(*e), e) #define SYSCTL_LONG(a,b,c,d,e,f,g) \ sysctl_pushback(STRINGIFY(a) "." STRINGIFY(c) + 1, \ (d) | (SYSCTLTYPE_LONG << 2), sizeof(*e), e) #define SYSCTL_ULONG(a,b,c,d,e,f,g) \ sysctl_pushback(STRINGIFY(a) "." STRINGIFY(c) + 1, \ (d) | (SYSCTLTYPE_ULONG << 2), sizeof(*e), e) #define TUNABLE_INT(a,b) void keinit_GST(void); void keexit_GST(void); int kesysctl_emu_set(void* p, int l); int kesysctl_emu_get(struct sockopt* sopt); void sysctl_pushback(char* name, int flags, int datalen, void* data); #endif /* _KERNEL */ int sysctlbyname(const char *name, void *oldp, size_t *oldlenp, void *newp, size_t newlen); #endif /* _WIN32" || EMULATE_SYSCTL */ #ifdef _WIN32 int do_cmd(int optname, void *optval, uintptr_t optlen); #endif /* _WIN32 */ #define __PAST_END(v, idx) v[idx] #endif /* !_GLUE_H */ ipfw3-2012/tcc_glue.h000644 000423 000000 00000015745 12006744011 014673 0ustar00luigiwheel000000 000000 /* * Copyright (c) 2010 Luigi Rizzo, Universita` di Pisa * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * headers to build userland ipfw under tcc. */ #ifndef _TCC_GLUE_H #define _TCC_GLUE_H //#define __restrict #define NULL ((void *)0) typedef int size_t; typedef unsigned char u_char; typedef unsigned char uint8_t; typedef unsigned char u_int8_t; typedef unsigned short u_short; typedef unsigned short uint16_t; typedef unsigned short u_int16_t; typedef int __int32_t; typedef int int32_t; typedef int socklen_t; typedef int pid_t; typedef unsigned int time_t; typedef unsigned int uint; typedef unsigned int u_int; typedef unsigned int uint32_t; typedef unsigned int u_int32_t; typedef unsigned int gid_t; typedef unsigned int uid_t; typedef unsigned long u_long; typedef unsigned long uintptr_t; typedef long long int int64_t; typedef unsigned long long int uint64_t; typedef unsigned long long int u_int64_t; typedef uint32_t in_addr_t; struct in_addr { uint32_t s_addr; }; struct sockaddr_in { uint8_t _sin_len; uint8_t sin_family; uint16_t sin_port; struct in_addr sin_addr; char sin_zero[8]; }; #define IFNAMSIZ 16 #define INET6_ADDRSTRLEN 64 struct in6_addr { union { uint8_t __s6_addr8[16]; uint16_t __s6_addr16[8]; uint32_t __s6_addr32[4]; } __u6; // _addr; /* 128-bit IP6 address */ }; #define LITTLE_ENDIAN 1234 #define BYTE_ORDER LITTLE_ENDIAN /* to be revised */ #define EX_OK 0 #define EX_DATAERR 1 #define EX_OSERR 2 #define EX_UNAVAILABLE 3 #define EX_USAGE 4 #define EX_NOHOST 5 #define EEXIST 1 #define EINVAL 2 #define ERANGE 3 #define ESRCH 4 #define IPPROTO_IP 1 #define IPPROTO_IPV6 2 #define IPPROTO_RAW 100 #define IPTOS_LOWDELAY 100 #define IPTOS_MINCOST 101 #define IPTOS_RELIABILITY 102 #define IPTOS_THROUGHPUT 103 #define SOCK_RAW 12 #define AF_INET 2 #define AF_INET6 28 #define INADDR_ANY 0 #define bcmp(src, dst, len) memcmp(src, dst, len) #define bcopy(src, dst, len) memcpy(dst, src, len) #define bzero(p, len) memset(p, 0, len) #define index(s, c) strchr(s, c) char *strsep(char **stringp, const char *delim); void warn(const char *, ...); //void warnx(const char *, ...); #define warnx warn void err(int, const char *, ...); #define errx err uint16_t htons(uint16_t)__attribute__ ((stdcall)); uint16_t ntohs(uint16_t)__attribute__ ((stdcall)); uint32_t htonl(uint32_t)__attribute__ ((stdcall)); uint32_t ntohl(uint32_t)__attribute__ ((stdcall)); int inet_aton(const char *cp, struct in_addr *pin)__attribute__ ((stdcall));; char * inet_ntoa(struct in_addr)__attribute__ ((stdcall));; const char * inet_ntop(int af, const void * src, char * dst, socklen_t size)__attribute__ ((stdcall));; int inet_pton(int af, const char * src, void * dst)__attribute__ ((stdcall));; struct group { gid_t gr_gid; char gr_name[16]; }; struct passwd { uid_t pw_uid; char pw_name[16]; }; #define getpwnam(s) (NULL) #define getpwuid(s) (NULL) #define getgrnam(x) (NULL) #define getgrgid(x) (NULL) int getopt(int argc, char * const argv[], const char *optstring); int getsockopt(int s, int level, int optname, void * optval, socklen_t * optlen); int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen); struct protoent { char *p_name; /* official protocol name */ char **p_aliases; /* alias list */ short p_proto; /* protocol # */ }; struct servent { char *s_name; /* official service name */ char **s_aliases; /* alias list */ short s_port; /* port # */ char *s_proto; /* protocol to use */ }; struct hostent { char *h_name; /* official name of host */ char **h_aliases; /* alias list */ short h_addrtype; /* host address type */ short h_length; /* length of address */ char **h_addr_list; /* list of addresses */ #define h_addr h_addr_list[0] /* address, for backward compat */ }; struct hostent* gethostbyaddr(const char* addr, int len, int type)__attribute__ ((stdcall)); struct hostent* gethostbyname(const char *name)__attribute__ ((stdcall)); struct protoent* getprotobynumber(int number)__attribute__ ((stdcall)); struct protoent* getprotobyname(const char* name)__attribute__ ((stdcall)); struct servent* getservbyport(int port, const char* proto)__attribute__ ((stdcall)); struct servent* getservbyname(const char* name, const char* proto) __attribute__ ((stdcall)); extern int optind; extern char *optarg; #include #define WSADESCRIPTION_LEN 256 #define WSASYS_STATUS_LEN 128 typedef struct WSAData { WORD wVersion; WORD wHighVersion; char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; } WSADATA, * LPWSADATA; int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData ); int WSACleanup(void); int WSAGetLastError(); /* return error on process handling */ #define pipe(f) (-1) #define kill(p, s) (-1) #define waitpid(w,s,o) (-1) #define fork(x) (-1) #define execvp(f, a) (-1) #define _W_INT(i) (i) #define _WSTATUS(x) (_W_INT(x) & 0177) #define WIFEXITED(x) (_WSTATUS(x) == 0) #define WEXITSTATUS(x) (_W_INT(x) >> 8) #define _WSTOPPED 0177 /* _WSTATUS if process is stopped */ #define WIFSIGNALED(x) (_WSTATUS(x) != _WSTOPPED && _WSTATUS(x) != 0) #define WTERMSIG(x) (_WSTATUS(x)) #endif /* _TCC_GLUE_H */ ipfw3-2012/sys/000755 000423 000000 00000000000 12006744011 013537 5ustar00luigiwheel000000 000000 ipfw3-2012/sys/net/000755 000423 000000 00000000000 12010150105 014313 5ustar00luigiwheel000000 000000 ipfw3-2012/sys/netinet/000755 000423 000000 00000000000 12010150105 015173 5ustar00luigiwheel000000 000000 ipfw3-2012/sys/netgraph/000755 000423 000000 00000000000 12006744011 015347 5ustar00luigiwheel000000 000000 ipfw3-2012/sys/sys/000755 000423 000000 00000000000 12006744011 014355 5ustar00luigiwheel000000 000000 ipfw3-2012/sys/sys/mbuf.h000644 000423 000000 00000016130 12006744011 015460 0ustar00luigiwheel000000 000000 /* * Copyright (C) 2009 Luigi Rizzo, Universita` di Pisa * * BSD copyright. * * A simple compatibility interface to map mbufs onto sk_buff */ #ifndef _SYS_MBUF_H_ #define _SYS_MBUF_H_ #include /* we use free() */ /* hopefully queue.h is already included by someone else */ #include #ifdef _KERNEL /* bzero not present on linux, but this should go in glue.h */ // #define bzero(s, n) memset(s, 0, n) /* * We implement a very simplified UMA allocator where the backend * is simply malloc, and uma_zone only stores the length of the components. */ typedef int uma_zone_t; /* the zone size */ #define uma_zcreate(name, len, _3, _4, _5, _6, _7, _8) (len) #define uma_zfree(zone, item) free(item, M_IPFW) #define uma_zalloc(zone, flags) malloc(zone, M_IPFW, flags) #define uma_zdestroy(zone) do {} while (0) /*- * Macros for type conversion: * mtod(m, t) -- Convert mbuf pointer to data pointer of correct type. */ #define mtod(m, t) ((t)((m)->m_data)) #endif /* _KERNEL */ /* * Packet tag structure (see below for details). */ struct m_tag { SLIST_ENTRY(m_tag) m_tag_link; /* List of packet tags */ u_int16_t m_tag_id; /* Tag ID */ u_int16_t m_tag_len; /* Length of data */ u_int32_t m_tag_cookie; /* ABI/Module ID */ void (*m_tag_free)(struct m_tag *); }; #if defined(__linux__) || defined( _WIN32 ) /* * Auxiliary structure to store values from the sk_buf. * Note that we should not alter the sk_buff, and if we do * so make sure to keep the values in sync between the mbuf * and the sk_buff (especially m_len and m_pkthdr.len). */ struct mbuf { struct mbuf *m_next; struct mbuf *m_nextpkt; char *m_data; // XXX was void * int m_len; /* length in this mbuf */ int m_flags; #ifdef __linux__ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) struct nf_info *queue_entry; #else struct nf_queue_entry *queue_entry; #endif #else /* _WIN32 */ int direction; /* could go in rcvif */ NDIS_HANDLE context; /* replaces queue_entry or skb ?*/ PNDIS_PACKET pkt; #endif struct sk_buff *m_skb; struct { #ifdef __linux__ struct net_device *rcvif; #else struct ifnet *rcvif; #endif int len; /* total packet len */ SLIST_HEAD (packet_tags, m_tag) tags; } m_pkthdr; }; #define M_SKIP_FIREWALL 0x01 /* skip firewall processing */ #define M_BCAST 0x02 /* send/received as link-level broadcast */ #define M_MCAST 0x04 /* send/received as link-level multicast */ #define M_DONTWAIT M_NOWAIT /* should not be here... */ /* * m_dup() is used in the TEE case, currently unsupported so we * just return. */ static __inline struct mbuf *m_dup(struct mbuf *m, int n) { (void)m; (void)n; return NULL; }; #define MTAG_ABI_COMPAT 0 /* compatibility ABI */ static __inline struct m_tag * m_tag_find(struct mbuf *m, int type, struct m_tag *start) { (void)m; (void)type; (void)start; return NULL; }; static __inline void m_tag_prepend(struct mbuf *m, struct m_tag *t) { SLIST_INSERT_HEAD(&m->m_pkthdr.tags, t, m_tag_link); } /* * Return the next tag in the list of tags associated with an mbuf. */ static __inline struct m_tag * m_tag_next(struct mbuf *m, struct m_tag *t) { return (SLIST_NEXT(t, m_tag_link)); } /* * Create an mtag of the given type */ static __inline struct m_tag * m_tag_alloc(uint32_t cookie, int type, int length, int wait) { int l = length + sizeof(struct m_tag); struct m_tag *m = malloc(l, 0, M_NOWAIT); if (m) { memset(m, 0, l); m->m_tag_id = type; m->m_tag_len = length; m->m_tag_cookie = cookie; } return m; }; static __inline struct m_tag * m_tag_get(int type, int length, int wait) { return m_tag_alloc(MTAG_ABI_COMPAT, type, length, wait); } static __inline struct m_tag * m_tag_first(struct mbuf *m) { return SLIST_FIRST(&m->m_pkthdr.tags); }; static __inline void m_tag_delete(struct mbuf *m, struct m_tag *t) { }; static __inline struct m_tag * m_tag_locate(struct mbuf *m, u_int32_t n, int x, struct m_tag *t) { struct m_tag *tag; tag = m_tag_first(m); if (tag == NULL) return NULL; if (tag->m_tag_cookie != n || tag->m_tag_id != x) return NULL; else return tag; }; #define M_SETFIB(_m, _fib) /* nothing on linux */ static __inline void m_freem(struct mbuf *m) { struct m_tag *t; /* free the m_tag chain */ while ( (t = SLIST_FIRST(&m->m_pkthdr.tags) ) ) { SLIST_REMOVE_HEAD(&m->m_pkthdr.tags, m_tag_link); free(t, 0); } /* free the mbuf */ free(m, M_IPFW); }; /* m_pullup is not supported, there is a macro in missing.h */ #define M_GETFIB(_m) 0 /* macro used to create a new mbuf */ #define MT_DATA 1 /* dynamic (data) allocation */ #define MSIZE 256 /* size of an mbuf */ #define MGETHDR(_m, _how, _type) ((_m) = m_gethdr((_how), (_type))) /* allocate and init a new mbuf using the same structure of FreeBSD */ static __inline struct mbuf * m_gethdr(int how, short type) { struct mbuf *m; m = malloc(MSIZE, M_IPFW, M_NOWAIT); if (m == NULL) { return m; } /* here we have MSIZE - sizeof(struct mbuf) available */ m->m_data = (char *)(m + 1); return m; } #endif /* __linux__ || _WIN32 */ /* * Persistent tags stay with an mbuf until the mbuf is reclaimed. Otherwise * tags are expected to ``vanish'' when they pass through a network * interface. For most interfaces this happens normally as the tags are * reclaimed when the mbuf is free'd. However in some special cases * reclaiming must be done manually. An example is packets that pass through * the loopback interface. Also, one must be careful to do this when * ``turning around'' packets (e.g., icmp_reflect). * * To mark a tag persistent bit-or this flag in when defining the tag id. * The tag will then be treated as described above. */ #define MTAG_PERSISTENT 0x800 #define PACKET_TAG_NONE 0 /* Nadda */ /* Packet tags for use with PACKET_ABI_COMPAT. */ #define PACKET_TAG_IPSEC_IN_DONE 1 /* IPsec applied, in */ #define PACKET_TAG_IPSEC_OUT_DONE 2 /* IPsec applied, out */ #define PACKET_TAG_IPSEC_IN_CRYPTO_DONE 3 /* NIC IPsec crypto done */ #define PACKET_TAG_IPSEC_OUT_CRYPTO_NEEDED 4 /* NIC IPsec crypto req'ed */ #define PACKET_TAG_IPSEC_IN_COULD_DO_CRYPTO 5 /* NIC notifies IPsec */ #define PACKET_TAG_IPSEC_PENDING_TDB 6 /* Reminder to do IPsec */ #define PACKET_TAG_BRIDGE 7 /* Bridge processing done */ #define PACKET_TAG_GIF 8 /* GIF processing done */ #define PACKET_TAG_GRE 9 /* GRE processing done */ #define PACKET_TAG_IN_PACKET_CHECKSUM 10 /* NIC checksumming done */ #define PACKET_TAG_ENCAP 11 /* Encap. processing */ #define PACKET_TAG_IPSEC_SOCKET 12 /* IPSEC socket ref */ #define PACKET_TAG_IPSEC_HISTORY 13 /* IPSEC history */ #define PACKET_TAG_IPV6_INPUT 14 /* IPV6 input processing */ #define PACKET_TAG_DUMMYNET 15 /* dummynet info */ #define PACKET_TAG_DIVERT 17 /* divert info */ #define PACKET_TAG_IPFORWARD 18 /* ipforward info */ #define PACKET_TAG_MACLABEL (19 | MTAG_PERSISTENT) /* MAC label */ #define PACKET_TAG_PF 21 /* PF + ALTQ information */ #define PACKET_TAG_RTSOCKFAM 25 /* rtsock sa family */ #define PACKET_TAG_IPOPTIONS 27 /* Saved IP options */ #define PACKET_TAG_CARP 28 /* CARP info */ #endif /* !_SYS_MBUF_H_ */ ipfw3-2012/sys/sys/systm.h000644 000423 000000 00000007005 12006744011 015707 0ustar00luigiwheel000000 000000 #ifndef _SYS_SYSTM_H_ #define _SYS_SYSTM_H_ #define CALLOUT_ACTIVE 0x0002 /* callout is currently active */ #define CALLOUT_MPSAFE 0x0008 /* callout handler is mp safe */ #ifndef _WIN32 /* this is the linux version */ /* callout support, in on FreeBSD */ /* * callout support on linux module is done using timers */ #include #ifdef LINUX_24 #include /* jiffies definition is here in 2.4 */ #endif #define callout timer_list static __inline int callout_reset_on(struct callout *co, int ticks, void (*fn)(void *), void *arg, int cpu) { co->expires = jiffies + ticks; co->function = (void (*)(unsigned long))fn; co->data = (unsigned long)arg; /* * Linux 2.6.31 and above has add_timer_on(co, cpu), * otherwise add_timer() always schedules a callout on the same * CPU used the first time, so we don't need more. */ add_timer(co); return 0; } #define callout_init(co, safe) init_timer(co) #define callout_drain(co) del_timer(co) #define callout_stop(co) del_timer(co) #else /* _WIN32 */ #include /* This is the windows part for callout support */ struct callout { KTIMER thetimer; KDPC timerdpc; int dpcinitialized; LARGE_INTEGER duetime; }; void dummynet (void*); VOID dummynet_dpc( __in struct _KDPC *Dpc, __in_opt PVOID DeferredContext, __in_opt PVOID SystemArgument1, __in_opt PVOID SystemArgument2 ); VOID ipfw_dpc( __in struct _KDPC *Dpc, __in_opt PVOID DeferredContext, __in_opt PVOID SystemArgument1, __in_opt PVOID SystemArgument2 ); /* callout_reset must handle two problems: * - dummynet() scheduler must be run always on the same processor * because do_gettimeofday() is based on cpu performance counter, and * _occasionally_ can leap backward in time if we query another cpu. * typically this won't happen that much, and the cpu will almost always * be the same even without the affinity restriction, but better to be sure. * - ipfw_tick() does not have the granularity requirements of dummynet() * but we need to pass a pointer as argument. * * for these reasons, if we are called for dummynet() timer, * KeInitializeDpc is called only once as it should be, and the thread * is forced on cpu0 (which is always present), while if we're called * for ipfw_tick(), we re-initialize the DPC each time, using * parameter DeferredContext to pass the needed pointer. since this * timer is called only once a sec, this won't hurt that much. */ static __inline int callout_reset_on(struct callout *co, int ticks, void (*fn)(void *), void *arg, int cpu) { if(fn == &dummynet) { if(co->dpcinitialized == 0) { KeInitializeDpc(&co->timerdpc, dummynet_dpc, NULL); KeSetTargetProcessorDpc(&co->timerdpc, cpu); co->dpcinitialized = 1; } } else { KeInitializeDpc(&co->timerdpc, ipfw_dpc, arg); } co->duetime.QuadPart = (-ticks)*10000; KeSetTimer(&co->thetimer, co->duetime, &co->timerdpc); return 0; } static __inline void callout_init(struct callout* co, int safe) { printf("%s: initializing timer at %p\n",__FUNCTION__,co); KeInitializeTimer(&co->thetimer); } static __inline int callout_drain(struct callout* co) { BOOLEAN canceled = KeCancelTimer(&co->thetimer); while (canceled != TRUE) { canceled = KeCancelTimer(&co->thetimer); } printf("%s: stopping timer at %p\n",__FUNCTION__,co); return 0; } static __inline int callout_stop(struct callout* co) { return callout_drain(co); } #endif /* _WIN32 */ #endif /* _SYS_SYSTM_H_ */ ipfw3-2012/sys/sys/kernel.h000644 000423 000000 00000001376 12006744011 016015 0ustar00luigiwheel000000 000000 /* * from freebsd's kernel.h */ #ifndef _SYS_KERNEL_H_ #define _SYS_KERNEL_H_ #define SYSINIT(a, b, c, d, e) \ void *sysinit_ ## d = d #define VNET_SYSINIT(a, b, c, d, e) \ void *sysinit_ ## d = d #define SYSUNINIT(a, b, c, d, e) \ void *sysuninit_ ## d = d #define VNET_SYSUNINIT(a, b, c, d, e) \ void *sysuninit_ ## d = d /* * Some enumerated orders; "ANY" sorts last. */ enum sysinit_elem_order { SI_ORDER_FIRST = 0x0000000, /* first*/ SI_ORDER_SECOND = 0x0000001, /* second*/ SI_ORDER_THIRD = 0x0000002, /* third*/ SI_ORDER_MIDDLE = 0x1000000, /* somewhere in the middle */ SI_ORDER_ANY = 0xfffffff /* last*/ }; #endif ipfw3-2012/sys/sys/param.h000644 000423 000000 00000000233 12006744011 015624 0ustar00luigiwheel000000 000000 #ifndef _SYS_PARAM_H_ #define _SYS_PARAM_H_ /* * number of additional groups */ #ifndef LINUX_24 #define NGROUPS 16 #endif #endif /* _SYS_PARAM_H_ */ ipfw3-2012/sys/sys/syslog.h000644 000423 000000 00000000252 12006744011 016045 0ustar00luigiwheel000000 000000 #ifndef _SYS_SYSLOG_H_ #define _SYS_SYSLOG_H_ /* XXX find linux equivalent */ #define LOG_SECURITY 0 #define LOG_NOTICE 0 #define LOG_DEBUG 0 #endif /* _SYS_SYSLOG_H_ */ ipfw3-2012/sys/sys/cdefs.h000644 000423 000000 00000001270 12006744011 015612 0ustar00luigiwheel000000 000000 #ifndef _CDEFS_H_ #define _CDEFS_H_ /* * various compiler macros and common functions */ #ifndef __packed #define __packed __attribute__ ((__packed__)) #endif #ifndef __aligned #define __aligned(x) __attribute__((__aligned__(x))) #endif /* defined as assert */ void panic(const char *fmt, ...); #define KASSERT(exp,msg) do { \ if (__predict_false(!(exp))) \ panic msg; \ } while (0) /* don't bother to optimize */ #ifndef __predict_false #define __predict_false(x) (x) /* __builtin_expect((exp), 0) */ #endif #endif /* !_CDEFS_H_ */ ipfw3-2012/sys/sys/queue.h000644 000423 000000 00000047361 12006744011 015665 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 1991, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)queue.h 8.5 (Berkeley) 8/20/94 * $FreeBSD: src/sys/sys/queue.h,v 1.68 2006/10/24 11:20:29 ru Exp $ */ #ifndef _SYS_QUEUE_H_ #define _SYS_QUEUE_H_ //#include /* * This file defines four types of data structures: singly-linked lists, * singly-linked tail queues, lists and tail queues. * * A singly-linked list is headed by a single forward pointer. The elements * are singly linked for minimum space and pointer manipulation overhead at * the expense of O(n) removal for arbitrary elements. New elements can be * added to the list after an existing element or at the head of the list. * Elements being removed from the head of the list should use the explicit * macro for this purpose for optimum efficiency. A singly-linked list may * only be traversed in the forward direction. Singly-linked lists are ideal * for applications with large datasets and few or no removals or for * implementing a LIFO queue. * * A singly-linked tail queue is headed by a pair of pointers, one to the * head of the list and the other to the tail of the list. The elements are * singly linked for minimum space and pointer manipulation overhead at the * expense of O(n) removal for arbitrary elements. New elements can be added * to the list after an existing element, at the head of the list, or at the * end of the list. Elements being removed from the head of the tail queue * should use the explicit macro for this purpose for optimum efficiency. * A singly-linked tail queue may only be traversed in the forward direction. * Singly-linked tail queues are ideal for applications with large datasets * and few or no removals or for implementing a FIFO queue. * * A list is headed by a single forward pointer (or an array of forward * pointers for a hash table header). The elements are doubly linked * so that an arbitrary element can be removed without a need to * traverse the list. New elements can be added to the list before * or after an existing element or at the head of the list. A list * may only be traversed in the forward direction. * * A tail queue is headed by a pair of pointers, one to the head of the * list and the other to the tail of the list. The elements are doubly * linked so that an arbitrary element can be removed without a need to * traverse the list. New elements can be added to the list before or * after an existing element, at the head of the list, or at the end of * the list. A tail queue may be traversed in either direction. * * For details on the use of these macros, see the queue(3) manual page. * * * SLIST LIST STAILQ TAILQ * _HEAD + + + + * _HEAD_INITIALIZER + + + + * _ENTRY + + + + * _INIT + + + + * _EMPTY + + + + * _FIRST + + + + * _NEXT + + + + * _PREV - - - + * _LAST - - + + * _FOREACH + + + + * _FOREACH_SAFE + + + + * _FOREACH_REVERSE - - - + * _FOREACH_REVERSE_SAFE - - - + * _INSERT_HEAD + + + + * _INSERT_BEFORE - + - + * _INSERT_AFTER + + + + * _INSERT_TAIL - - + + * _CONCAT - - + + * _REMOVE_HEAD + - + - * _REMOVE + + + + * */ #ifdef QUEUE_MACRO_DEBUG /* Store the last 2 places the queue element or head was altered */ struct qm_trace { char * lastfile; int lastline; char * prevfile; int prevline; }; #define TRACEBUF struct qm_trace trace; #define TRASHIT(x) do {(x) = (void *)-1;} while (0) #define QMD_TRACE_HEAD(head) do { \ (head)->trace.prevline = (head)->trace.lastline; \ (head)->trace.prevfile = (head)->trace.lastfile; \ (head)->trace.lastline = __LINE__; \ (head)->trace.lastfile = __FILE__; \ } while (0) #define QMD_TRACE_ELEM(elem) do { \ (elem)->trace.prevline = (elem)->trace.lastline; \ (elem)->trace.prevfile = (elem)->trace.lastfile; \ (elem)->trace.lastline = __LINE__; \ (elem)->trace.lastfile = __FILE__; \ } while (0) #else #define QMD_TRACE_ELEM(elem) #define QMD_TRACE_HEAD(head) #define TRACEBUF #define TRASHIT(x) #endif /* QUEUE_MACRO_DEBUG */ /* * Singly-linked List declarations. */ #define SLIST_HEAD(name, type) \ struct name { \ struct type *slh_first; /* first element */ \ } #define SLIST_HEAD_INITIALIZER(head) \ { NULL } #if defined( _WIN32 ) && defined(SLIST_ENTRY) #undef SLIST_ENTRY #endif #define SLIST_ENTRY(type) \ struct { \ struct type *sle_next; /* next element */ \ } /* * Singly-linked List functions. */ #define SLIST_EMPTY(head) ((head)->slh_first == NULL) #define SLIST_FIRST(head) ((head)->slh_first) #define SLIST_FOREACH(var, head, field) \ for ((var) = SLIST_FIRST((head)); \ (var); \ (var) = SLIST_NEXT((var), field)) #define SLIST_FOREACH_SAFE(var, head, field, tvar) \ for ((var) = SLIST_FIRST((head)); \ (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ (var) = (tvar)) #define SLIST_FOREACH_PREVPTR(var, varp, head, field) \ for ((varp) = &SLIST_FIRST((head)); \ ((var) = *(varp)) != NULL; \ (varp) = &SLIST_NEXT((var), field)) #define SLIST_INIT(head) do { \ SLIST_FIRST((head)) = NULL; \ } while (0) #define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \ SLIST_NEXT((slistelm), field) = (elm); \ } while (0) #define SLIST_INSERT_HEAD(head, elm, field) do { \ SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \ SLIST_FIRST((head)) = (elm); \ } while (0) #define SLIST_NEXT(elm, field) ((elm)->field.sle_next) #define SLIST_REMOVE(head, elm, type, field) do { \ if (SLIST_FIRST((head)) == (elm)) { \ SLIST_REMOVE_HEAD((head), field); \ } \ else { \ struct type *curelm = SLIST_FIRST((head)); \ while (SLIST_NEXT(curelm, field) != (elm)) \ curelm = SLIST_NEXT(curelm, field); \ SLIST_NEXT(curelm, field) = \ SLIST_NEXT(SLIST_NEXT(curelm, field), field); \ } \ TRASHIT((elm)->field.sle_next); \ } while (0) #define SLIST_REMOVE_HEAD(head, field) do { \ SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ } while (0) /* * Singly-linked Tail queue declarations. */ #define STAILQ_HEAD(name, type) \ struct name { \ struct type *stqh_first;/* first element */ \ struct type **stqh_last;/* addr of last next element */ \ } #define STAILQ_HEAD_INITIALIZER(head) \ { NULL, &(head).stqh_first } #define STAILQ_ENTRY(type) \ struct { \ struct type *stqe_next; /* next element */ \ } /* * Singly-linked Tail queue functions. */ #define STAILQ_CONCAT(head1, head2) do { \ if (!STAILQ_EMPTY((head2))) { \ *(head1)->stqh_last = (head2)->stqh_first; \ (head1)->stqh_last = (head2)->stqh_last; \ STAILQ_INIT((head2)); \ } \ } while (0) #define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) #define STAILQ_FIRST(head) ((head)->stqh_first) #define STAILQ_FOREACH(var, head, field) \ for((var) = STAILQ_FIRST((head)); \ (var); \ (var) = STAILQ_NEXT((var), field)) #define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ for ((var) = STAILQ_FIRST((head)); \ (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ (var) = (tvar)) #define STAILQ_INIT(head) do { \ STAILQ_FIRST((head)) = NULL; \ (head)->stqh_last = &STAILQ_FIRST((head)); \ } while (0) #define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\ (head)->stqh_last = &STAILQ_NEXT((elm), field); \ STAILQ_NEXT((tqelm), field) = (elm); \ } while (0) #define STAILQ_INSERT_HEAD(head, elm, field) do { \ if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \ (head)->stqh_last = &STAILQ_NEXT((elm), field); \ STAILQ_FIRST((head)) = (elm); \ } while (0) #define STAILQ_INSERT_TAIL(head, elm, field) do { \ STAILQ_NEXT((elm), field) = NULL; \ *(head)->stqh_last = (elm); \ (head)->stqh_last = &STAILQ_NEXT((elm), field); \ } while (0) #define STAILQ_LAST(head, type, field) \ (STAILQ_EMPTY((head)) ? \ NULL : \ ((struct type *)(void *) \ ((char *)((head)->stqh_last) - __offsetof(struct type, field)))) #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) #define STAILQ_REMOVE(head, elm, type, field) do { \ if (STAILQ_FIRST((head)) == (elm)) { \ STAILQ_REMOVE_HEAD((head), field); \ } \ else { \ struct type *curelm = STAILQ_FIRST((head)); \ while (STAILQ_NEXT(curelm, field) != (elm)) \ curelm = STAILQ_NEXT(curelm, field); \ if ((STAILQ_NEXT(curelm, field) = \ STAILQ_NEXT(STAILQ_NEXT(curelm, field), field)) == NULL)\ (head)->stqh_last = &STAILQ_NEXT((curelm), field);\ } \ TRASHIT((elm)->field.stqe_next); \ } while (0) #define STAILQ_REMOVE_HEAD(head, field) do { \ if ((STAILQ_FIRST((head)) = \ STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \ (head)->stqh_last = &STAILQ_FIRST((head)); \ } while (0) #ifndef LIST_HEAD /* * List declarations. */ #define LIST_HEAD(name, type) \ struct name { \ struct type *lh_first; /* first element */ \ } #define LIST_HEAD_INITIALIZER(head) \ { NULL } #define LIST_ENTRY(type) \ struct { \ struct type *le_next; /* next element */ \ struct type **le_prev; /* address of previous next element */ \ } /* * List functions. */ #if (defined(_KERNEL) && defined(INVARIANTS)) #define QMD_LIST_CHECK_HEAD(head, field) do { \ if (LIST_FIRST((head)) != NULL && \ LIST_FIRST((head))->field.le_prev != \ &LIST_FIRST((head))) \ panic("Bad list head %p first->prev != head", (head)); \ } while (0) #define QMD_LIST_CHECK_NEXT(elm, field) do { \ if (LIST_NEXT((elm), field) != NULL && \ LIST_NEXT((elm), field)->field.le_prev != \ &((elm)->field.le_next)) \ panic("Bad link elm %p next->prev != elm", (elm)); \ } while (0) #define QMD_LIST_CHECK_PREV(elm, field) do { \ if (*(elm)->field.le_prev != (elm)) \ panic("Bad link elm %p prev->next != elm", (elm)); \ } while (0) #else #define QMD_LIST_CHECK_HEAD(head, field) #define QMD_LIST_CHECK_NEXT(elm, field) #define QMD_LIST_CHECK_PREV(elm, field) #endif /* (_KERNEL && INVARIANTS) */ #define LIST_EMPTY(head) ((head)->lh_first == NULL) #define LIST_FIRST(head) ((head)->lh_first) #define LIST_FOREACH(var, head, field) \ for ((var) = LIST_FIRST((head)); \ (var); \ (var) = LIST_NEXT((var), field)) #define LIST_FOREACH_SAFE(var, head, field, tvar) \ for ((var) = LIST_FIRST((head)); \ (var) && ((tvar) = LIST_NEXT((var), field), 1); \ (var) = (tvar)) #define LIST_INIT(head) do { \ LIST_FIRST((head)) = NULL; \ } while (0) #define LIST_INSERT_AFTER(listelm, elm, field) do { \ QMD_LIST_CHECK_NEXT(listelm, field); \ if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\ LIST_NEXT((listelm), field)->field.le_prev = \ &LIST_NEXT((elm), field); \ LIST_NEXT((listelm), field) = (elm); \ (elm)->field.le_prev = &LIST_NEXT((listelm), field); \ } while (0) #define LIST_INSERT_BEFORE(listelm, elm, field) do { \ QMD_LIST_CHECK_PREV(listelm, field); \ (elm)->field.le_prev = (listelm)->field.le_prev; \ LIST_NEXT((elm), field) = (listelm); \ *(listelm)->field.le_prev = (elm); \ (listelm)->field.le_prev = &LIST_NEXT((elm), field); \ } while (0) #define LIST_INSERT_HEAD(head, elm, field) do { \ QMD_LIST_CHECK_HEAD((head), field); \ if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \ LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\ LIST_FIRST((head)) = (elm); \ (elm)->field.le_prev = &LIST_FIRST((head)); \ } while (0) #define LIST_NEXT(elm, field) ((elm)->field.le_next) #define LIST_REMOVE(elm, field) do { \ QMD_LIST_CHECK_NEXT(elm, field); \ QMD_LIST_CHECK_PREV(elm, field); \ if (LIST_NEXT((elm), field) != NULL) \ LIST_NEXT((elm), field)->field.le_prev = \ (elm)->field.le_prev; \ *(elm)->field.le_prev = LIST_NEXT((elm), field); \ TRASHIT((elm)->field.le_next); \ TRASHIT((elm)->field.le_prev); \ } while (0) #endif /* LIST_HEAD */ /* * Tail queue declarations. */ #define TAILQ_HEAD(name, type) \ struct name { \ struct type *tqh_first; /* first element */ \ struct type **tqh_last; /* addr of last next element */ \ TRACEBUF \ } #define TAILQ_HEAD_INITIALIZER(head) \ { NULL, &(head).tqh_first } #define TAILQ_ENTRY(type) \ struct { \ struct type *tqe_next; /* next element */ \ struct type **tqe_prev; /* address of previous next element */ \ TRACEBUF \ } /* * Tail queue functions. */ #if (defined(_KERNEL) && defined(INVARIANTS)) #define QMD_TAILQ_CHECK_HEAD(head, field) do { \ if (!TAILQ_EMPTY(head) && \ TAILQ_FIRST((head))->field.tqe_prev != \ &TAILQ_FIRST((head))) \ panic("Bad tailq head %p first->prev != head", (head)); \ } while (0) #define QMD_TAILQ_CHECK_TAIL(head, field) do { \ if (*(head)->tqh_last != NULL) \ panic("Bad tailq NEXT(%p->tqh_last) != NULL", (head)); \ } while (0) #define QMD_TAILQ_CHECK_NEXT(elm, field) do { \ if (TAILQ_NEXT((elm), field) != NULL && \ TAILQ_NEXT((elm), field)->field.tqe_prev != \ &((elm)->field.tqe_next)) \ panic("Bad link elm %p next->prev != elm", (elm)); \ } while (0) #define QMD_TAILQ_CHECK_PREV(elm, field) do { \ if (*(elm)->field.tqe_prev != (elm)) \ panic("Bad link elm %p prev->next != elm", (elm)); \ } while (0) #else #define QMD_TAILQ_CHECK_HEAD(head, field) #define QMD_TAILQ_CHECK_TAIL(head, headname) #define QMD_TAILQ_CHECK_NEXT(elm, field) #define QMD_TAILQ_CHECK_PREV(elm, field) #endif /* (_KERNEL && INVARIANTS) */ #define TAILQ_CONCAT(head1, head2, field) do { \ if (!TAILQ_EMPTY(head2)) { \ *(head1)->tqh_last = (head2)->tqh_first; \ (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ (head1)->tqh_last = (head2)->tqh_last; \ TAILQ_INIT((head2)); \ QMD_TRACE_HEAD(head1); \ QMD_TRACE_HEAD(head2); \ } \ } while (0) #define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) #define TAILQ_FIRST(head) ((head)->tqh_first) #define TAILQ_FOREACH(var, head, field) \ for ((var) = TAILQ_FIRST((head)); \ (var); \ (var) = TAILQ_NEXT((var), field)) #define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ for ((var) = TAILQ_FIRST((head)); \ (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ (var) = (tvar)) #define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ for ((var) = TAILQ_LAST((head), headname); \ (var); \ (var) = TAILQ_PREV((var), headname, field)) #define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ for ((var) = TAILQ_LAST((head), headname); \ (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1); \ (var) = (tvar)) #define TAILQ_INIT(head) do { \ TAILQ_FIRST((head)) = NULL; \ (head)->tqh_last = &TAILQ_FIRST((head)); \ QMD_TRACE_HEAD(head); \ } while (0) #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ QMD_TAILQ_CHECK_NEXT(listelm, field); \ if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\ TAILQ_NEXT((elm), field)->field.tqe_prev = \ &TAILQ_NEXT((elm), field); \ else { \ (head)->tqh_last = &TAILQ_NEXT((elm), field); \ QMD_TRACE_HEAD(head); \ } \ TAILQ_NEXT((listelm), field) = (elm); \ (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ QMD_TRACE_ELEM(&(elm)->field); \ QMD_TRACE_ELEM(&listelm->field); \ } while (0) #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ QMD_TAILQ_CHECK_PREV(listelm, field); \ (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ TAILQ_NEXT((elm), field) = (listelm); \ *(listelm)->field.tqe_prev = (elm); \ (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ QMD_TRACE_ELEM(&(elm)->field); \ QMD_TRACE_ELEM(&listelm->field); \ } while (0) #define TAILQ_INSERT_HEAD(head, elm, field) do { \ QMD_TAILQ_CHECK_HEAD(head, field); \ if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \ TAILQ_FIRST((head))->field.tqe_prev = \ &TAILQ_NEXT((elm), field); \ else \ (head)->tqh_last = &TAILQ_NEXT((elm), field); \ TAILQ_FIRST((head)) = (elm); \ (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \ QMD_TRACE_HEAD(head); \ QMD_TRACE_ELEM(&(elm)->field); \ } while (0) #define TAILQ_INSERT_TAIL(head, elm, field) do { \ QMD_TAILQ_CHECK_TAIL(head, field); \ TAILQ_NEXT((elm), field) = NULL; \ (elm)->field.tqe_prev = (head)->tqh_last; \ *(head)->tqh_last = (elm); \ (head)->tqh_last = &TAILQ_NEXT((elm), field); \ QMD_TRACE_HEAD(head); \ QMD_TRACE_ELEM(&(elm)->field); \ } while (0) #define TAILQ_LAST(head, headname) \ (*(((struct headname *)((head)->tqh_last))->tqh_last)) #define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) #define TAILQ_PREV(elm, headname, field) \ (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) #define TAILQ_REMOVE(head, elm, field) do { \ QMD_TAILQ_CHECK_NEXT(elm, field); \ QMD_TAILQ_CHECK_PREV(elm, field); \ if ((TAILQ_NEXT((elm), field)) != NULL) \ TAILQ_NEXT((elm), field)->field.tqe_prev = \ (elm)->field.tqe_prev; \ else { \ (head)->tqh_last = (elm)->field.tqe_prev; \ QMD_TRACE_HEAD(head); \ } \ *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ TRASHIT((elm)->field.tqe_next); \ TRASHIT((elm)->field.tqe_prev); \ QMD_TRACE_ELEM(&(elm)->field); \ } while (0) #ifdef _KERNEL /* * XXX insque() and remque() are an old way of handling certain queues. * They bogusly assumes that all queue heads look alike. */ struct quehead { struct quehead *qh_link; struct quehead *qh_rlink; }; #ifdef __CC_SUPPORTS___INLINE static __inline void insque(void *a, void *b) { struct quehead *element = (struct quehead *)a, *head = (struct quehead *)b; element->qh_link = head->qh_link; element->qh_rlink = head; head->qh_link = element; element->qh_link->qh_rlink = element; } static __inline void remque(void *a) { struct quehead *element = (struct quehead *)a; element->qh_link->qh_rlink = element->qh_rlink; element->qh_rlink->qh_link = element->qh_link; element->qh_rlink = 0; } #else /* !__CC_SUPPORTS___INLINE */ void insque(void *a, void *b); void remque(void *a); #endif /* __CC_SUPPORTS___INLINE */ #endif /* _KERNEL */ #endif /* !_SYS_QUEUE_H_ */ ipfw3-2012/sys/sys/module.h000644 000423 000000 00000001750 12006744011 016016 0ustar00luigiwheel000000 000000 /* * trivial module support */ #ifndef _SYS_MODULE_H_ #define _SYS_MODULE_H_ typedef struct module *module_t; typedef int (*modeventhand_t)(module_t, int /* modeventtype_t */, void *); typedef enum modeventtype { MOD_LOAD, MOD_UNLOAD, MOD_SHUTDOWN, MOD_QUIESCE } modeventtype_t; typedef struct moduledata { const char *name; /* module name */ modeventhand_t evhand; /* event handler */ void *priv; /* extra data */ } moduledata_t; /* * Hook the module descriptor, md, into our list of things to do. * We should in principle respect the order of loading. * * XXX use the gcc .init functions */ #define DECLARE_MODULE(a, md, c,d) \ moduledata_t *moddesc_##a = &md; /* * XXX MODULE_VERSION is define in linux too */ #define MODULE_DEPEND(a,b,c,d,e) #if defined( __linux__ ) || defined( _WIN32 ) #undef MODULE_VERSION #define MODULE_VERSION(a,b) #endif #endif /* _SYS_MODULE_H_ */ ipfw3-2012/sys/sys/malloc.h000644 000423 000000 00000003736 12006744011 016006 0ustar00luigiwheel000000 000000 #ifndef _SYS_MALLOC_H_ #define _SYS_MALLOC_H_ /* * No matter what, try to get clear memory and be non-blocking. * XXX check if 2.4 has a native way to zero memory, * XXX obey to the flags (M_NOWAIT <-> GPF_ATOMIC, M_WAIT <-> GPF_KERNEL) */ #ifndef _WIN32 /* this is the linux version */ /* * XXX On zeroshell (2.6.25.17) we get a load error * __you_cannot_kmalloc_that_much * which is triggered when kmalloc() is called with a large * compile-time constant argument (include/linux/slab_def.h) * * I think it may be a compiler (or source) bug because there is no * evidence that such a large request is made. * Making the _size argument to kmalloc volatile prevents the compiler * from making the mistake, though it is clearly not ideal. */ #if !defined (LINUX_24) && LINUX_VERSION_CODE > KERNEL_VERSION(2,6,22) #define malloc(_size, type, flags) \ ({ volatile int _v = _size; kmalloc(_v, GFP_ATOMIC | __GFP_ZERO); }) #else /* LINUX <= 2.6.22 and LINUX_24 */ /* linux 2.6.22 does not zero allocated memory */ #define malloc(_size, type, flags) \ ({ int _s = _size; \ void *_ret = kmalloc(_s, GFP_ATOMIC); \ if (_ret) memset(_ret, 0, _s); \ (_ret); \ }) #endif /* LINUX <= 2.6.22 */ #define calloc(_n, _s) malloc((_n * _s), NULL, GFP_ATOMIC | __GFP_ZERO) #define free(_var, type) kfree(_var) #else /* _WIN32, the windows version */ /* * ntddk.h uses win_malloc() and MmFreeContiguousMemory(). * wipfw uses * ExAllocatePoolWithTag(, pool, len, tag) * ExFreePoolWithTag(ptr, tag) */ #define malloc(_size, _type, _flags) my_alloc(_size) #define calloc(_size, _type, _flags) my_alloc(_size) void *my_alloc(int _size); /* the 'tag' version does not work without -Gz in the linker */ #define free(_var, type) ExFreePool(_var) //#define free(_var, type) ExFreePoolWithTag(_var, 'wfpi') #endif /* _WIN32 */ #define M_NOWAIT 0x0001 /* do not block */ #define M_ZERO 0x0100 /* bzero the allocation */ #endif /* _SYS_MALLOC_H_ */ ipfw3-2012/sys/sys/taskqueue.h000644 000423 000000 00000001543 12006744011 016540 0ustar00luigiwheel000000 000000 #ifndef _SYS_TASKQUEUE_H_ #define _SYS_TASKQUEUE_H_ /* * Remap taskqueue to direct calls */ #ifdef _WIN32 struct task { void (*func)(void*, int); }; #define taskqueue_enqueue(tq, ta) (ta)->func(NULL,1) #define TASK_INIT(a,b,c,d) do { \ (a)->func = (c); } while (0) #else struct task { void (*func)(void); }; #define taskqueue_enqueue(tq, ta) (ta)->func() #define TASK_INIT(a,b,c,d) do { \ (a)->func = (void (*)(void))c; } while (0) #endif #define taskqueue_create_fast(_a, _b, _c, _d) NULL #define taskqueue_start_threads(_a, _b, _c, _d) #define taskqueue_drain(_a, _b) /* XXX to be completed */ #define taskqueue_free(_a) /* XXX to be completed */ #define PRI_MIN (0) /* Highest priority. */ #define PRI_MIN_ITHD (PRI_MIN) #define PI_NET (PRI_MIN_ITHD + 16) #endif /* !_SYS_TASKQUEUE_H_ */ ipfw3-2012/sys/netgraph/ng_ipfw.h000644 000423 000000 00000003074 12006744011 017155 0ustar00luigiwheel000000 000000 /*- * Copyright 2005, Gleb Smirnoff * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD: src/sys/netgraph/ng_ipfw.h,v 1.2 2006/02/17 09:42:49 glebius Exp $ */ #ifndef _NG_IPFW_H #define _NG_IPFW_H #define NG_IPFW_NODE_TYPE "ipfw" #define NGM_IPFW_COOKIE 1105988990 #endif /* _NG_IPFW_H */ ipfw3-2012/sys/netinet/ipfw/000755 000423 000000 00000000000 12010150105 016140 5ustar00luigiwheel000000 000000 ipfw3-2012/sys/netinet/ip_dummynet.h000644 000423 000000 00000020503 12010150105 017676 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 1998-2010 Luigi Rizzo, Universita` di Pisa * Portions Copyright (c) 2000 Akamba Corp. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD: user/luigi/ipfw3-head/sys/netinet/ip_dummynet.h 203321 2010-01-31 21:39:25Z luigi $ */ #ifndef _IP_DUMMYNET_H #define _IP_DUMMYNET_H /* * Definition of the kernel-userland API for dummynet. * * Setsockopt() and getsockopt() pass a batch of objects, each * of them starting with a "struct dn_id" which should fully identify * the object and its relation with others in the sequence. * The first object in each request should have * type= DN_CMD_*, id = DN_API_VERSION. * For other objects, type and subtype specify the object, len indicates * the total length including the header, and 'id' identifies the specific * object. * * Most objects are numbered with an identifier in the range 1..65535. * DN_MAX_ID indicates the first value outside the range. */ #define DN_API_VERSION 12500000 #define DN_MAX_ID 0x10000 struct dn_id { uint16_t len; /* total obj len including this header */ uint8_t type; uint8_t subtype; uint32_t id; /* generic id */ }; /* * These values are in the type field of struct dn_id. * To preserve the ABI, never rearrange the list or delete * entries with the exception of DN_LAST */ enum { DN_NONE = 0, DN_LINK = 1, DN_FS, DN_SCH, DN_SCH_I, DN_QUEUE, DN_DELAY_LINE, DN_PROFILE, DN_FLOW, /* struct dn_flow */ DN_TEXT, /* opaque text is the object */ DN_CMD_CONFIG = 0x80, /* objects follow */ DN_CMD_DELETE, /* subtype + list of entries */ DN_CMD_GET, /* subtype + list of entries */ DN_CMD_FLUSH, /* for compatibility with FreeBSD 7.2/8 */ DN_COMPAT_PIPE, DN_COMPAT_QUEUE, DN_GET_COMPAT, /* special commands for emulation of sysctl variables */ DN_SYSCTL_GET, DN_SYSCTL_SET, DN_LAST, }; enum { /* subtype for schedulers, flowset and the like */ DN_SCHED_UNKNOWN = 0, DN_SCHED_FIFO = 1, DN_SCHED_WF2QP = 2, /* others are in individual modules */ }; enum { /* user flags */ DN_HAVE_MASK = 0x0001, /* fs or sched has a mask */ DN_NOERROR = 0x0002, /* do not report errors */ DN_QHT_HASH = 0x0004, /* qht is a hash table */ DN_QSIZE_BYTES = 0x0008, /* queue size is in bytes */ DN_HAS_PROFILE = 0x0010, /* a link has a profile */ DN_IS_RED = 0x0020, DN_IS_GENTLE_RED= 0x0040, DN_PIPE_CMD = 0x1000, /* pipe config... */ }; /* * link template. */ struct dn_link { struct dn_id oid; /* * Userland sets bw and delay in bits/s and milliseconds. * The kernel converts this back and forth to bits/tick and ticks. * XXX what about burst ? */ int32_t link_nr; int bandwidth; /* bit/s or bits/tick. */ int delay; /* ms and ticks */ uint64_t burst; /* scaled. bits*Hz XXX */ }; /* * A flowset, which is a template for flows. Contains parameters * from the command line: id, target scheduler, queue sizes, plr, * flow masks, buckets for the flow hash, and possibly scheduler- * specific parameters (weight, quantum and so on). */ struct dn_fs { struct dn_id oid; uint32_t fs_nr; /* the flowset number */ uint32_t flags; /* userland flags */ int qsize; /* queue size in slots or bytes */ int32_t plr; /* PLR, pkt loss rate (2^31-1 means 100%) */ uint32_t buckets; /* buckets used for the queue hash table */ struct ipfw_flow_id flow_mask; uint32_t sched_nr; /* the scheduler we attach to */ /* generic scheduler parameters. Leave them at -1 if unset. * Now we use 0: weight, 1: lmax, 2: priority */ int par[4]; /* RED/GRED parameters. * weight and probabilities are in the range 0..1 represented * in fixed point arithmetic with SCALE_RED decimal bits. */ #define SCALE_RED 16 #define SCALE(x) ( (x) << SCALE_RED ) #define SCALE_VAL(x) ( (x) >> SCALE_RED ) #define SCALE_MUL(x,y) ( ( (x) * (y) ) >> SCALE_RED ) int w_q ; /* queue weight (scaled) */ int max_th ; /* maximum threshold for queue (scaled) */ int min_th ; /* minimum threshold for queue (scaled) */ int max_p ; /* maximum value for p_b (scaled) */ }; /* * dn_flow collects flow_id and stats for queues and scheduler * instances, and is used to pass these info to userland. * oid.type/oid.subtype describe the object, oid.id is number * of the parent object. */ struct dn_flow { struct dn_id oid; struct ipfw_flow_id fid; uint64_t tot_pkts; /* statistics counters */ uint64_t tot_bytes; uint32_t length; /* Queue length, in packets */ uint32_t len_bytes; /* Queue length, in bytes */ uint32_t drops; }; /* * Scheduler template, mostly indicating the name, number, * sched_mask and buckets. */ struct dn_sch { struct dn_id oid; uint32_t sched_nr; /* N, scheduler number */ uint32_t buckets; /* number of buckets for the instances */ uint32_t flags; /* have_mask, ... */ char name[16]; /* null terminated */ /* mask to select the appropriate scheduler instance */ struct ipfw_flow_id sched_mask; /* M */ }; /* A delay profile is attached to a link. * Note that a profile, as any other object, cannot be longer than 2^16 */ #define ED_MAX_SAMPLES_NO 1024 struct dn_profile { struct dn_id oid; /* fields to simulate a delay profile */ #define ED_MAX_NAME_LEN 32 char name[ED_MAX_NAME_LEN]; int link_nr; int loss_level; int bandwidth; // XXX use link bandwidth? int samples_no; /* actual len of samples[] */ int samples[0]; /* may be shorter */ }; /* * Overall structure of dummynet In dummynet, packets are selected with the firewall rules, and passed to two different objects: PIPE or QUEUE (bad name). A QUEUE defines a classifier, which groups packets into flows according to a 'mask', puts them into independent queues (one per flow) with configurable size and queue management policy, and passes flows to a scheduler: (flow_mask|sched_mask) sched_mask +---------+ weight Wx +-------------+ | |->-[flow]-->--| |-+ -->--| QUEUE x | ... | | | | |->-[flow]-->--| SCHEDuler N | | +---------+ | | | ... | +--[LINK N]-->-- +---------+ weight Wy | | +--[LINK N]-->-- | |->-[flow]-->--| | | -->--| QUEUE y | ... | | | | |->-[flow]-->--| | | +---------+ +-------------+ | +-------------+ Many QUEUE objects can connect to the same scheduler, each QUEUE object can have its own set of parameters. In turn, the SCHEDuler 'forks' multiple instances according to a 'sched_mask', each instance manages its own set of queues and transmits on a private instance of a configurable LINK. A PIPE is a simplified version of the above, where there is no flow_mask, and each scheduler instance handles a single queue. The following data structures (visible from userland) describe the objects used by dummynet: + dn_link, contains the main configuration parameters related to delay and bandwidth; + dn_profile describes a delay profile; + dn_flow describes the flow status (flow id, statistics) + dn_sch describes a scheduler + dn_fs describes a flowset (msk, weight, queue parameters) * */ #endif /* _IP_DUMMYNET_H */ ipfw3-2012/sys/netinet/ip6.h000644 000423 000000 00000004454 12006744011 016063 0ustar00luigiwheel000000 000000 #ifndef _NETINET_IP6_H_ #define _NETINET_IP6_H_ #define IN6_ARE_ADDR_EQUAL(a, b) \ (memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0) struct ip6_hdr { union { struct ip6_hdrctl { u_int32_t ip6_un1_flow; /* 20 bits of flow-ID */ u_int16_t ip6_un1_plen; /* payload length */ u_int8_t ip6_un1_nxt; /* next header */ u_int8_t ip6_un1_hlim; /* hop limit */ } ip6_un1; u_int8_t ip6_un2_vfc; /* 4 bits version, top 4 bits class */ } ip6_ctlun; struct in6_addr ip6_src; /* source address */ struct in6_addr ip6_dst; /* destination address */ }; #define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt #define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow struct icmp6_hdr { u_int8_t icmp6_type; /* type field */ u_int8_t icmp6_code; /* code field */ u_int16_t icmp6_cksum; /* checksum field */ union { u_int32_t icmp6_un_data32[1]; /* type-specific field */ u_int16_t icmp6_un_data16[2]; /* type-specific field */ u_int8_t icmp6_un_data8[4]; /* type-specific field */ } icmp6_dataun; }; struct ip6_hbh { u_int8_t ip6h_nxt; /* next header */ u_int8_t ip6h_len; /* length in units of 8 octets */ /* followed by options */ }; struct ip6_rthdr { u_int8_t ip6r_nxt; /* next header */ u_int8_t ip6r_len; /* length in units of 8 octets */ u_int8_t ip6r_type; /* routing type */ u_int8_t ip6r_segleft; /* segments left */ /* followed by routing type specific data */ }; struct ip6_frag { u_int8_t ip6f_nxt; /* next header */ u_int8_t ip6f_reserved; /* reserved field */ u_int16_t ip6f_offlg; /* offset, reserved, and flag */ u_int32_t ip6f_ident; /* identification */ }; #define IP6F_OFF_MASK 0xfff8 /* mask out offset from _offlg */ #define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */ struct ip6_ext { u_int8_t ip6e_nxt; u_int8_t ip6e_len; }; #endif /* _NETINET_IP6_H_ */ ipfw3-2012/sys/netinet/tcp_var.h000644 000423 000000 00000000163 12006744011 017014 0ustar00luigiwheel000000 000000 #ifndef _NETINET_TCP_VAR_H_ #define _NETINET_TCP_VAR_H_ #include #endif /* !_NETINET_TCP_VAR_H_ */ ipfw3-2012/sys/netinet/ip_icmp.h000644 000423 000000 00000001251 12006744011 016775 0ustar00luigiwheel000000 000000 /* * additional define not present in linux * should go in glue.h */ #ifndef _NETINET_IP_ICMP_H_ #define _NETINET_IP_ICMP_H_ #define ICMP_MAXTYPE 40 /* defined as 18 in compat.h */ #define ICMP_ROUTERSOLICIT 10 /* router solicitation */ #define ICMP_TSTAMP 13 /* timestamp request */ #define ICMP_IREQ 15 /* information request */ #define ICMP_MASKREQ 17 /* address mask request */ #define ICMP_UNREACH_HOST 1 /* bad host */ #define ICMP_UNREACH 3 /* dest unreachable, codes: */ #endif /* _NETINET_IP_ICMP_H_ */ ipfw3-2012/sys/netinet/in_cksum.c000644 000423 000000 00000010212 12006744011 017155 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 1988, 1992, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)in_cksum.c 8.1 (Berkeley) 6/10/93 */ #include __FBSDID("$FreeBSD: src/sys/netinet/in_cksum.c,v 1.10 2007/10/07 20:44:22 silby Exp $"); #include #include /* * Checksum routine for Internet Protocol family headers (Portable Version). * * This routine is very heavily used in the network * code and should be modified for each CPU to be as fast as possible. */ #define ADDCARRY(x) (x > 65535 ? x -= 65535 : x) #define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; ADDCARRY(sum);} int in_cksum(struct mbuf *m, int len) { register u_short *w; register int sum = 0; register int mlen = 0; int byte_swapped = 0; union { char c[2]; u_short s; } s_util; union { u_short s[2]; long l; } l_util; for (;m && len; m = m->m_next) { if (m->m_len == 0) continue; w = mtod(m, u_short *); if (mlen == -1) { /* * The first byte of this mbuf is the continuation * of a word spanning between this mbuf and the * last mbuf. * * s_util.c[0] is already saved when scanning previous * mbuf. */ s_util.c[1] = *(char *)w; sum += s_util.s; w = (u_short *)((char *)w + 1); mlen = m->m_len - 1; len--; } else mlen = m->m_len; if (len < mlen) mlen = len; len -= mlen; /* * Force to even boundary. */ if ((1 & (uintptr_t) w) && (mlen > 0)) { REDUCE; sum <<= 8; s_util.c[0] = *(u_char *)w; w = (u_short *)((char *)w + 1); mlen--; byte_swapped = 1; } /* * Unroll the loop to make overhead from * branches &c small. */ while ((mlen -= 32) >= 0) { sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7]; sum += w[8]; sum += w[9]; sum += w[10]; sum += w[11]; sum += w[12]; sum += w[13]; sum += w[14]; sum += w[15]; w += 16; } mlen += 32; while ((mlen -= 8) >= 0) { sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; w += 4; } mlen += 8; if (mlen == 0 && byte_swapped == 0) continue; REDUCE; while ((mlen -= 2) >= 0) { sum += *w++; } if (byte_swapped) { REDUCE; sum <<= 8; byte_swapped = 0; if (mlen == -1) { s_util.c[1] = *(char *)w; sum += s_util.s; mlen = 0; } else mlen = -1; } else if (mlen == -1) s_util.c[0] = *(char *)w; } if (len) printf("cksum: out of data\n"); if (mlen == -1) { /* The last mbuf has odd # of bytes. Follow the standard (the odd byte may be shifted left by 8 bits or not as determined by endian-ness of the machine) */ s_util.c[1] = 0; sum += s_util.s; } REDUCE; return (~sum & 0xffff); } ipfw3-2012/sys/netinet/ip_fw.h000644 000423 000000 00000046750 12010150105 016464 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 2002-2009 Luigi Rizzo, Universita` di Pisa * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD: user/luigi/ipfw3-head/sys/netinet/ip_fw.h 202072 2010-01-11 10:12:35Z luigi $ */ #ifndef _IPFW2_H #define _IPFW2_H /* * The default rule number. By the design of ip_fw, the default rule * is the last one, so its number can also serve as the highest number * allowed for a rule. The ip_fw code relies on both meanings of this * constant. */ #define IPFW_DEFAULT_RULE 65535 /* * The number of ipfw tables. The maximum allowed table number is the * (IPFW_TABLES_MAX - 1). */ #define IPFW_TABLES_MAX 128 /* * Most commands (queue, pipe, tag, untag, limit...) can have a 16-bit * argument between 1 and 65534. The value 0 is unused, the value * 65535 (IP_FW_TABLEARG) is used to represent 'tablearg', i.e. the * can be 1..65534, or 65535 to indicate the use of a 'tablearg' * result of the most recent table() lookup. * Note that 16bit is only a historical limit, resulting from * the use of a 16-bit fields for that value. In reality, we can have * 2^32 pipes, queues, tag values and so on, and use 0 as a tablearg. */ #define IPFW_ARG_MIN 1 #define IPFW_ARG_MAX 65534 #define IP_FW_TABLEARG 65535 /* XXX should use 0 */ /* * Number of entries in the call stack of the call/return commands. * Call stack currently is an uint16_t array with rule numbers. */ #define IPFW_CALLSTACK_SIZE 16 /* IP_FW3 header/opcodes */ typedef struct _ip_fw3_opheader { uint16_t opcode; /* Operation opcode */ uint16_t reserved[3]; /* Align to 64-bit boundary */ } ip_fw3_opheader; /* IPFW extented tables support XXX what namespace ? */ #define IP_FW_TABLE_XADD 86 /* add entry */ #define IP_FW_TABLE_XDEL 87 /* delete entry */ #define IP_FW_TABLE_XGETSIZE 88 /* get table size */ #define IP_FW_TABLE_XLIST 89 /* list table contents */ /* * The kernel representation of ipfw rules is made of a list of * 'instructions' (for all practical purposes equivalent to BPF * instructions), which specify which fields of the packet * (or its metadata) should be analysed. * * Each instruction is stored in a structure which begins with * "ipfw_insn", and can contain extra fields depending on the * instruction type (listed below). * Note that the code is written so that individual instructions * have a size which is a multiple of 32 bits. This means that, if * such structures contain pointers or other 64-bit entities, * (there is just one instance now) they may end up unaligned on * 64-bit architectures, so the must be handled with care. * * "enum ipfw_opcodes" are the opcodes supported. We can have up * to 256 different opcodes. When adding new opcodes, they should * be appended to the end of the opcode list before O_LAST_OPCODE, * this will prevent the ABI from being broken, otherwise users * will have to recompile ipfw(8) when they update the kernel. */ enum ipfw_opcodes { /* arguments (4 byte each) */ O_NOP, O_IP_SRC, /* u32 = IP */ O_IP_SRC_MASK, /* ip = IP/mask */ O_IP_SRC_ME, /* none */ O_IP_SRC_SET, /* u32=base, arg1=len, bitmap */ O_IP_DST, /* u32 = IP */ O_IP_DST_MASK, /* ip = IP/mask */ O_IP_DST_ME, /* none */ O_IP_DST_SET, /* u32=base, arg1=len, bitmap */ O_IP_SRCPORT, /* (n)port list:mask 4 byte ea */ O_IP_DSTPORT, /* (n)port list:mask 4 byte ea */ O_PROTO, /* arg1=protocol */ O_MACADDR2, /* 2 mac addr:mask */ O_MAC_TYPE, /* same as srcport */ O_LAYER2, /* none */ O_IN, /* none */ O_FRAG, /* none */ O_RECV, /* none */ O_XMIT, /* none */ O_VIA, /* none */ O_IPOPT, /* arg1 = 2*u8 bitmap */ O_IPLEN, /* arg1 = len */ O_IPID, /* arg1 = id */ O_IPTOS, /* arg1 = id */ O_IPPRECEDENCE, /* arg1 = precedence << 5 */ O_IPTTL, /* arg1 = TTL */ O_IPVER, /* arg1 = version */ O_UID, /* u32 = id */ O_GID, /* u32 = id */ O_ESTAB, /* none (tcp established) */ O_TCPFLAGS, /* arg1 = 2*u8 bitmap */ O_TCPWIN, /* arg1 = desired win */ O_TCPSEQ, /* u32 = desired seq. */ O_TCPACK, /* u32 = desired seq. */ O_ICMPTYPE, /* u32 = icmp bitmap */ O_TCPOPTS, /* arg1 = 2*u8 bitmap */ O_VERREVPATH, /* none */ O_VERSRCREACH, /* none */ O_PROBE_STATE, /* none */ O_KEEP_STATE, /* none */ O_LIMIT, /* ipfw_insn_limit */ O_LIMIT_PARENT, /* dyn_type, not an opcode. */ /* * These are really 'actions'. */ O_LOG, /* ipfw_insn_log */ O_PROB, /* u32 = match probability */ O_CHECK_STATE, /* none */ O_ACCEPT, /* none */ O_DENY, /* none */ O_REJECT, /* arg1=icmp arg (same as deny) */ O_COUNT, /* none */ O_SKIPTO, /* arg1=next rule number */ O_PIPE, /* arg1=pipe number */ O_QUEUE, /* arg1=queue number */ O_DIVERT, /* arg1=port number */ O_TEE, /* arg1=port number */ O_FORWARD_IP, /* fwd sockaddr */ O_FORWARD_MAC, /* fwd mac */ O_NAT, /* nope */ O_REASS, /* none */ /* * More opcodes. */ O_IPSEC, /* has ipsec history */ O_IP_SRC_LOOKUP, /* arg1=table number, u32=value */ O_IP_DST_LOOKUP, /* arg1=table number, u32=value */ O_ANTISPOOF, /* none */ O_JAIL, /* u32 = id */ O_ALTQ, /* u32 = altq classif. qid */ O_DIVERTED, /* arg1=bitmap (1:loop, 2:out) */ O_TCPDATALEN, /* arg1 = tcp data len */ O_IP6_SRC, /* address without mask */ O_IP6_SRC_ME, /* my addresses */ O_IP6_SRC_MASK, /* address with the mask */ O_IP6_DST, O_IP6_DST_ME, O_IP6_DST_MASK, O_FLOW6ID, /* for flow id tag in the ipv6 pkt */ O_ICMP6TYPE, /* icmp6 packet type filtering */ O_EXT_HDR, /* filtering for ipv6 extension header */ O_IP6, /* * actions for ng_ipfw */ O_NETGRAPH, /* send to ng_ipfw */ O_NGTEE, /* copy to ng_ipfw */ O_IP4, O_UNREACH6, /* arg1=icmpv6 code arg (deny) */ O_TAG, /* arg1=tag number */ O_TAGGED, /* arg1=tag number */ O_SETFIB, /* arg1=FIB number */ O_FIB, /* arg1=FIB desired fib number */ O_SOCKARG, /* socket argument */ O_CALLRETURN, /* arg1=called rule number */ O_FORWARD_IP6, /* fwd sockaddr_in6 */ O_LAST_OPCODE /* not an opcode! */ }; /* * The extension header are filtered only for presence using a bit * vector with a flag for each header. */ #define EXT_FRAGMENT 0x1 #define EXT_HOPOPTS 0x2 #define EXT_ROUTING 0x4 #define EXT_AH 0x8 #define EXT_ESP 0x10 #define EXT_DSTOPTS 0x20 #define EXT_RTHDR0 0x40 #define EXT_RTHDR2 0x80 /* * Template for instructions. * * ipfw_insn is used for all instructions which require no operands, * a single 16-bit value (arg1), or a couple of 8-bit values. * * For other instructions which require different/larger arguments * we have derived structures, ipfw_insn_*. * * The size of the instruction (in 32-bit words) is in the low * 6 bits of "len". The 2 remaining bits are used to implement * NOT and OR on individual instructions. Given a type, you can * compute the length to be put in "len" using F_INSN_SIZE(t) * * F_NOT negates the match result of the instruction. * * F_OR is used to build or blocks. By default, instructions * are evaluated as part of a logical AND. An "or" block * { X or Y or Z } contains F_OR set in all but the last * instruction of the block. A match will cause the code * to skip past the last instruction of the block. * * NOTA BENE: in a couple of places we assume that * sizeof(ipfw_insn) == sizeof(u_int32_t) * this needs to be fixed. * */ typedef struct _ipfw_insn { /* template for instructions */ u_int8_t opcode; u_int8_t len; /* number of 32-bit words */ #define F_NOT 0x80 #define F_OR 0x40 #define F_LEN_MASK 0x3f #define F_LEN(cmd) ((cmd)->len & F_LEN_MASK) u_int16_t arg1; } ipfw_insn; /* * The F_INSN_SIZE(type) computes the size, in 4-byte words, of * a given type. */ #define F_INSN_SIZE(t) ((sizeof (t))/sizeof(u_int32_t)) /* * This is used to store an array of 16-bit entries (ports etc.) */ typedef struct _ipfw_insn_u16 { ipfw_insn o; u_int16_t ports[2]; /* there may be more */ } ipfw_insn_u16; /* * This is used to store an array of 32-bit entries * (uid, single IPv4 addresses etc.) */ typedef struct _ipfw_insn_u32 { ipfw_insn o; u_int32_t d[1]; /* one or more */ } ipfw_insn_u32; /* * This is used to store IP addr-mask pairs. */ typedef struct _ipfw_insn_ip { ipfw_insn o; struct in_addr addr; struct in_addr mask; } ipfw_insn_ip; /* * This is used to forward to a given address (ip). */ typedef struct _ipfw_insn_sa { ipfw_insn o; struct sockaddr_in sa; } ipfw_insn_sa; /* * This is used to forward to a given address (ipv6). */ typedef struct _ipfw_insn_sa6 { ipfw_insn o; struct sockaddr_in6 sa; } ipfw_insn_sa6; /* * This is used for MAC addr-mask pairs. */ typedef struct _ipfw_insn_mac { ipfw_insn o; u_char addr[12]; /* dst[6] + src[6] */ u_char mask[12]; /* dst[6] + src[6] */ } ipfw_insn_mac; /* * This is used for interface match rules (recv xx, xmit xx). */ typedef struct _ipfw_insn_if { ipfw_insn o; union { struct in_addr ip; int glob; } p; char name[IFNAMSIZ]; } ipfw_insn_if; /* * This is used for storing an altq queue id number. */ typedef struct _ipfw_insn_altq { ipfw_insn o; u_int32_t qid; } ipfw_insn_altq; /* * This is used for limit rules. */ typedef struct _ipfw_insn_limit { ipfw_insn o; u_int8_t _pad; u_int8_t limit_mask; /* combination of DYN_* below */ #define DYN_SRC_ADDR 0x1 #define DYN_SRC_PORT 0x2 #define DYN_DST_ADDR 0x4 #define DYN_DST_PORT 0x8 u_int16_t conn_limit; } ipfw_insn_limit; /* * This is used for log instructions. */ typedef struct _ipfw_insn_log { ipfw_insn o; u_int32_t max_log; /* how many do we log -- 0 = all */ u_int32_t log_left; /* how many left to log */ } ipfw_insn_log; /* * Data structures required by both ipfw(8) and ipfw(4) but not part of the * management API are protected by IPFW_INTERNAL. */ #ifdef IPFW_INTERNAL /* Server pool support (LSNAT). */ struct cfg_spool { LIST_ENTRY(cfg_spool) _next; /* chain of spool instances */ struct in_addr addr; u_short port; }; #endif /* Redirect modes id. */ #define REDIR_ADDR 0x01 #define REDIR_PORT 0x02 #define REDIR_PROTO 0x04 #ifdef IPFW_INTERNAL /* Nat redirect configuration. */ struct cfg_redir { LIST_ENTRY(cfg_redir) _next; /* chain of redir instances */ u_int16_t mode; /* type of redirect mode */ struct in_addr laddr; /* local ip address */ struct in_addr paddr; /* public ip address */ struct in_addr raddr; /* remote ip address */ u_short lport; /* local port */ u_short pport; /* public port */ u_short rport; /* remote port */ u_short pport_cnt; /* number of public ports */ u_short rport_cnt; /* number of remote ports */ int proto; /* protocol: tcp/udp */ struct alias_link **alink; /* num of entry in spool chain */ u_int16_t spool_cnt; /* chain of spool instances */ LIST_HEAD(spool_chain, cfg_spool) spool_chain; }; #endif #define NAT_BUF_LEN 1024 #ifdef IPFW_INTERNAL /* Nat configuration data struct. */ struct cfg_nat { /* chain of nat instances */ LIST_ENTRY(cfg_nat) _next; int id; /* nat id */ struct in_addr ip; /* nat ip address */ char if_name[IF_NAMESIZE]; /* interface name */ int mode; /* aliasing mode */ struct libalias *lib; /* libalias instance */ /* number of entry in spool chain */ int redir_cnt; /* chain of redir instances */ LIST_HEAD(redir_chain, cfg_redir) redir_chain; }; #endif #define SOF_NAT sizeof(struct cfg_nat) #define SOF_REDIR sizeof(struct cfg_redir) #define SOF_SPOOL sizeof(struct cfg_spool) /* Nat command. */ typedef struct _ipfw_insn_nat { ipfw_insn o; struct cfg_nat *nat; } ipfw_insn_nat; /* Apply ipv6 mask on ipv6 addr */ #define APPLY_MASK(addr,mask) \ (addr)->__u6_addr.__u6_addr32[0] &= (mask)->__u6_addr.__u6_addr32[0]; \ (addr)->__u6_addr.__u6_addr32[1] &= (mask)->__u6_addr.__u6_addr32[1]; \ (addr)->__u6_addr.__u6_addr32[2] &= (mask)->__u6_addr.__u6_addr32[2]; \ (addr)->__u6_addr.__u6_addr32[3] &= (mask)->__u6_addr.__u6_addr32[3]; /* Structure for ipv6 */ typedef struct _ipfw_insn_ip6 { ipfw_insn o; struct in6_addr addr6; struct in6_addr mask6; } ipfw_insn_ip6; /* Used to support icmp6 types */ typedef struct _ipfw_insn_icmp6 { ipfw_insn o; uint32_t d[7]; /* XXX This number si related to the netinet/icmp6.h * define ICMP6_MAXTYPE * as follows: n = ICMP6_MAXTYPE/32 + 1 * Actually is 203 */ } ipfw_insn_icmp6; /* * Here we have the structure representing an ipfw rule. * * It starts with a general area (with link fields and counters) * followed by an array of one or more instructions, which the code * accesses as an array of 32-bit values. * * Given a rule pointer r: * * r->cmd is the start of the first instruction. * ACTION_PTR(r) is the start of the first action (things to do * once a rule matched). * * When assembling instruction, remember the following: * * + if a rule has a "keep-state" (or "limit") option, then the * first instruction (at r->cmd) MUST BE an O_PROBE_STATE * + if a rule has a "log" option, then the first action * (at ACTION_PTR(r)) MUST be O_LOG * + if a rule has an "altq" option, it comes after "log" * + if a rule has an O_TAG option, it comes after "log" and "altq" * * NOTE: we use a simple linked list of rules because we never need * to delete a rule without scanning the list. We do not use * queue(3) macros for portability and readability. */ struct ip_fw { #ifdef _X64EMU int32_t pad1; #endif struct ip_fw *x_next; /* linked list of rules */ #ifdef _X64EMU int32_t pad2; #endif struct ip_fw *next_rule; /* ptr to next [skipto] rule */ /* 'next_rule' is used to pass up 'set_disable' status */ uint16_t act_ofs; /* offset of action in 32-bit units */ uint16_t cmd_len; /* # of 32-bit words in cmd */ uint16_t rulenum; /* rule number */ uint8_t set; /* rule set (0..31) */ #define RESVD_SET 31 /* set for default and persistent rules */ uint8_t _pad; /* padding */ uint32_t id; /* rule id */ /* These fields are present in all rules. */ uint64_t pcnt; /* Packet counter */ uint64_t bcnt; /* Byte counter */ uint32_t timestamp; /* tv_sec of last match */ ipfw_insn cmd[1]; /* storage for commands */ }; #define ACTION_PTR(rule) \ (ipfw_insn *)( (u_int32_t *)((rule)->cmd) + ((rule)->act_ofs) ) #define RULESIZE(rule) (sizeof(struct ip_fw) + \ ((struct ip_fw *)(rule))->cmd_len * 4 - 4) #if 1 // should be moved to in.h /* * This structure is used as a flow mask and a flow id for various * parts of the code. * addr_type is used in userland and kernel to mark the address type. * fib is used in the kernel to record the fib in use. * _flags is used in the kernel to store tcp flags for dynamic rules. */ struct ipfw_flow_id { uint32_t dst_ip; uint32_t src_ip; uint16_t dst_port; uint16_t src_port; uint8_t fib; uint8_t proto; uint8_t _flags; /* protocol-specific flags */ uint8_t addr_type; /* 4=ip4, 6=ip6, 1=ether ? */ struct in6_addr dst_ip6; struct in6_addr src_ip6; uint32_t flow_id6; uint32_t extra; /* queue/pipe or frag_id */ }; #endif #define IS_IP6_FLOW_ID(id) ((id)->addr_type == 6) /* * Dynamic ipfw rule. */ typedef struct _ipfw_dyn_rule ipfw_dyn_rule; struct _ipfw_dyn_rule { ipfw_dyn_rule *next; /* linked list of rules. */ struct ip_fw *rule; /* pointer to rule */ /* 'rule' is used to pass up the rule number (from the parent) */ ipfw_dyn_rule *parent; /* pointer to parent rule */ u_int64_t pcnt; /* packet match counter */ u_int64_t bcnt; /* byte match counter */ struct ipfw_flow_id id; /* (masked) flow id */ u_int32_t expire; /* expire time */ u_int32_t bucket; /* which bucket in hash table */ u_int32_t state; /* state of this rule (typically a * combination of TCP flags) */ u_int32_t ack_fwd; /* most recent ACKs in forward */ u_int32_t ack_rev; /* and reverse directions (used */ /* to generate keepalives) */ u_int16_t dyn_type; /* rule type */ u_int16_t count; /* refcount */ }; /* * Definitions for IP option names. */ #define IP_FW_IPOPT_LSRR 0x01 #define IP_FW_IPOPT_SSRR 0x02 #define IP_FW_IPOPT_RR 0x04 #define IP_FW_IPOPT_TS 0x08 /* * Definitions for TCP option names. */ #define IP_FW_TCPOPT_MSS 0x01 #define IP_FW_TCPOPT_WINDOW 0x02 #define IP_FW_TCPOPT_SACK 0x04 #define IP_FW_TCPOPT_TS 0x08 #define IP_FW_TCPOPT_CC 0x10 #define ICMP_REJECT_RST 0x100 /* fake ICMP code (send a TCP RST) */ #define ICMP6_UNREACH_RST 0x100 /* fake ICMPv6 code (send a TCP RST) */ /* * These are used for lookup tables. */ #define IPFW_TABLE_CIDR 1 /* Table for holding IPv4/IPv6 prefixes */ #define IPFW_TABLE_INTERFACE 2 /* Table for holding interface names */ #define IPFW_TABLE_MAXTYPE 2 /* Maximum valid number */ typedef struct _ipfw_table_entry { in_addr_t addr; /* network address */ u_int32_t value; /* value */ u_int16_t tbl; /* table number */ u_int8_t masklen; /* mask length */ } ipfw_table_entry; typedef struct _ipfw_table_xentry { uint16_t len; /* Total entry length */ uint8_t type; /* entry type */ uint8_t masklen; /* mask length */ uint16_t tbl; /* table number */ uint32_t value; /* value */ union { /* Longest field needs to be aligned by 4-byte boundary */ struct in6_addr addr6; /* IPv6 address */ char iface[IF_NAMESIZE]; /* interface name */ } k; } ipfw_table_xentry; typedef struct _ipfw_table { u_int32_t size; /* size of entries in bytes */ u_int32_t cnt; /* # of entries */ u_int16_t tbl; /* table number */ ipfw_table_entry ent[0]; /* entries */ } ipfw_table; typedef struct _ipfw_xtable { ip_fw3_opheader opheader; /* eXtended tables are controlled via IP_FW3 */ uint32_t size; /* size of entries in bytes */ uint32_t cnt; /* # of entries */ uint16_t tbl; /* table number */ uint8_t type; /* table type */ ipfw_table_xentry xent[0]; /* entries */ } ipfw_xtable; #endif /* _IPFW2_H */ ipfw3-2012/sys/netinet/tcp.h000644 000423 000000 00000017464 12006744011 016160 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 1982, 1986, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)tcp.h 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netinet/tcp.h,v 1.40.2.2 2008/07/31 06:10:25 kmacy Exp $ */ #ifndef _NETINET_TCP_H_ #define _NETINET_TCP_H_ #include #define __BSD_VISIBLE 1 #if __BSD_VISIBLE typedef u_int32_t tcp_seq; #define tcp6_seq tcp_seq /* for KAME src sync over BSD*'s */ #define tcp6hdr tcphdr /* for KAME src sync over BSD*'s */ /* * TCP header. * Per RFC 793, September, 1981. */ struct tcphdr { u_short th_sport; /* source port */ u_short th_dport; /* destination port */ tcp_seq th_seq; /* sequence number */ tcp_seq th_ack; /* acknowledgement number */ #if BYTE_ORDER == LITTLE_ENDIAN u_char th_x2:4, /* (unused) */ th_off:4; /* data offset */ #endif #if BYTE_ORDER == BIG_ENDIAN u_char th_off:4, /* data offset */ th_x2:4; /* (unused) */ #endif u_char th_flags; #define TH_FIN 0x01 #define TH_SYN 0x02 #define TH_RST 0x04 #define TH_PUSH 0x08 #define TH_ACK 0x10 #define TH_URG 0x20 #define TH_ECE 0x40 #define TH_CWR 0x80 #define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_PUSH|TH_ACK|TH_URG|TH_ECE|TH_CWR) #define PRINT_TH_FLAGS "\20\1FIN\2SYN\3RST\4PUSH\5ACK\6URG\7ECE\10CWR" u_short th_win; /* window */ u_short th_sum; /* checksum */ u_short th_urp; /* urgent pointer */ }; #define TCPOPT_EOL 0 #define TCPOLEN_EOL 1 #define TCPOPT_PAD 0 /* padding after EOL */ #define TCPOLEN_PAD 1 #define TCPOPT_NOP 1 #define TCPOLEN_NOP 1 #define TCPOPT_MAXSEG 2 #define TCPOLEN_MAXSEG 4 #define TCPOPT_WINDOW 3 #define TCPOLEN_WINDOW 3 #define TCPOPT_SACK_PERMITTED 4 #define TCPOLEN_SACK_PERMITTED 2 #define TCPOPT_SACK 5 #define TCPOLEN_SACKHDR 2 #define TCPOLEN_SACK 8 /* 2*sizeof(tcp_seq) */ #define TCPOPT_TIMESTAMP 8 #define TCPOLEN_TIMESTAMP 10 #define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */ #define TCPOPT_SIGNATURE 19 /* Keyed MD5: RFC 2385 */ #define TCPOLEN_SIGNATURE 18 /* Miscellaneous constants */ #define MAX_SACK_BLKS 6 /* Max # SACK blocks stored at receiver side */ #define TCP_MAX_SACK 4 /* MAX # SACKs sent in any segment */ /* * Default maximum segment size for TCP. * With an IP MTU of 576, this is 536, * but 512 is probably more convenient. * This should be defined as MIN(512, IP_MSS - sizeof (struct tcpiphdr)). */ #define TCP_MSS 512 /* * TCP_MINMSS is defined to be 216 which is fine for the smallest * link MTU (256 bytes, AX.25 packet radio) in the Internet. * However it is very unlikely to come across such low MTU interfaces * these days (anno dato 2003). * See tcp_subr.c tcp_minmss SYSCTL declaration for more comments. * Setting this to "0" disables the minmss check. */ #define TCP_MINMSS 216 /* * Default maximum segment size for TCP6. * With an IP6 MSS of 1280, this is 1220, * but 1024 is probably more convenient. (xxx kazu in doubt) * This should be defined as MIN(1024, IP6_MSS - sizeof (struct tcpip6hdr)) */ #define TCP6_MSS 1024 #define TCP_MAXWIN 65535 /* largest value for (unscaled) window */ #define TTCP_CLIENT_SND_WND 4096 /* dflt send window for T/TCP client */ #define TCP_MAX_WINSHIFT 14 /* maximum window shift */ #define TCP_MAXBURST 4 /* maximum segments in a burst */ #define TCP_MAXHLEN (0xf<<2) /* max length of header in bytes */ #define TCP_MAXOLEN (TCP_MAXHLEN - sizeof(struct tcphdr)) /* max space left for options */ #endif /* __BSD_VISIBLE */ /* * User-settable options (used with setsockopt). */ #define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ #if __BSD_VISIBLE #define TCP_MAXSEG 0x02 /* set maximum segment size */ #define TCP_NOPUSH 0x04 /* don't push last block of write */ #define TCP_NOOPT 0x08 /* don't use TCP options */ #define TCP_MD5SIG 0x10 /* use MD5 digests (RFC2385) */ #define TCP_INFO 0x20 /* retrieve tcp_info structure */ #define TCP_CONGESTION 0x40 /* get/set congestion control algorithm */ #define TCP_CA_NAME_MAX 16 /* max congestion control name length */ #define TCPI_OPT_TIMESTAMPS 0x01 #define TCPI_OPT_SACK 0x02 #define TCPI_OPT_WSCALE 0x04 #define TCPI_OPT_ECN 0x08 #define TCPI_OPT_TOE 0x10 /* * The TCP_INFO socket option comes from the Linux 2.6 TCP API, and permits * the caller to query certain information about the state of a TCP * connection. We provide an overlapping set of fields with the Linux * implementation, but since this is a fixed size structure, room has been * left for growth. In order to maximize potential future compatibility with * the Linux API, the same variable names and order have been adopted, and * padding left to make room for omitted fields in case they are added later. * * XXX: This is currently an unstable ABI/API, in that it is expected to * change. */ struct tcp_info { u_int8_t tcpi_state; /* TCP FSM state. */ u_int8_t __tcpi_ca_state; u_int8_t __tcpi_retransmits; u_int8_t __tcpi_probes; u_int8_t __tcpi_backoff; u_int8_t tcpi_options; /* Options enabled on conn. */ u_int8_t tcpi_snd_wscale:4, /* RFC1323 send shift value. */ tcpi_rcv_wscale:4; /* RFC1323 recv shift value. */ u_int32_t __tcpi_rto; u_int32_t __tcpi_ato; u_int32_t __tcpi_snd_mss; u_int32_t __tcpi_rcv_mss; u_int32_t __tcpi_unacked; u_int32_t __tcpi_sacked; u_int32_t __tcpi_lost; u_int32_t __tcpi_retrans; u_int32_t __tcpi_fackets; /* Times; measurements in usecs. */ u_int32_t __tcpi_last_data_sent; u_int32_t __tcpi_last_ack_sent; /* Also unimpl. on Linux? */ u_int32_t __tcpi_last_data_recv; u_int32_t __tcpi_last_ack_recv; /* Metrics; variable units. */ u_int32_t __tcpi_pmtu; u_int32_t __tcpi_rcv_ssthresh; u_int32_t tcpi_rtt; /* Smoothed RTT in usecs. */ u_int32_t tcpi_rttvar; /* RTT variance in usecs. */ u_int32_t tcpi_snd_ssthresh; /* Slow start threshold. */ u_int32_t tcpi_snd_cwnd; /* Send congestion window. */ u_int32_t __tcpi_advmss; u_int32_t __tcpi_reordering; u_int32_t __tcpi_rcv_rtt; u_int32_t tcpi_rcv_space; /* Advertised recv window. */ /* FreeBSD extensions to tcp_info. */ u_int32_t tcpi_snd_wnd; /* Advertised send window. */ u_int32_t tcpi_snd_bwnd; /* Bandwidth send window. */ u_int32_t tcpi_snd_nxt; /* Next egress seqno */ u_int32_t tcpi_rcv_nxt; /* Next ingress seqno */ u_int32_t tcpi_toe_tid; /* HWTID for TOE endpoints */ /* Padding to grow without breaking ABI. */ u_int32_t __tcpi_pad[29]; /* Padding. */ }; #endif #endif /* !_NETINET_TCP_H_ */ ipfw3-2012/sys/netinet/ip.h000644 000423 000000 00000003244 12006744011 015771 0ustar00luigiwheel000000 000000 #ifndef _NETINET_IP_H_ #define _NETINET_IP_H_ #define LITTLE_ENDIAN 1234 #define BIG_ENDIAN 4321 #if defined(__BIG_ENDIAN) #define BYTE_ORDER BIG_ENDIAN //#warning we are in bigendian #elif defined(__LITTLE_ENDIAN) //#warning we are in littleendian #define BYTE_ORDER LITTLE_ENDIAN #else #error no platform #endif /* XXX endiannes doesn't belong here */ // #define LITTLE_ENDIAN 1234 // #define BIG_ENDIAN 4321 // #define BYTE_ORDER LITTLE_ENDIAN /* * Structure of an internet header, naked of options. */ struct ip { #if BYTE_ORDER == LITTLE_ENDIAN u_char ip_hl:4, /* header length */ ip_v:4; /* version */ #endif #if BYTE_ORDER == BIG_ENDIAN u_char ip_v:4, /* version */ ip_hl:4; /* header length */ #endif u_char ip_tos; /* type of service */ u_short ip_len; /* total length */ u_short ip_id; /* identification */ u_short ip_off; /* fragment offset field */ #define IP_RF 0x8000 /* reserved fragment flag */ #define IP_DF 0x4000 /* dont fragment flag */ #define IP_MF 0x2000 /* more fragments flag */ #define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ u_char ip_ttl; /* time to live */ u_char ip_p; /* protocol */ u_short ip_sum; /* checksum */ struct in_addr ip_src,ip_dst; /* source and dest address */ } __packed __aligned(4); #define IPTOS_LOWDELAY 0x10 #endif /* _NETINET_IP_H_ */ ipfw3-2012/sys/netinet/udp.h000644 000423 000000 00000004705 12006744011 016154 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 1982, 1986, 1993 * The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)udp.h 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netinet/udp.h,v 1.10 2007/02/20 10:13:11 rwatson Exp $ */ #ifndef _NETINET_UDP_H_ #define _NETINET_UDP_H_ /* * UDP protocol header. * Per RFC 768, September, 1981. */ struct udphdr { u_short uh_sport; /* source port */ u_short uh_dport; /* destination port */ u_short uh_ulen; /* udp length */ u_short uh_sum; /* udp checksum */ }; /* * User-settable options (used with setsockopt). */ #define UDP_ENCAP 0x01 /* * UDP Encapsulation of IPsec Packets options. */ /* Encapsulation types. */ #define UDP_ENCAP_ESPINUDP_NON_IKE 1 /* draft-ietf-ipsec-nat-t-ike-00/01 */ #define UDP_ENCAP_ESPINUDP 2 /* draft-ietf-ipsec-udp-encaps-02+ */ /* Default ESP in UDP encapsulation port. */ #define UDP_ENCAP_ESPINUDP_PORT 500 /* Maximum UDP fragment size for ESP over UDP. */ #define UDP_ENCAP_ESPINUDP_MAXFRAGLEN 552 #endif ipfw3-2012/sys/netinet/ipfw/dn_heap.c000644 000423 000000 00000036743 12006744011 017731 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 1998-2002,2010 Luigi Rizzo, Universita` di Pisa * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * Binary heap and hash tables, used in dummynet * * $Id: dn_heap.c 11480 2012-07-31 08:02:00Z luigi $ */ #include #include #ifdef _KERNEL __FBSDID("$FreeBSD: user/luigi/ipfw3-head/sys/netinet/ipfw/dn_heap.c 203279 2010-01-31 12:20:29Z luigi $"); #include #include #include #include #ifndef log #define log(x, arg...) #endif #else /* !_KERNEL */ #include #include #include #include #include "dn_heap.h" #define log(x, arg...) fprintf(stderr, ## arg) #define panic(x...) fprintf(stderr, ## x), exit(1) #define MALLOC_DEFINE(a, b, c) static void *my_malloc(int s) { return malloc(s); } static void my_free(void *p) { free(p); } #define malloc(s, t, w) my_malloc(s) #define free(p, t) my_free(p) #endif /* !_KERNEL */ MALLOC_DEFINE(M_DN_HEAP, "dummynet", "dummynet heap"); /* * Heap management functions. * * In the heap, first node is element 0. Children of i are 2i+1 and 2i+2. * Some macros help finding parent/children so we can optimize them. * * heap_init() is called to expand the heap when needed. * Increment size in blocks of 16 entries. * Returns 1 on error, 0 on success */ #define HEAP_FATHER(x) ( ( (x) - 1 ) / 2 ) #define HEAP_LEFT(x) ( (x)+(x) + 1 ) #define HEAP_SWAP(a, b, buffer) { buffer = a ; a = b ; b = buffer ; } #define HEAP_INCREMENT 15 static int heap_resize(struct dn_heap *h, unsigned int new_size) { struct dn_heap_entry *p; if (h->size >= new_size ) /* have enough room */ return 0; #if 1 /* round to the next power of 2 */ new_size |= new_size >> 1; new_size |= new_size >> 2; new_size |= new_size >> 4; new_size |= new_size >> 8; new_size |= new_size >> 16; #else new_size = (new_size + HEAP_INCREMENT ) & ~HEAP_INCREMENT; #endif p = malloc(new_size * sizeof(*p), M_DN_HEAP, M_NOWAIT); if (p == NULL) { printf("--- %s, resize %d failed\n", __func__, new_size ); return 1; /* error */ } if (h->size > 0) { bcopy(h->p, p, h->size * sizeof(*p) ); free(h->p, M_DN_HEAP); } h->p = p; h->size = new_size; return 0; } int heap_init(struct dn_heap *h, int size, int ofs) { if (heap_resize(h, size)) return 1; h->elements = 0; h->ofs = ofs; return 0; } /* * Insert element in heap. Normally, p != NULL, we insert p in * a new position and bubble up. If p == NULL, then the element is * already in place, and key is the position where to start the * bubble-up. * Returns 1 on failure (cannot allocate new heap entry) * * If ofs > 0 the position (index, int) of the element in the heap is * also stored in the element itself at the given offset in bytes. */ #define SET_OFFSET(h, i) do { \ if (h->ofs > 0) \ *((int32_t *)((char *)(h->p[i].object) + h->ofs)) = i; \ } while (0) /* * RESET_OFFSET is used for sanity checks. It sets ofs * to an invalid value. */ #define RESET_OFFSET(h, i) do { \ if (h->ofs > 0) \ *((int32_t *)((char *)(h->p[i].object) + h->ofs)) = -16; \ } while (0) int heap_insert(struct dn_heap *h, uint64_t key1, void *p) { int son = h->elements; //log("%s key %llu p %p\n", __FUNCTION__, key1, p); if (p == NULL) { /* data already there, set starting point */ son = key1; } else { /* insert new element at the end, possibly resize */ son = h->elements; if (son == h->size) /* need resize... */ // XXX expand by 16 or so if (heap_resize(h, h->elements+16) ) return 1; /* failure... */ h->p[son].object = p; h->p[son].key = key1; h->elements++; } /* make sure that son >= father along the path */ while (son > 0) { int father = HEAP_FATHER(son); struct dn_heap_entry tmp; if (DN_KEY_LT( h->p[father].key, h->p[son].key ) ) break; /* found right position */ /* son smaller than father, swap and repeat */ HEAP_SWAP(h->p[son], h->p[father], tmp); SET_OFFSET(h, son); son = father; } SET_OFFSET(h, son); return 0; } /* * remove top element from heap, or obj if obj != NULL */ void heap_extract(struct dn_heap *h, void *obj) { int child, father, max = h->elements - 1; if (max < 0) { printf("--- %s: empty heap 0x%p\n", __FUNCTION__, h); return; } if (obj == NULL) father = 0; /* default: move up smallest child */ else { /* extract specific element, index is at offset */ if (h->ofs <= 0) panic("%s: extract from middle not set on %p\n", __FUNCTION__, h); father = *((int *)((char *)obj + h->ofs)); if (father < 0 || father >= h->elements) { panic("%s: father %d out of bound 0..%d\n", __FUNCTION__, father, h->elements); } } /* * below, father is the index of the empty element, which * we replace at each step with the smallest child until we * reach the bottom level. */ // XXX why removing RESET_OFFSET increases runtime by 10% ? RESET_OFFSET(h, father); while ( (child = HEAP_LEFT(father)) <= max ) { if (child != max && DN_KEY_LT(h->p[child+1].key, h->p[child].key) ) child++; /* take right child, otherwise left */ h->p[father] = h->p[child]; SET_OFFSET(h, father); father = child; } h->elements--; if (father != max) { /* * Fill hole with last entry and bubble up, * reusing the insert code */ h->p[father] = h->p[max]; heap_insert(h, father, NULL); } } #if 0 /* * change object position and update references * XXX this one is never used! */ static void heap_move(struct dn_heap *h, uint64_t new_key, void *object) { int temp, i, max = h->elements-1; struct dn_heap_entry *p, buf; if (h->ofs <= 0) panic("cannot move items on this heap"); p = h->p; /* shortcut */ i = *((int *)((char *)object + h->ofs)); if (DN_KEY_LT(new_key, p[i].key) ) { /* must move up */ p[i].key = new_key; for (; i>0 && DN_KEY_LT(new_key, p[(temp = HEAP_FATHER(i))].key); i = temp ) { /* bubble up */ HEAP_SWAP(p[i], p[temp], buf); SET_OFFSET(h, i); } } else { /* must move down */ p[i].key = new_key; while ( (temp = HEAP_LEFT(i)) <= max ) { /* found left child */ if (temp != max && DN_KEY_LT(p[temp+1].key, p[temp].key)) temp++; /* select child with min key */ if (DN_KEY_LT(>p[temp].key, new_key)) { /* go down */ HEAP_SWAP(p[i], p[temp], buf); SET_OFFSET(h, i); } else break; i = temp; } } SET_OFFSET(h, i); } #endif /* heap_move, unused */ /* * heapify() will reorganize data inside an array to maintain the * heap property. It is needed when we delete a bunch of entries. */ static void heapify(struct dn_heap *h) { int i; for (i = 0; i < h->elements; i++ ) heap_insert(h, i , NULL); } int heap_scan(struct dn_heap *h, int (*fn)(void *, uintptr_t), uintptr_t arg) { int i, ret, found; for (i = found = 0 ; i < h->elements ;) { ret = fn(h->p[i].object, arg); if (ret & HEAP_SCAN_DEL) { h->elements-- ; h->p[i] = h->p[h->elements] ; found++ ; } else i++ ; if (ret & HEAP_SCAN_END) break; } if (found) heapify(h); return found; } /* * cleanup the heap and free data structure */ void heap_free(struct dn_heap *h) { if (h->size >0 ) free(h->p, M_DN_HEAP); bzero(h, sizeof(*h) ); } /* * hash table support. */ struct dn_ht { int buckets; /* how many buckets, really buckets - 1*/ int entries; /* how many entries */ int ofs; /* offset of link field */ uint32_t (*hash)(uintptr_t, int, void *arg); int (*match)(void *_el, uintptr_t key, int, void *); void *(*newh)(uintptr_t, int, void *); void **ht; /* bucket heads */ }; /* * Initialize, allocating bucket pointers inline. * Recycle previous record if possible. * If the 'newh' function is not supplied, we assume that the * key passed to ht_find is the same object to be stored in. */ struct dn_ht * dn_ht_init(struct dn_ht *ht, int buckets, int ofs, uint32_t (*h)(uintptr_t, int, void *), int (*match)(void *, uintptr_t, int, void *), void *(*newh)(uintptr_t, int, void *)) { int l; /* * Notes about rounding bucket size to a power of two. * Given the original bucket size, we compute the nearest lower and * higher power of two, minus 1 (respectively b_min and b_max) because * this value will be used to do an AND with the index returned * by hash function. * To choice between these two values, the original bucket size is * compared with b_min. If the original size is greater than 4/3 b_min, * we round the bucket size to b_max, else to b_min. * This ratio try to round to the nearest power of two, advantaging * the greater size if the different between two power is relatively * big. * Rounding the bucket size to a power of two avoid the use of * module when calculating the correct bucket. * The ht->buckets variable store the bucket size - 1 to simply * do an AND between the index returned by hash function and ht->bucket * instead of a module. */ int b_min; /* min buckets */ int b_max; /* max buckets */ int b_ori; /* original buckets */ if (h == NULL || match == NULL) { printf("--- missing hash or match function"); return NULL; } if (buckets < 1 || buckets > 65536) return NULL; b_ori = buckets; /* calculate next power of 2, - 1*/ buckets |= buckets >> 1; buckets |= buckets >> 2; buckets |= buckets >> 4; buckets |= buckets >> 8; buckets |= buckets >> 16; b_max = buckets; /* Next power */ b_min = buckets >> 1; /* Previous power */ /* Calculate the 'nearest' bucket size */ if (b_min * 4000 / 3000 < b_ori) buckets = b_max; else buckets = b_min; if (ht) { /* see if we can reuse */ if (buckets <= ht->buckets) { ht->buckets = buckets; } else { /* free pointers if not allocated inline */ if (ht->ht != (void *)(ht + 1)) free(ht->ht, M_DN_HEAP); free(ht, M_DN_HEAP); ht = NULL; } } if (ht == NULL) { /* Allocate buckets + 1 entries because buckets is use to * do the AND with the index returned by hash function */ l = sizeof(*ht) + (buckets + 1) * sizeof(void **); ht = malloc(l, M_DN_HEAP, M_NOWAIT | M_ZERO); } if (ht) { ht->ht = (void **)(ht + 1); ht->buckets = buckets; ht->ofs = ofs; ht->hash = h; ht->match = match; ht->newh = newh; } return ht; } /* dummy callback for dn_ht_free to unlink all */ static int do_del(void *obj, void *arg) { return DNHT_SCAN_DEL; } void dn_ht_free(struct dn_ht *ht, int flags) { if (ht == NULL) return; if (flags & DNHT_REMOVE) { (void)dn_ht_scan(ht, do_del, NULL); } else { if (ht->ht && ht->ht != (void *)(ht + 1)) free(ht->ht, M_DN_HEAP); free(ht, M_DN_HEAP); } } int dn_ht_entries(struct dn_ht *ht) { return ht ? ht->entries : 0; } /* * Helper function to scan a bucket in the hash table, it * can only be called on a non-empty bucket for a valid table. * * In lookup and scan, consider ht->ht[i] as pointing to the tail * of the queue (head is NEXTP(tail). The 'empty' value is irrelevant. * While searching, start analysing p = head, end when p == tail. * Note that 'tail' is a cache of the _original_ ht->ht[i] * and is used to check for loop termination. If you remove * it, you must also adjust 'p' when deleting the 'tail' element. */ #define NEXT(_h, _p) *((void **)((char *)(_p) + (_h)->ofs)) static int dn_ht_scan_body(struct dn_ht *ht, int *bucket, int (*fn)(void *, void *), void *arg) { int ret, found = 0, i = *bucket; void *tail, *pp, *p, *nextp; pp = tail = ht->ht[i]; do { p = NEXT(ht, pp); nextp = NEXT(ht, p); ret = fn(p, arg); if ((ret & DNHT_SCAN_DEL) == 0) { pp = p; /* prepare for next loop */ } else { found++; ht->entries--; /* skip current element */ if (pp != p) /* pp == p implies p == tail */ NEXT(ht, pp) = nextp; if (p == tail) ht->ht[i] = (pp != p) ? pp : NULL; } if (ret & DNHT_SCAN_END) { /* Update ht->ht[i] before returning */ ht->ht[i] = (ht->ht[i] == NULL) ? NULL : pp; return found; } } while (p != tail); (*bucket)++; return found; } /* * lookup and optionally create or delete element. * This is an optimized version of the scan so it is coded * inline. */ void * dn_ht_find(struct dn_ht *ht, uintptr_t key, int flags, void *arg) { int i, found; void *tail, *pp, *p; /* pp is the prev element, pp is current */ if (ht == NULL) /* easy on an empty hash */ return NULL; i = (ht->buckets == 1) ? 0 : (ht->hash(key, flags, arg) & ht->buckets); pp = tail = ht->ht[i]; if (tail) { /* non empty, try a lookup */ do { p = NEXT(ht, pp); found = (flags & DNHT_MATCH_PTR) ? key == (uintptr_t)p : ht->match(p, key, flags, arg); if (!found) continue; if (flags & DNHT_REMOVE) { ht->entries--; if (p != pp) /* skip current element */ NEXT(ht, pp) = NEXT(ht, p); if (p == tail) ht->ht[i] = (pp != p) ? pp : NULL; } return p; } while ( (pp = p) != tail); } /* not found */ if ((flags & DNHT_INSERT) == 0) return NULL; p = ht->newh ? ht->newh(key, flags, arg) : (void *)key; if (p) { ht->entries++; if (tail == NULL) { ht->ht[i] = NEXT(ht, p) = p; } else { NEXT(ht, p) = NEXT(ht, tail); NEXT(ht, tail) = p; } } return p; } /* * do a scan with the option to delete the object. * Similar to the lookup, but the match function is different, * and we extract 'next' before running the callback because * the element may be destroyed there. */ int dn_ht_scan(struct dn_ht *ht, int (*fn)(void *, void *), void *arg) { int i, bucket, found = 0; if (ht == NULL || fn == NULL) return 0; for (i = 0; i <= ht->buckets; i++) { if (ht->ht[i] == NULL) continue; /* empty bucket */ bucket = i; found += dn_ht_scan_body(ht, &bucket, fn, arg); if (bucket == i) /* early exit */ return found; } return found; } /* * Similar to dn_ht_scan(), except that the scan is performed only * in the bucket 'bucket'. The function returns a correct bucket number if * the original is invalid. * If the callback returns DNHT_SCAN_END, the function move the ht->ht[i] * pointer to the last entry processed. Moreover, the bucket number passed * by caller is decremented, because usually the caller increment it. */ int dn_ht_scan_bucket(struct dn_ht *ht, int *bucket, int (*fn)(void *, void *), void *arg) { if (ht == NULL || fn == NULL) return 0; if (*bucket > ht->buckets || *bucket < 0) *bucket = 0; if (ht->ht[*bucket] == NULL) { (*bucket)++; return 0; } else return dn_ht_scan_body(ht, bucket, fn, arg); } ipfw3-2012/sys/netinet/ipfw/dn_sched_prio.c000644 000423 000000 00000014315 12006744011 021122 0ustar00luigiwheel000000 000000 /* * Copyright (c) 2010 Riccardo Panicucci, Universita` di Pisa * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: dn_sched_prio.c 11480 2012-07-31 08:02:00Z luigi $ */ #ifdef _KERNEL #include #include #include #include #include #include #include /* IFNAMSIZ */ #include #include /* ipfw_rule_ref */ #include /* flow_id */ #include #include #include #include #else #include #endif #define DN_SCHED_PRIO 5 //XXX #if !defined(_KERNEL) || !defined(__linux__) #define test_bit(ix, pData) ((*pData) & (1<<(ix))) #define __set_bit(ix, pData) (*pData) |= (1<<(ix)) #define __clear_bit(ix, pData) (*pData) &= ~(1<<(ix)) #endif #ifdef __MIPSEL__ #define __clear_bit(ix, pData) (*pData) &= ~(1<<(ix)) #endif /* Size of the array of queues pointers. */ #define BITMAP_T unsigned long #define MAXPRIO (sizeof(BITMAP_T) * 8) /* * The scheduler instance contains an array of pointers to queues, * one for each priority, and a bitmap listing backlogged queues. */ struct prio_si { BITMAP_T bitmap; /* array bitmap */ struct dn_queue *q_array[MAXPRIO]; /* Array of queues pointers */ }; /* * If a queue with the same priority is already backlogged, use * that one instead of the queue passed as argument. */ static int prio_enqueue(struct dn_sch_inst *_si, struct dn_queue *q, struct mbuf *m) { struct prio_si *si = (struct prio_si *)(_si + 1); int prio = q->fs->fs.par[0]; if (test_bit(prio, &si->bitmap) == 0) { /* No queue with this priority, insert */ __set_bit(prio, &si->bitmap); si->q_array[prio] = q; } else { /* use the existing queue */ q = si->q_array[prio]; } if (dn_enqueue(q, m, 0)) return 1; return 0; } /* * Packets are dequeued only from the highest priority queue. * The function ffs() return the lowest bit in the bitmap that rapresent * the array index (-1) which contains the pointer to the highest priority * queue. * After the dequeue, if this queue become empty, it is index is removed * from the bitmap. * Scheduler is idle if the bitmap is empty * * NOTE: highest priority is 0, lowest is sched->max_prio_q */ static struct mbuf * prio_dequeue(struct dn_sch_inst *_si) { struct prio_si *si = (struct prio_si *)(_si + 1); struct mbuf *m; struct dn_queue *q; int prio; if (si->bitmap == 0) /* scheduler idle */ return NULL; prio = ffs(si->bitmap) - 1; /* Take the highest priority queue in the scheduler */ q = si->q_array[prio]; // assert(q) m = dn_dequeue(q); if (q->mq.head == NULL) { /* Queue is now empty, remove from scheduler * and mark it */ si->q_array[prio] = NULL; __clear_bit(prio, &si->bitmap); } return m; } static int prio_new_sched(struct dn_sch_inst *_si) { struct prio_si *si = (struct prio_si *)(_si + 1); bzero(si->q_array, sizeof(si->q_array)); si->bitmap = 0; return 0; } static int prio_new_fsk(struct dn_fsk *fs) { /* Check if the prioritiy is between 0 and MAXPRIO-1 */ ipdn_bound_var(&fs->fs.par[0], 0, 0, MAXPRIO - 1, "PRIO priority"); return 0; } static int prio_new_queue(struct dn_queue *q) { struct prio_si *si = (struct prio_si *)(q->_si + 1); int prio = q->fs->fs.par[0]; struct dn_queue *oldq; q->ni.oid.subtype = DN_SCHED_PRIO; if (q->mq.head == NULL) return 0; /* Queue already full, must insert in the scheduler or append * mbufs to existing queue. This partly duplicates prio_enqueue */ if (test_bit(prio, &si->bitmap) == 0) { /* No queue with this priority, insert */ __set_bit(prio, &si->bitmap); si->q_array[prio] = q; } else if ( (oldq = si->q_array[prio]) != q) { /* must append to the existing queue. * can simply append q->mq.head to q2->... * and add the counters to those of q2 */ oldq->mq.tail->m_nextpkt = q->mq.head; oldq->mq.tail = q->mq.tail; oldq->ni.length += q->ni.length; q->ni.length = 0; oldq->ni.len_bytes += q->ni.len_bytes; q->ni.len_bytes = 0; q->mq.tail = q->mq.head = NULL; } return 0; } static int prio_free_queue(struct dn_queue *q, int safe) { int prio = q->fs->fs.par[0]; struct prio_si *si = (struct prio_si *)(q->_si + 1); if (si->q_array[prio] == q) { si->q_array[prio] = NULL; __clear_bit(prio, &si->bitmap); } return 0; } static struct dn_alg prio_desc = { _SI( .type = ) DN_SCHED_PRIO, _SI( .name = ) "PRIO", _SI( .flags = ) DN_MULTIQUEUE, /* we need extra space in the si and the queue */ _SI( .schk_datalen = ) 0, _SI( .si_datalen = ) sizeof(struct prio_si), _SI( .q_datalen = ) 0, _SI( .enqueue = ) prio_enqueue, _SI( .dequeue = ) prio_dequeue, _SI( .config = ) NULL, _SI( .destroy = ) NULL, _SI( .new_sched = ) prio_new_sched, _SI( .free_sched = ) NULL, _SI( .new_fsk = ) prio_new_fsk, _SI( .free_fsk = ) NULL, _SI( .new_queue = ) prio_new_queue, _SI( .free_queue = ) prio_free_queue, }; DECLARE_DNSCHED_MODULE(dn_prio, &prio_desc); ipfw3-2012/sys/netinet/ipfw/ip_fw_private.h000644 000423 000000 00000022630 12006744011 021164 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 2002-2009 Luigi Rizzo, Universita` di Pisa * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD: head/sys/netinet/ipfw/ip_fw_private.h 200601 2009-12-16 10:48:40Z luigi $ */ #ifndef _IPFW2_PRIVATE_H #define _IPFW2_PRIVATE_H /* * Internal constants and data structures used by ipfw components * and not meant to be exported outside the kernel. */ #ifdef _KERNEL /* * For platforms that do not have SYSCTL support, we wrap the * SYSCTL_* into a function (one per file) to collect the values * into an array at module initialization. The wrapping macros, * SYSBEGIN() and SYSEND, are empty in the default case. */ #ifndef SYSBEGIN #define SYSBEGIN(x) #endif #ifndef SYSEND #define SYSEND #endif /* Return values from ipfw_chk() */ enum { IP_FW_PASS = 0, IP_FW_DENY, IP_FW_DIVERT, IP_FW_TEE, IP_FW_DUMMYNET, IP_FW_NETGRAPH, IP_FW_NGTEE, IP_FW_NAT, IP_FW_REASS, }; /* * Structure for collecting parameters to dummynet for ip6_output forwarding */ struct _ip6dn_args { struct ip6_pktopts *opt_or; struct route_in6 ro_or; int flags_or; struct ip6_moptions *im6o_or; struct ifnet *origifp_or; struct ifnet *ifp_or; struct sockaddr_in6 dst_or; u_long mtu_or; struct route_in6 ro_pmtu_or; }; /* * Arguments for calling ipfw_chk() and dummynet_io(). We put them * all into a structure because this way it is easier and more * efficient to pass variables around and extend the interface. */ struct ip_fw_args { struct mbuf *m; /* the mbuf chain */ struct ifnet *oif; /* output interface */ struct sockaddr_in *next_hop; /* forward address */ /* * On return, it points to the matching rule. * On entry, rule.slot > 0 means the info is valid and * contains the the starting rule for an ipfw search. * If chain_id == chain->id && slot >0 then jump to that slot. * Otherwise, we locate the first rule >= rulenum:rule_id */ struct ipfw_rule_ref rule; /* match/restart info */ struct ether_header *eh; /* for bridged packets */ struct ipfw_flow_id f_id; /* grabbed from IP header */ //uint32_t cookie; /* a cookie depending on rule action */ struct inpcb *inp; struct _ip6dn_args dummypar; /* dummynet->ip6_output */ struct sockaddr_in hopstore; /* store here if cannot use a pointer */ }; MALLOC_DECLARE(M_IPFW); /* * Hooks sometime need to know the direction of the packet * (divert, dummynet, netgraph, ...) * We use a generic definition here, with bit0-1 indicating the * direction, bit 2 indicating layer2 or 3, bit 3-4 indicating the * specific protocol * indicating the protocol (if necessary) */ enum { DIR_MASK = 0x3, DIR_OUT = 0, DIR_IN = 1, DIR_FWD = 2, DIR_DROP = 3, PROTO_LAYER2 = 0x4, /* set for layer 2 */ /* PROTO_DEFAULT = 0, */ PROTO_IPV4 = 0x08, PROTO_IPV6 = 0x10, PROTO_IFB = 0x0c, /* layer2 + ifbridge */ /* PROTO_OLDBDG = 0x14, unused, old bridge */ }; /* wrapper for freeing a packet, in case we need to do more work */ #ifndef FREE_PKT #if defined(__linux__) || defined(_WIN32) #define FREE_PKT(m) netisr_dispatch(-1, m) #else #define FREE_PKT(m) m_freem(m) #endif #endif /* !FREE_PKT */ /* * Function definitions. */ /* attach (arg = 1) or detach (arg = 0) hooks */ int ipfw_attach_hooks(int); #ifdef NOTYET void ipfw_nat_destroy(void); #endif /* In ip_fw_log.c */ struct ip; void ipfw_log_bpf(int); void ipfw_log(struct ip_fw *f, u_int hlen, struct ip_fw_args *args, struct mbuf *m, struct ifnet *oif, u_short offset, uint32_t tablearg, struct ip *ip); VNET_DECLARE(u_int64_t, norule_counter); #define V_norule_counter VNET(norule_counter) VNET_DECLARE(int, verbose_limit); #define V_verbose_limit VNET(verbose_limit) /* In ip_fw_dynamic.c */ enum { /* result for matching dynamic rules */ MATCH_REVERSE = 0, MATCH_FORWARD, MATCH_NONE, MATCH_UNKNOWN, }; /* * The lock for dynamic rules is only used once outside the file, * and only to release the result of lookup_dyn_rule(). * Eventually we may implement it with a callback on the function. */ void ipfw_dyn_unlock(void); struct tcphdr; struct mbuf *ipfw_send_pkt(struct mbuf *, struct ipfw_flow_id *, u_int32_t, u_int32_t, int); int ipfw_install_state(struct ip_fw *rule, ipfw_insn_limit *cmd, struct ip_fw_args *args, uint32_t tablearg); ipfw_dyn_rule *ipfw_lookup_dyn_rule(struct ipfw_flow_id *pkt, int *match_direction, struct tcphdr *tcp); void ipfw_remove_dyn_children(struct ip_fw *rule); void ipfw_get_dynamic(char **bp, const char *ep); void ipfw_dyn_attach(void); /* uma_zcreate .... */ void ipfw_dyn_detach(void); /* uma_zdestroy ... */ void ipfw_dyn_init(void); /* per-vnet initialization */ void ipfw_dyn_uninit(int); /* per-vnet deinitialization */ int ipfw_dyn_len(void); /* common variables */ VNET_DECLARE(int, fw_one_pass); #define V_fw_one_pass VNET(fw_one_pass) VNET_DECLARE(int, fw_verbose); #define V_fw_verbose VNET(fw_verbose) VNET_DECLARE(struct ip_fw_chain, layer3_chain); #define V_layer3_chain VNET(layer3_chain) VNET_DECLARE(u_int32_t, set_disable); #define V_set_disable VNET(set_disable) VNET_DECLARE(int, autoinc_step); #define V_autoinc_step VNET(autoinc_step) struct ip_fw_chain { struct ip_fw *rules; /* list of rules */ struct ip_fw *reap; /* list of rules to reap */ struct ip_fw *default_rule; int n_rules; /* number of static rules */ int static_len; /* total len of static rules */ struct ip_fw **map; /* array of rule ptrs to ease lookup */ LIST_HEAD(nat_list, cfg_nat) nat; /* list of nat entries */ struct radix_node_head *tables[IPFW_TABLES_MAX]; #if defined( __linux__ ) || defined( _WIN32 ) spinlock_t rwmtx; spinlock_t uh_lock; #else struct rwlock rwmtx; struct rwlock uh_lock; /* lock for upper half */ #endif uint32_t id; /* ruleset id */ }; struct sockopt; /* used by tcp_var.h */ /* * The lock is heavily used by ip_fw2.c (the main file) and ip_fw_nat.c * so the variable and the macros must be here. */ #define IPFW_LOCK_INIT(_chain) do { \ rw_init(&(_chain)->rwmtx, "IPFW static rules"); \ rw_init(&(_chain)->uh_lock, "IPFW UH lock"); \ } while (0) #define IPFW_LOCK_DESTROY(_chain) do { \ rw_destroy(&(_chain)->rwmtx); \ rw_destroy(&(_chain)->uh_lock); \ } while (0) #define IPFW_WLOCK_ASSERT(_chain) rw_assert(&(_chain)->rwmtx, RA_WLOCKED) #define IPFW_RLOCK(p) rw_rlock(&(p)->rwmtx) #define IPFW_RUNLOCK(p) rw_runlock(&(p)->rwmtx) #define IPFW_WLOCK(p) rw_wlock(&(p)->rwmtx) #define IPFW_WUNLOCK(p) rw_wunlock(&(p)->rwmtx) #define IPFW_UH_RLOCK(p) rw_rlock(&(p)->uh_lock) #define IPFW_UH_RUNLOCK(p) rw_runlock(&(p)->uh_lock) #define IPFW_UH_WLOCK(p) rw_wlock(&(p)->uh_lock) #define IPFW_UH_WUNLOCK(p) rw_wunlock(&(p)->uh_lock) /* In ip_fw_sockopt.c */ int ipfw_find_rule(struct ip_fw_chain *chain, uint32_t key, uint32_t id); int ipfw_add_rule(struct ip_fw_chain *chain, struct ip_fw *input_rule); int ipfw_ctl(struct sockopt *sopt); int ipfw_chk(struct ip_fw_args *args); void ipfw_reap_rules(struct ip_fw *head); /* In ip_fw_pfil */ int ipfw_check_hook(void *arg, struct mbuf **m0, struct ifnet *ifp, int dir, struct inpcb *inp); /* In ip_fw_table.c */ struct radix_node; int ipfw_lookup_table(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, uint32_t *val); int ipfw_init_tables(struct ip_fw_chain *ch); void ipfw_destroy_tables(struct ip_fw_chain *ch); int ipfw_flush_table(struct ip_fw_chain *ch, uint16_t tbl); int ipfw_add_table_entry(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, uint8_t mlen, uint32_t value); int ipfw_dump_table_entry(struct radix_node *rn, void *arg); int ipfw_del_table_entry(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, uint8_t mlen); int ipfw_count_table(struct ip_fw_chain *ch, uint32_t tbl, uint32_t *cnt); int ipfw_dump_table(struct ip_fw_chain *ch, ipfw_table *tbl); /* In ip_fw_nat.c -- XXX to be moved to ip_var.h */ extern struct cfg_nat *(*lookup_nat_ptr)(struct nat_list *, int); typedef int ipfw_nat_t(struct ip_fw_args *, struct cfg_nat *, struct mbuf *); typedef int ipfw_nat_cfg_t(struct sockopt *); extern ipfw_nat_t *ipfw_nat_ptr; #define IPFW_NAT_LOADED (ipfw_nat_ptr != NULL) extern ipfw_nat_cfg_t *ipfw_nat_cfg_ptr; extern ipfw_nat_cfg_t *ipfw_nat_del_ptr; extern ipfw_nat_cfg_t *ipfw_nat_get_cfg_ptr; extern ipfw_nat_cfg_t *ipfw_nat_get_log_ptr; #endif /* _KERNEL */ #endif /* _IPFW2_PRIVATE_H */ ipfw3-2012/sys/netinet/ipfw/dn_heap.h000644 000423 000000 00000017001 12006744011 017720 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 1998-2010 Luigi Rizzo, Universita` di Pisa * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * Binary heap and hash tables, header file * * $FreeBSD: head/sys/netinet/ipfw/dn_heap.h 204865 2010-03-08 11:27:08Z luigi $ */ #ifndef _IP_DN_HEAP_H #define _IP_DN_HEAP_H #define DN_KEY_LT(a,b) ((int64_t)((a)-(b)) < 0) #define DN_KEY_LEQ(a,b) ((int64_t)((a)-(b)) <= 0) /* * This module implements a binary heap supporting random extraction. * * A heap entry contains an uint64_t key and a pointer to object. * DN_KEY_LT(a,b) returns true if key 'a' is smaller than 'b' * * The heap is a struct dn_heap plus a dynamically allocated * array of dn_heap_entry entries. 'size' represents the size of * the array, 'elements' count entries in use. The topmost * element has the smallest key. * The heap supports ordered insert, and extract from the top. * To extract an object from the middle of the heap, we the object * must reserve an 'int32_t' to store the position of the object * in the heap itself, and the location of this field must be * passed as an argument to heap_init() -- use -1 if the feature * is not used. */ struct dn_heap_entry { uint64_t key; /* sorting key, smallest comes first */ void *object; /* object pointer */ }; struct dn_heap { int size; /* the size of the array */ int elements; /* elements in use */ int ofs; /* offset in the object of heap index */ struct dn_heap_entry *p; /* array of "size" entries */ }; enum { HEAP_SCAN_DEL = 1, HEAP_SCAN_END = 2, }; /* * heap_init() reinitializes the heap setting the size and the offset * of the index for random extraction (use -1 if not used). * The 'elements' counter is set to 0. * * SET_HEAP_OFS() indicates where, in the object, is stored the index * for random extractions from the heap. * * heap_free() frees the memory associated to a heap. * * heap_insert() adds a key-pointer pair to the heap * * HEAP_TOP() returns a pointer to the top element of the heap, * but makes no checks on its existance (XXX should we change ?) * * heap_extract() removes the entry at the top, returing the pointer. * (the key should have been read before). * * heap_scan() invokes a callback on each entry of the heap. * The callback can return a combination of HEAP_SCAN_DEL and * HEAP_SCAN_END. HEAP_SCAN_DEL means the current element must * be removed, and HEAP_SCAN_END means to terminate the scan. * heap_scan() returns the number of elements removed. * Because the order is not guaranteed, we should use heap_scan() * only as a last resort mechanism. */ #define HEAP_TOP(h) ((h)->p) #define SET_HEAP_OFS(h, n) do { (h)->ofs = n; } while (0) int heap_init(struct dn_heap *h, int size, int ofs); int heap_insert(struct dn_heap *h, uint64_t key1, void *p); void heap_extract(struct dn_heap *h, void *obj); void heap_free(struct dn_heap *h); int heap_scan(struct dn_heap *, int (*)(void *, uintptr_t), uintptr_t); /*------------------------------------------------------ * This module implements a generic hash table with support for * running callbacks on the entire table. To avoid allocating * memory during hash table operations, objects must reserve * space for a link field. XXX if the heap is moderately full, * an SLIST suffices, and we can tolerate the cost of a hash * computation on each removal. * * dn_ht_init() initializes the table, setting the number of * buckets, the offset of the link field, the main callbacks. * Callbacks are: * * hash(key, flags, arg) called to return a bucket index. * match(obj, key, flags, arg) called to determine if key * matches the current 'obj' in the heap * newh(key, flags, arg) optional, used to allocate a new * object during insertions. * * dn_ht_free() frees the heap or unlink elements. * DNHT_REMOVE unlink elements, 0 frees the heap. * You need two calls to do both. * * dn_ht_find() is the main lookup function, which can also be * used to insert or delete elements in the hash table. * The final 'arg' is passed to all callbacks. * * dn_ht_scan() is used to invoke a callback on all entries of * the heap, or possibly on just one bucket. The callback * is invoked with a pointer to the object, and must return * one of DNHT_SCAN_DEL or DNHT_SCAN_END to request the * removal of the object from the heap and the end of the * scan, respectively. * * dn_ht_scan_bucket() is similar to dn_ht_scan(), except that it scans * only the specific bucket of the table. The bucket is a in-out * parameter and return a valid bucket number if the original * is invalid. * * A combination of flags can be used to modify the operation * of the dn_ht_find(), and of the callbacks: * * DNHT_KEY_IS_OBJ means the key is the object pointer. * It is usally of interest for the hash and match functions. * * DNHT_MATCH_PTR during a lookup, match pointers instead * of calling match(). Normally used when removing specific * entries. Does not imply KEY_IS_OBJ as the latter _is_ used * by the match function. * * DNHT_INSERT insert the element if not found. * Calls new() to allocates a new object unless * DNHT_KEY_IS_OBJ is set. * * DNHT_UNIQUE only insert if object not found. * XXX should it imply DNHT_INSERT ? * * DNHT_REMOVE remove objects if we find them. */ struct dn_ht; /* should be opaque */ struct dn_ht *dn_ht_init(struct dn_ht *, int buckets, int ofs, uint32_t (*hash)(uintptr_t, int, void *), int (*match)(void *, uintptr_t, int, void *), void *(*newh)(uintptr_t, int, void *)); void dn_ht_free(struct dn_ht *, int flags); void *dn_ht_find(struct dn_ht *, uintptr_t, int, void *); int dn_ht_scan(struct dn_ht *, int (*)(void *, void *), void *); int dn_ht_scan_bucket(struct dn_ht *, int * , int (*)(void *, void *), void *); int dn_ht_entries(struct dn_ht *); enum { /* flags values. * first two are returned by the scan callback to indicate * to delete the matching element or to end the scan */ DNHT_SCAN_DEL = 0x0001, DNHT_SCAN_END = 0x0002, DNHT_KEY_IS_OBJ = 0x0004, /* key is the obj pointer */ DNHT_MATCH_PTR = 0x0008, /* match by pointer, not match() */ DNHT_INSERT = 0x0010, /* insert if not found */ DNHT_UNIQUE = 0x0020, /* report error if already there */ DNHT_REMOVE = 0x0040, /* remove on find or dn_ht_free */ }; #endif /* _IP_DN_HEAP_H */ ipfw3-2012/sys/netinet/ipfw/ip_dn_glue.c000644 000423 000000 00000054360 12010150105 020421 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 2010 Riccardo Panicucci, Universita` di Pisa * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: ip_dn_glue.c 11659 2012-08-07 08:41:22Z luigi $ * * Binary compatibility support for /sbin/ipfw RELENG_7 and RELENG_8 */ #include "opt_inet6.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* IFNAMSIZ, struct ifaddr, ifq head, lock.h mutex.h */ #include #include /* ip_output(), IP_FORWARDING */ #include #include #include #include #include #include /* FREEBSD7.2 ip_dummynet.h r191715*/ struct dn_heap_entry7 { int64_t key; /* sorting key. Topmost element is smallest one */ void *object; /* object pointer */ }; struct dn_heap7 { int size; int elements; int offset; /* XXX if > 0 this is the offset of direct ptr to obj */ struct dn_heap_entry7 *p; /* really an array of "size" entries */ }; /* Common to 7.2 and 8 */ struct dn_flow_set { SLIST_ENTRY(dn_flow_set) next; /* linked list in a hash slot */ u_short fs_nr ; /* flow_set number */ u_short flags_fs; #define DNOLD_HAVE_FLOW_MASK 0x0001 #define DNOLD_IS_RED 0x0002 #define DNOLD_IS_GENTLE_RED 0x0004 #define DNOLD_QSIZE_IS_BYTES 0x0008 /* queue size is measured in bytes */ #define DNOLD_NOERROR 0x0010 /* do not report ENOBUFS on drops */ #define DNOLD_HAS_PROFILE 0x0020 /* the pipe has a delay profile. */ #define DNOLD_IS_PIPE 0x4000 #define DNOLD_IS_QUEUE 0x8000 struct dn_pipe7 *pipe ; /* pointer to parent pipe */ u_short parent_nr ; /* parent pipe#, 0 if local to a pipe */ int weight ; /* WFQ queue weight */ int qsize ; /* queue size in slots or bytes */ int plr ; /* pkt loss rate (2^31-1 means 100%) */ struct ipfw_flow_id flow_mask ; /* hash table of queues onto this flow_set */ int rq_size ; /* number of slots */ int rq_elements ; /* active elements */ struct dn_flow_queue7 **rq; /* array of rq_size entries */ u_int32_t last_expired ; /* do not expire too frequently */ int backlogged ; /* #active queues for this flowset */ /* RED parameters */ #define SCALE_RED 16 #define SCALE(x) ( (x) << SCALE_RED ) #define SCALE_VAL(x) ( (x) >> SCALE_RED ) #define SCALE_MUL(x,y) ( ( (x) * (y) ) >> SCALE_RED ) int w_q ; /* queue weight (scaled) */ int max_th ; /* maximum threshold for queue (scaled) */ int min_th ; /* minimum threshold for queue (scaled) */ int max_p ; /* maximum value for p_b (scaled) */ u_int c_1 ; /* max_p/(max_th-min_th) (scaled) */ u_int c_2 ; /* max_p*min_th/(max_th-min_th) (scaled) */ u_int c_3 ; /* for GRED, (1-max_p)/max_th (scaled) */ u_int c_4 ; /* for GRED, 1 - 2*max_p (scaled) */ u_int * w_q_lookup ; /* lookup table for computing (1-w_q)^t */ u_int lookup_depth ; /* depth of lookup table */ int lookup_step ; /* granularity inside the lookup table */ int lookup_weight ; /* equal to (1-w_q)^t / (1-w_q)^(t+1) */ int avg_pkt_size ; /* medium packet size */ int max_pkt_size ; /* max packet size */ }; SLIST_HEAD(dn_flow_set_head, dn_flow_set); #define DN_IS_PIPE 0x4000 #define DN_IS_QUEUE 0x8000 struct dn_flow_queue7 { struct dn_flow_queue7 *next ; struct ipfw_flow_id id ; struct mbuf *head, *tail ; /* queue of packets */ u_int len ; u_int len_bytes ; u_long numbytes; u_int64_t tot_pkts ; /* statistics counters */ u_int64_t tot_bytes ; u_int32_t drops ; int hash_slot ; /* debugging/diagnostic */ /* RED parameters */ int avg ; /* average queue length est. (scaled) */ int count ; /* arrivals since last RED drop */ int random ; /* random value (scaled) */ u_int32_t q_time; /* start of queue idle time */ /* WF2Q+ support */ struct dn_flow_set *fs ; /* parent flow set */ int heap_pos ; /* position (index) of struct in heap */ int64_t sched_time ; /* current time when queue enters ready_heap */ int64_t S,F ; /* start time, finish time */ }; struct dn_pipe7 { /* a pipe */ SLIST_ENTRY(dn_pipe7) next; /* linked list in a hash slot */ int pipe_nr ; /* number */ int bandwidth; /* really, bytes/tick. */ int delay ; /* really, ticks */ struct mbuf *head, *tail ; /* packets in delay line */ /* WF2Q+ */ struct dn_heap7 scheduler_heap ; /* top extract - key Finish time*/ struct dn_heap7 not_eligible_heap; /* top extract- key Start time */ struct dn_heap7 idle_heap ; /* random extract - key Start=Finish time */ int64_t V ; /* virtual time */ int sum; /* sum of weights of all active sessions */ int numbytes; int64_t sched_time ; /* time pipe was scheduled in ready_heap */ /* * When the tx clock come from an interface (if_name[0] != '\0'), its name * is stored below, whereas the ifp is filled when the rule is configured. */ char if_name[IFNAMSIZ]; struct ifnet *ifp ; int ready ; /* set if ifp != NULL and we got a signal from it */ struct dn_flow_set fs ; /* used with fixed-rate flows */ }; SLIST_HEAD(dn_pipe_head7, dn_pipe7); /* FREEBSD8 ip_dummynet.h r196045 */ struct dn_flow_queue8 { struct dn_flow_queue8 *next ; struct ipfw_flow_id id ; struct mbuf *head, *tail ; /* queue of packets */ u_int len ; u_int len_bytes ; uint64_t numbytes ; /* credit for transmission (dynamic queues) */ int64_t extra_bits; /* extra bits simulating unavailable channel */ u_int64_t tot_pkts ; /* statistics counters */ u_int64_t tot_bytes ; u_int32_t drops ; int hash_slot ; /* debugging/diagnostic */ /* RED parameters */ int avg ; /* average queue length est. (scaled) */ int count ; /* arrivals since last RED drop */ int random ; /* random value (scaled) */ int64_t idle_time; /* start of queue idle time */ /* WF2Q+ support */ struct dn_flow_set *fs ; /* parent flow set */ int heap_pos ; /* position (index) of struct in heap */ int64_t sched_time ; /* current time when queue enters ready_heap */ int64_t S,F ; /* start time, finish time */ }; struct dn_pipe8 { /* a pipe */ SLIST_ENTRY(dn_pipe8) next; /* linked list in a hash slot */ int pipe_nr ; /* number */ int bandwidth; /* really, bytes/tick. */ int delay ; /* really, ticks */ struct mbuf *head, *tail ; /* packets in delay line */ /* WF2Q+ */ struct dn_heap7 scheduler_heap ; /* top extract - key Finish time*/ struct dn_heap7 not_eligible_heap; /* top extract- key Start time */ struct dn_heap7 idle_heap ; /* random extract - key Start=Finish time */ int64_t V ; /* virtual time */ int sum; /* sum of weights of all active sessions */ /* Same as in dn_flow_queue, numbytes can become large */ int64_t numbytes; /* bits I can transmit (more or less). */ uint64_t burst; /* burst size, scaled: bits * hz */ int64_t sched_time ; /* time pipe was scheduled in ready_heap */ int64_t idle_time; /* start of pipe idle time */ char if_name[IFNAMSIZ]; struct ifnet *ifp ; int ready ; /* set if ifp != NULL and we got a signal from it */ struct dn_flow_set fs ; /* used with fixed-rate flows */ /* fields to simulate a delay profile */ #define ED_MAX_NAME_LEN 32 char name[ED_MAX_NAME_LEN]; int loss_level; int samples_no; int *samples; }; #define ED_MAX_SAMPLES_NO 1024 struct dn_pipe_max8 { struct dn_pipe8 pipe; int samples[ED_MAX_SAMPLES_NO]; }; SLIST_HEAD(dn_pipe_head8, dn_pipe8); /* * Changes from 7.2 to 8: * dn_pipe: * numbytes from int to int64_t * add burst (int64_t) * add idle_time (int64_t) * add profile * add struct dn_pipe_max * add flag DN_HAS_PROFILE * * dn_flow_queue * numbytes from u_long to int64_t * add extra_bits (int64_t) * q_time from u_int32_t to int64_t and name idle_time * * dn_flow_set unchanged * */ /* NOTE:XXX copied from dummynet.c */ #define O_NEXT(p, len) ((void *)((char *)p + len)) static void oid_fill(struct dn_id *oid, int len, int type, uintptr_t id) { oid->len = len; oid->type = type; oid->subtype = 0; oid->id = id; } /* make room in the buffer and move the pointer forward */ static void * o_next(struct dn_id **o, int len, int type) { struct dn_id *ret = *o; oid_fill(ret, len, type, 0); *o = O_NEXT(*o, len); return ret; } static size_t pipesize7 = sizeof(struct dn_pipe7); static size_t pipesize8 = sizeof(struct dn_pipe8); static size_t pipesizemax8 = sizeof(struct dn_pipe_max8); /* Indicate 'ipfw' version * 1: from FreeBSD 7.2 * 0: from FreeBSD 8 * -1: unknow (for now is unused) * * It is update when a IP_DUMMYNET_DEL or IP_DUMMYNET_CONFIGURE request arrives * NOTE: if a IP_DUMMYNET_GET arrives and the 'ipfw' version is unknow, * it is suppose to be the FreeBSD 8 version. */ static int is7 = 0; static int convertflags2new(int src) { int dst = 0; if (src & DNOLD_HAVE_FLOW_MASK) dst |= DN_HAVE_MASK; if (src & DNOLD_QSIZE_IS_BYTES) dst |= DN_QSIZE_BYTES; if (src & DNOLD_NOERROR) dst |= DN_NOERROR; if (src & DNOLD_IS_RED) dst |= DN_IS_RED; if (src & DNOLD_IS_GENTLE_RED) dst |= DN_IS_GENTLE_RED; if (src & DNOLD_HAS_PROFILE) dst |= DN_HAS_PROFILE; return dst; } static int convertflags2old(int src) { int dst = 0; if (src & DN_HAVE_MASK) dst |= DNOLD_HAVE_FLOW_MASK; if (src & DN_IS_RED) dst |= DNOLD_IS_RED; if (src & DN_IS_GENTLE_RED) dst |= DNOLD_IS_GENTLE_RED; if (src & DN_NOERROR) dst |= DNOLD_NOERROR; if (src & DN_HAS_PROFILE) dst |= DNOLD_HAS_PROFILE; if (src & DN_QSIZE_BYTES) dst |= DNOLD_QSIZE_IS_BYTES; return dst; } static int dn_compat_del(void *v) { struct dn_pipe7 *p = (struct dn_pipe7 *) v; struct dn_pipe8 *p8 = (struct dn_pipe8 *) v; struct { struct dn_id oid; uintptr_t a[1]; /* add more if we want a list */ } cmd; /* XXX DN_API_VERSION ??? */ oid_fill((void *)&cmd, sizeof(cmd), DN_CMD_DELETE, DN_API_VERSION); if (is7) { if (p->pipe_nr == 0 && p->fs.fs_nr == 0) return EINVAL; if (p->pipe_nr != 0 && p->fs.fs_nr != 0) return EINVAL; } else { if (p8->pipe_nr == 0 && p8->fs.fs_nr == 0) return EINVAL; if (p8->pipe_nr != 0 && p8->fs.fs_nr != 0) return EINVAL; } if (p->pipe_nr != 0) { /* pipe x delete */ cmd.a[0] = p->pipe_nr; cmd.oid.subtype = DN_LINK; } else { /* queue x delete */ cmd.oid.subtype = DN_FS; cmd.a[0] = (is7) ? p->fs.fs_nr : p8->fs.fs_nr; } return do_config(&cmd, cmd.oid.len); } static int dn_compat_config_queue(struct dn_fs *fs, void* v) { struct dn_pipe7 *p7 = (struct dn_pipe7 *)v; struct dn_pipe8 *p8 = (struct dn_pipe8 *)v; struct dn_flow_set *f; if (is7) f = &p7->fs; else f = &p8->fs; fs->fs_nr = f->fs_nr; fs->sched_nr = f->parent_nr; fs->flow_mask = f->flow_mask; fs->buckets = f->rq_size; fs->qsize = f->qsize; fs->plr = f->plr; fs->par[0] = f->weight; fs->flags = convertflags2new(f->flags_fs); if (fs->flags & DN_IS_GENTLE_RED || fs->flags & DN_IS_RED) { fs->w_q = f->w_q; fs->max_th = f->max_th; fs->min_th = f->min_th; fs->max_p = f->max_p; } return 0; } static int dn_compat_config_pipe(struct dn_sch *sch, struct dn_link *p, struct dn_fs *fs, void* v) { struct dn_pipe7 *p7 = (struct dn_pipe7 *)v; struct dn_pipe8 *p8 = (struct dn_pipe8 *)v; int i = p7->pipe_nr; sch->sched_nr = i; sch->oid.subtype = 0; p->link_nr = i; fs->fs_nr = i + 2*DN_MAX_ID; fs->sched_nr = i + DN_MAX_ID; /* Common to 7 and 8 */ p->bandwidth = p7->bandwidth; p->delay = p7->delay; if (!is7) { /* FreeBSD 8 has burst */ p->burst = p8->burst; } /* fill the fifo flowset */ dn_compat_config_queue(fs, v); fs->fs_nr = i + 2*DN_MAX_ID; fs->sched_nr = i + DN_MAX_ID; /* Move scheduler related parameter from fs to sch */ sch->buckets = fs->buckets; /*XXX*/ fs->buckets = 0; if (fs->flags & DN_HAVE_MASK) { sch->flags |= DN_HAVE_MASK; fs->flags &= ~DN_HAVE_MASK; sch->sched_mask = fs->flow_mask; bzero(&fs->flow_mask, sizeof(struct ipfw_flow_id)); } return 0; } static int dn_compat_config_profile(struct dn_profile *pf, struct dn_link *p, void *v) { struct dn_pipe8 *p8 = (struct dn_pipe8 *)v; p8->samples = &(((struct dn_pipe_max8 *)p8)->samples[0]); pf->link_nr = p->link_nr; pf->loss_level = p8->loss_level; // pf->bandwidth = p->bandwidth; //XXX bandwidth redundant? pf->samples_no = p8->samples_no; strncpy(pf->name, p8->name,sizeof(pf->name)); bcopy(p8->samples, pf->samples, sizeof(pf->samples)); return 0; } /* * If p->pipe_nr != 0 the command is 'pipe x config', so need to create * the three main struct, else only a flowset is created */ static int dn_compat_configure(void *v) { struct dn_id *buf = NULL, *base; struct dn_sch *sch = NULL; struct dn_link *p = NULL; struct dn_fs *fs = NULL; struct dn_profile *pf = NULL; int lmax; int error; struct dn_pipe7 *p7 = (struct dn_pipe7 *)v; struct dn_pipe8 *p8 = (struct dn_pipe8 *)v; int i; /* number of object to configure */ lmax = sizeof(struct dn_id); /* command header */ lmax += sizeof(struct dn_sch) + sizeof(struct dn_link) + sizeof(struct dn_fs) + sizeof(struct dn_profile); base = buf = malloc(lmax, M_DUMMYNET, M_WAIT|M_ZERO); o_next(&buf, sizeof(struct dn_id), DN_CMD_CONFIG); base->id = DN_API_VERSION; /* pipe_nr is the same in p7 and p8 */ i = p7->pipe_nr; if (i != 0) { /* pipe config */ sch = o_next(&buf, sizeof(*sch), DN_SCH); p = o_next(&buf, sizeof(*p), DN_LINK); fs = o_next(&buf, sizeof(*fs), DN_FS); error = dn_compat_config_pipe(sch, p, fs, v); if (error) { free(buf, M_DUMMYNET); return error; } if (!is7 && p8->samples_no > 0) { /* Add profiles*/ pf = o_next(&buf, sizeof(*pf), DN_PROFILE); error = dn_compat_config_profile(pf, p, v); if (error) { free(buf, M_DUMMYNET); return error; } } } else { /* queue config */ fs = o_next(&buf, sizeof(*fs), DN_FS); error = dn_compat_config_queue(fs, v); if (error) { free(buf, M_DUMMYNET); return error; } } error = do_config(base, (char *)buf - (char *)base); if (buf) free(buf, M_DUMMYNET); return error; } int dn_compat_calc_size(void) { int need = 0; /* XXX use FreeBSD 8 struct size */ /* NOTE: * - half scheduler: schk_count/2 * - all flowset: fsk_count * - all flowset queues: queue_count * - all pipe queue: si_count */ need += dn_cfg.schk_count * sizeof(struct dn_pipe8) / 2; need += dn_cfg.fsk_count * sizeof(struct dn_flow_set); need += dn_cfg.si_count * sizeof(struct dn_flow_queue8); need += dn_cfg.queue_count * sizeof(struct dn_flow_queue8); return need; } int dn_c_copy_q (void *_ni, void *arg) { struct copy_args *a = arg; struct dn_flow_queue7 *fq7 = (struct dn_flow_queue7 *)*a->start; struct dn_flow_queue8 *fq8 = (struct dn_flow_queue8 *)*a->start; struct dn_flow *ni = (struct dn_flow *)_ni; int size = 0; /* XXX hash slot not set */ /* No difference between 7.2/8 */ fq7->len = ni->length; fq7->len_bytes = ni->len_bytes; fq7->id = ni->fid; if (is7) { size = sizeof(struct dn_flow_queue7); fq7->tot_pkts = ni->tot_pkts; fq7->tot_bytes = ni->tot_bytes; fq7->drops = ni->drops; } else { size = sizeof(struct dn_flow_queue8); fq8->tot_pkts = ni->tot_pkts; fq8->tot_bytes = ni->tot_bytes; fq8->drops = ni->drops; } *a->start += size; return 0; } int dn_c_copy_pipe(struct dn_schk *s, struct copy_args *a, int nq) { struct dn_link *l = &s->link; struct dn_fsk *f = s->fs; struct dn_pipe7 *pipe7 = (struct dn_pipe7 *)*a->start; struct dn_pipe8 *pipe8 = (struct dn_pipe8 *)*a->start; struct dn_flow_set *fs; int size = 0; if (is7) { fs = &pipe7->fs; size = sizeof(struct dn_pipe7); } else { fs = &pipe8->fs; size = sizeof(struct dn_pipe8); } /* These 4 field are the same in pipe7 and pipe8 */ pipe7->next.sle_next = (struct dn_pipe7 *)DN_IS_PIPE; pipe7->bandwidth = l->bandwidth; pipe7->delay = l->delay * 1000 / hz; pipe7->pipe_nr = l->link_nr - DN_MAX_ID; if (!is7) { if (s->profile) { struct dn_profile *pf = s->profile; strncpy(pipe8->name, pf->name, sizeof(pf->name)); pipe8->loss_level = pf->loss_level; pipe8->samples_no = pf->samples_no; } pipe8->burst = div64(l->burst , 8 * hz); } fs->flow_mask = s->sch.sched_mask; fs->rq_size = s->sch.buckets ? s->sch.buckets : 1; fs->parent_nr = l->link_nr - DN_MAX_ID; fs->qsize = f->fs.qsize; fs->plr = f->fs.plr; fs->w_q = f->fs.w_q; fs->max_th = f->max_th; fs->min_th = f->min_th; fs->max_p = f->fs.max_p; fs->rq_elements = nq; fs->flags_fs = convertflags2old(f->fs.flags); *a->start += size; return 0; } int dn_compat_copy_pipe(struct copy_args *a, void *_o) { int have = a->end - *a->start; int need = 0; int pipe_size = sizeof(struct dn_pipe8); int queue_size = sizeof(struct dn_flow_queue8); int n_queue = 0; /* number of queues */ struct dn_schk *s = (struct dn_schk *)_o; /* calculate needed space: * - struct dn_pipe * - if there are instances, dn_queue * n_instances */ n_queue = (s->sch.flags & DN_HAVE_MASK ? dn_ht_entries(s->siht) : (s->siht ? 1 : 0)); need = pipe_size + queue_size * n_queue; if (have < need) { D("have %d < need %d", have, need); return 1; } /* copy pipe */ dn_c_copy_pipe(s, a, n_queue); /* copy queues */ if (s->sch.flags & DN_HAVE_MASK) dn_ht_scan(s->siht, dn_c_copy_q, a); else if (s->siht) dn_c_copy_q(s->siht, a); return 0; } int dn_c_copy_fs(struct dn_fsk *f, struct copy_args *a, int nq) { struct dn_flow_set *fs = (struct dn_flow_set *)*a->start; fs->next.sle_next = (struct dn_flow_set *)DN_IS_QUEUE; fs->fs_nr = f->fs.fs_nr; fs->qsize = f->fs.qsize; fs->plr = f->fs.plr; fs->w_q = f->fs.w_q; fs->max_th = f->max_th; fs->min_th = f->min_th; fs->max_p = f->fs.max_p; fs->flow_mask = f->fs.flow_mask; fs->rq_elements = nq; fs->rq_size = (f->fs.buckets ? f->fs.buckets : 1); fs->parent_nr = f->fs.sched_nr; fs->weight = f->fs.par[0]; fs->flags_fs = convertflags2old(f->fs.flags); *a->start += sizeof(struct dn_flow_set); return 0; } int dn_compat_copy_queue(struct copy_args *a, void *_o) { int have = a->end - *a->start; int need = 0; int fs_size = sizeof(struct dn_flow_set); int queue_size = sizeof(struct dn_flow_queue8); struct dn_fsk *fs = (struct dn_fsk *)_o; int n_queue = 0; /* number of queues */ n_queue = (fs->fs.flags & DN_HAVE_MASK ? dn_ht_entries(fs->qht) : (fs->qht ? 1 : 0)); need = fs_size + queue_size * n_queue; if (have < need) { D("have < need"); return 1; } /* copy flowset */ dn_c_copy_fs(fs, a, n_queue); /* copy queues */ if (fs->fs.flags & DN_HAVE_MASK) dn_ht_scan(fs->qht, dn_c_copy_q, a); else if (fs->qht) dn_c_copy_q(fs->qht, a); return 0; } int copy_data_helper_compat(void *_o, void *_arg) { struct copy_args *a = _arg; if (a->type == DN_COMPAT_PIPE) { struct dn_schk *s = _o; if (s->sch.oid.subtype != 1 || s->sch.sched_nr <= DN_MAX_ID) { return 0; /* not old type */ } /* copy pipe parameters, and if instance exists, copy * other parameters and eventually queues. */ if(dn_compat_copy_pipe(a, _o)) return DNHT_SCAN_END; } else if (a->type == DN_COMPAT_QUEUE) { struct dn_fsk *fs = _o; if (fs->fs.fs_nr >= DN_MAX_ID) return 0; if (dn_compat_copy_queue(a, _o)) return DNHT_SCAN_END; } return 0; } /* Main function to manage old requests */ int ip_dummynet_compat(struct sockopt *sopt) { int error=0; void *v = NULL; struct dn_id oid; /* Lenght of data, used to found ipfw version... */ int len = sopt->sopt_valsize; /* len can be 0 if command was dummynet_flush */ if (len == pipesize7) { D("setting compatibility with FreeBSD 7.2"); is7 = 1; } else if (len == pipesize8 || len == pipesizemax8) { D("setting compatibility with FreeBSD 8"); is7 = 0; } switch (sopt->sopt_name) { default: printf("dummynet: -- unknown option %d", sopt->sopt_name); error = EINVAL; break; case IP_DUMMYNET_FLUSH: oid_fill(&oid, sizeof(oid), DN_CMD_FLUSH, DN_API_VERSION); do_config(&oid, oid.len); break; case IP_DUMMYNET_DEL: v = malloc(len, M_TEMP, M_WAITOK); error = sooptcopyin(sopt, v, len, len); if (error) break; error = dn_compat_del(v); free(v, M_TEMP); break; case IP_DUMMYNET_CONFIGURE: v = malloc(len, M_TEMP, M_WAITOK); error = sooptcopyin(sopt, v, len, len); if (error) break; error = dn_compat_configure(v); free(v, M_TEMP); break; case IP_DUMMYNET_GET: { void *buf; int ret; int original_size = sopt->sopt_valsize; int size; ret = dummynet_get(sopt, &buf); if (ret) return 0;//XXX ? size = sopt->sopt_valsize; sopt->sopt_valsize = original_size; D("size=%d, buf=%p", size, buf); ret = sooptcopyout(sopt, buf, size); if (ret) printf(" %s ERROR sooptcopyout\n", __FUNCTION__); if (buf) free(buf, M_DUMMYNET); } } return error; } ipfw3-2012/sys/netinet/ipfw/ip_fw_log.c000644 000423 000000 00000026336 12006744011 020275 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 2002-2009 Luigi Rizzo, Universita` di Pisa * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include __FBSDID("$FreeBSD: head/sys/netinet/ipfw/ip_fw_log.c 209845 2010-07-09 11:27:33Z glebius $"); /* * Logging support for ipfw */ #if !defined(KLD_MODULE) #include "opt_ipfw.h" #include "opt_ipdivert.h" #include "opt_ipdn.h" #include "opt_inet.h" #ifndef INET #error IPFIREWALL requires INET. #endif /* INET */ #endif #include "opt_inet6.h" #include "opt_ipsec.h" #include #include #include #include #include #include #include #include /* for ETHERTYPE_IP */ #include #include #include /* for IFT_ETHER */ #include /* for BPF */ #include #include #include #include #include #include #include #include #include #include #ifdef INET6 #include /* ip6_sprintf() */ #endif #ifdef MAC #include #endif /* * L3HDR maps an ipv4 pointer into a layer3 header pointer of type T * Other macros just cast void * into the appropriate type */ #define L3HDR(T, ip) ((T *)((u_int32_t *)(ip) + (ip)->ip_hl)) #define TCP(p) ((struct tcphdr *)(p)) #define SCTP(p) ((struct sctphdr *)(p)) #define UDP(p) ((struct udphdr *)(p)) #define ICMP(p) ((struct icmphdr *)(p)) #define ICMP6(p) ((struct icmp6_hdr *)(p)) #define SNPARGS(buf, len) buf + len, sizeof(buf) > len ? sizeof(buf) - len : 0 #define SNP(buf) buf, sizeof(buf) #ifdef WITHOUT_BPF void ipfw_log_bpf(int onoff) { } #else /* !WITHOUT_BPF */ static struct ifnet *log_if; /* hook to attach to bpf */ /* we use this dummy function for all ifnet callbacks */ static int log_dummy(struct ifnet *ifp, u_long cmd, caddr_t addr) { return EINVAL; } static int ipfw_log_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct route *ro) { if (m != NULL) m_freem(m); return EINVAL; } static void ipfw_log_start(struct ifnet* ifp) { panic("ipfw_log_start() must not be called"); } static const u_char ipfwbroadcastaddr[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; void ipfw_log_bpf(int onoff) { struct ifnet *ifp; if (onoff) { if (log_if) return; ifp = if_alloc(IFT_ETHER); if (ifp == NULL) return; if_initname(ifp, "ipfw", 0); ifp->if_mtu = 65536; ifp->if_flags = IFF_UP | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_init = (void *)log_dummy; ifp->if_ioctl = log_dummy; ifp->if_start = ipfw_log_start; ifp->if_output = ipfw_log_output; ifp->if_addrlen = 6; ifp->if_hdrlen = 14; if_attach(ifp); ifp->if_broadcastaddr = ipfwbroadcastaddr; ifp->if_baudrate = IF_Mbps(10); bpfattach(ifp, DLT_EN10MB, 14); log_if = ifp; } else { if (log_if) { ether_ifdetach(log_if); if_free(log_if); } log_if = NULL; } } #endif /* !WITHOUT_BPF */ /* * We enter here when we have a rule with O_LOG. * XXX this function alone takes about 2Kbytes of code! */ void ipfw_log(struct ip_fw *f, u_int hlen, struct ip_fw_args *args, struct mbuf *m, struct ifnet *oif, u_short offset, uint32_t tablearg, struct ip *ip) { char *action; int limit_reached = 0; char action2[40], proto[128], fragment[32]; if (V_fw_verbose == 0) { #ifndef WITHOUT_BPF if (log_if == NULL || log_if->if_bpf == NULL) return; if (args->eh) /* layer2, use orig hdr */ BPF_MTAP2(log_if, args->eh, ETHER_HDR_LEN, m); else /* Add fake header. Later we will store * more info in the header. */ BPF_MTAP2(log_if, "DDDDDDSSSSSS\x08\x00", ETHER_HDR_LEN, m); #endif /* !WITHOUT_BPF */ return; } /* the old 'log' function */ fragment[0] = '\0'; proto[0] = '\0'; if (f == NULL) { /* bogus pkt */ if (V_verbose_limit != 0 && V_norule_counter >= V_verbose_limit) return; V_norule_counter++; if (V_norule_counter == V_verbose_limit) limit_reached = V_verbose_limit; action = "Refuse"; } else { /* O_LOG is the first action, find the real one */ ipfw_insn *cmd = ACTION_PTR(f); ipfw_insn_log *l = (ipfw_insn_log *)cmd; if (l->max_log != 0 && l->log_left == 0) return; l->log_left--; if (l->log_left == 0) limit_reached = l->max_log; cmd += F_LEN(cmd); /* point to first action */ if (cmd->opcode == O_ALTQ) { ipfw_insn_altq *altq = (ipfw_insn_altq *)cmd; snprintf(SNPARGS(action2, 0), "Altq %d", altq->qid); cmd += F_LEN(cmd); } if (cmd->opcode == O_PROB) cmd += F_LEN(cmd); if (cmd->opcode == O_TAG) cmd += F_LEN(cmd); action = action2; switch (cmd->opcode) { case O_DENY: action = "Deny"; break; case O_REJECT: if (cmd->arg1==ICMP_REJECT_RST) action = "Reset"; else if (cmd->arg1==ICMP_UNREACH_HOST) action = "Reject"; else snprintf(SNPARGS(action2, 0), "Unreach %d", cmd->arg1); break; case O_UNREACH6: if (cmd->arg1==ICMP6_UNREACH_RST) action = "Reset"; else snprintf(SNPARGS(action2, 0), "Unreach %d", cmd->arg1); break; case O_ACCEPT: action = "Accept"; break; case O_COUNT: action = "Count"; break; case O_DIVERT: snprintf(SNPARGS(action2, 0), "Divert %d", cmd->arg1); break; case O_TEE: snprintf(SNPARGS(action2, 0), "Tee %d", cmd->arg1); break; case O_SETFIB: snprintf(SNPARGS(action2, 0), "SetFib %d", cmd->arg1); break; case O_SKIPTO: snprintf(SNPARGS(action2, 0), "SkipTo %d", cmd->arg1); break; case O_PIPE: snprintf(SNPARGS(action2, 0), "Pipe %d", cmd->arg1); break; case O_QUEUE: snprintf(SNPARGS(action2, 0), "Queue %d", cmd->arg1); break; case O_FORWARD_IP: { ipfw_insn_sa *sa = (ipfw_insn_sa *)cmd; int len; struct in_addr dummyaddr; if (sa->sa.sin_addr.s_addr == INADDR_ANY) dummyaddr.s_addr = htonl(tablearg); else dummyaddr.s_addr = sa->sa.sin_addr.s_addr; len = snprintf(SNPARGS(action2, 0), "Forward to %s", inet_ntoa(dummyaddr)); if (sa->sa.sin_port) snprintf(SNPARGS(action2, len), ":%d", sa->sa.sin_port); } break; case O_NETGRAPH: snprintf(SNPARGS(action2, 0), "Netgraph %d", cmd->arg1); break; case O_NGTEE: snprintf(SNPARGS(action2, 0), "Ngtee %d", cmd->arg1); break; case O_NAT: action = "Nat"; break; case O_REASS: action = "Reass"; break; default: action = "UNKNOWN"; break; } } if (hlen == 0) { /* non-ip */ snprintf(SNPARGS(proto, 0), "MAC"); } else { int len; #ifdef INET6 char src[INET6_ADDRSTRLEN + 2], dst[INET6_ADDRSTRLEN + 2]; #else char src[INET_ADDRSTRLEN], dst[INET_ADDRSTRLEN]; #endif struct icmphdr *icmp; struct tcphdr *tcp; struct udphdr *udp; #ifdef INET6 struct ip6_hdr *ip6 = NULL; struct icmp6_hdr *icmp6; #endif src[0] = '\0'; dst[0] = '\0'; #ifdef INET6 if (IS_IP6_FLOW_ID(&(args->f_id))) { char ip6buf[INET6_ADDRSTRLEN]; snprintf(src, sizeof(src), "[%s]", ip6_sprintf(ip6buf, &args->f_id.src_ip6)); snprintf(dst, sizeof(dst), "[%s]", ip6_sprintf(ip6buf, &args->f_id.dst_ip6)); ip6 = (struct ip6_hdr *)ip; tcp = (struct tcphdr *)(((char *)ip) + hlen); udp = (struct udphdr *)(((char *)ip) + hlen); } else #endif { tcp = L3HDR(struct tcphdr, ip); udp = L3HDR(struct udphdr, ip); inet_ntoa_r(ip->ip_src, src); inet_ntoa_r(ip->ip_dst, dst); } switch (args->f_id.proto) { case IPPROTO_TCP: len = snprintf(SNPARGS(proto, 0), "TCP %s", src); if (offset == 0) snprintf(SNPARGS(proto, len), ":%d %s:%d", ntohs(tcp->th_sport), dst, ntohs(tcp->th_dport)); else snprintf(SNPARGS(proto, len), " %s", dst); break; case IPPROTO_UDP: len = snprintf(SNPARGS(proto, 0), "UDP %s", src); if (offset == 0) snprintf(SNPARGS(proto, len), ":%d %s:%d", ntohs(udp->uh_sport), dst, ntohs(udp->uh_dport)); else snprintf(SNPARGS(proto, len), " %s", dst); break; case IPPROTO_ICMP: icmp = L3HDR(struct icmphdr, ip); if (offset == 0) len = snprintf(SNPARGS(proto, 0), "ICMP:%u.%u ", icmp->icmp_type, icmp->icmp_code); else len = snprintf(SNPARGS(proto, 0), "ICMP "); len += snprintf(SNPARGS(proto, len), "%s", src); snprintf(SNPARGS(proto, len), " %s", dst); break; #ifdef INET6 case IPPROTO_ICMPV6: icmp6 = (struct icmp6_hdr *)(((char *)ip) + hlen); if (offset == 0) len = snprintf(SNPARGS(proto, 0), "ICMPv6:%u.%u ", icmp6->icmp6_type, icmp6->icmp6_code); else len = snprintf(SNPARGS(proto, 0), "ICMPv6 "); len += snprintf(SNPARGS(proto, len), "%s", src); snprintf(SNPARGS(proto, len), " %s", dst); break; #endif default: len = snprintf(SNPARGS(proto, 0), "P:%d %s", args->f_id.proto, src); snprintf(SNPARGS(proto, len), " %s", dst); break; } #ifdef INET6 if (IS_IP6_FLOW_ID(&(args->f_id))) { if (offset & (IP6F_OFF_MASK | IP6F_MORE_FRAG)) snprintf(SNPARGS(fragment, 0), " (frag %08x:%d@%d%s)", args->f_id.extra, ntohs(ip6->ip6_plen) - hlen, ntohs(offset & IP6F_OFF_MASK) << 3, (offset & IP6F_MORE_FRAG) ? "+" : ""); } else #endif { int ipoff, iplen; ipoff = ntohs(ip->ip_off); iplen = ntohs(ip->ip_len); if (ipoff & (IP_MF | IP_OFFMASK)) snprintf(SNPARGS(fragment, 0), " (frag %d:%d@%d%s)", ntohs(ip->ip_id), iplen - (ip->ip_hl << 2), offset << 3, (ipoff & IP_MF) ? "+" : ""); } } #ifdef __FreeBSD__ if (oif || m->m_pkthdr.rcvif) log(LOG_SECURITY | LOG_INFO, "ipfw: %d %s %s %s via %s%s\n", f ? f->rulenum : -1, action, proto, oif ? "out" : "in", oif ? oif->if_xname : m->m_pkthdr.rcvif->if_xname, fragment); else #endif log(LOG_SECURITY | LOG_INFO, "ipfw: %d %s %s [no if info]%s\n", f ? f->rulenum : -1, action, proto, fragment); if (limit_reached) log(LOG_SECURITY | LOG_NOTICE, "ipfw: limit %d reached on entry %d\n", limit_reached, f ? f->rulenum : -1); } /* end of file */ ipfw3-2012/sys/netinet/ipfw/ip_fw_sockopt.c000644 000423 000000 00000101235 12006744011 021166 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 2002-2009 Luigi Rizzo, Universita` di Pisa * * Supported by: Valeria Paoli * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include __FBSDID("$FreeBSD: head/sys/netinet/ipfw/ip_fw_sockopt.c 206339 2010-04-07 08:23:58Z luigi $"); /* * Sockopt support for ipfw. The routines here implement * the upper half of the ipfw code. */ #if !defined(KLD_MODULE) #include "opt_ipfw.h" #include "opt_ipdivert.h" #include "opt_ipdn.h" #include "opt_inet.h" #ifndef INET #error IPFIREWALL requires INET. #endif /* INET */ #endif #include "opt_inet6.h" #include "opt_ipsec.h" #include #include #include #include /* struct m_tag used by nested headers */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* hooks */ #include #include #ifdef MAC #include #endif MALLOC_DEFINE(M_IPFW, "IpFw/IpAcct", "IpFw/IpAcct chain's"); /* * static variables followed by global ones (none in this file) */ /* * Find the smallest rule >= key, id. * We could use bsearch but it is so simple that we code it directly */ int ipfw_find_rule(struct ip_fw_chain *chain, uint32_t key, uint32_t id) { int i, lo, hi; struct ip_fw *r; for (lo = 0, hi = chain->n_rules - 1; lo < hi;) { i = (lo + hi) / 2; r = chain->map[i]; if (r->rulenum < key) lo = i + 1; /* continue from the next one */ else if (r->rulenum > key) hi = i; /* this might be good */ else if (r->id < id) lo = i + 1; /* continue from the next one */ else /* r->id >= id */ hi = i; /* this might be good */ }; return hi; } /* * allocate a new map, returns the chain locked. extra is the number * of entries to add or delete. */ static struct ip_fw ** get_map(struct ip_fw_chain *chain, int extra, int locked) { for (;;) { struct ip_fw **map; int i; i = chain->n_rules + extra; map = malloc(i * sizeof(struct ip_fw *), M_IPFW, locked ? M_NOWAIT : M_WAITOK); if (map == NULL) { printf("%s: cannot allocate map\n", __FUNCTION__); return NULL; } if (!locked) IPFW_UH_WLOCK(chain); if (i >= chain->n_rules + extra) /* good */ return map; /* otherwise we lost the race, free and retry */ if (!locked) IPFW_UH_WUNLOCK(chain); free(map, M_IPFW); } } /* * swap the maps. It is supposed to be called with IPFW_UH_WLOCK */ static struct ip_fw ** swap_map(struct ip_fw_chain *chain, struct ip_fw **new_map, int new_len) { struct ip_fw **old_map; IPFW_WLOCK(chain); chain->id++; chain->n_rules = new_len; old_map = chain->map; chain->map = new_map; IPFW_WUNLOCK(chain); return old_map; } /* * Add a new rule to the list. Copy the rule into a malloc'ed area, then * possibly create a rule number and add the rule to the list. * Update the rule_number in the input struct so the caller knows it as well. * XXX DO NOT USE FOR THE DEFAULT RULE. * Must be called without IPFW_UH held */ int ipfw_add_rule(struct ip_fw_chain *chain, struct ip_fw *input_rule) { struct ip_fw *rule; int i, l, insert_before; struct ip_fw **map; /* the new array of pointers */ if (chain->rules == NULL || input_rule->rulenum > IPFW_DEFAULT_RULE-1) return (EINVAL); l = RULESIZE(input_rule); rule = malloc(l, M_IPFW, M_WAITOK | M_ZERO); if (rule == NULL) return (ENOSPC); /* get_map returns with IPFW_UH_WLOCK if successful */ map = get_map(chain, 1, 0 /* not locked */); if (map == NULL) { free(rule, M_IPFW); return ENOSPC; } bcopy(input_rule, rule, l); /* clear fields not settable from userland */ rule->x_next = NULL; rule->next_rule = NULL; rule->pcnt = 0; rule->bcnt = 0; rule->timestamp = 0; if (V_autoinc_step < 1) V_autoinc_step = 1; else if (V_autoinc_step > 1000) V_autoinc_step = 1000; /* find the insertion point, we will insert before */ insert_before = rule->rulenum ? rule->rulenum + 1 : IPFW_DEFAULT_RULE; i = ipfw_find_rule(chain, insert_before, 0); /* duplicate first part */ if (i > 0) bcopy(chain->map, map, i * sizeof(struct ip_fw *)); map[i] = rule; /* duplicate remaining part, we always have the default rule */ bcopy(chain->map + i, map + i + 1, sizeof(struct ip_fw *) *(chain->n_rules - i)); if (rule->rulenum == 0) { /* write back the number */ rule->rulenum = i > 0 ? map[i-1]->rulenum : 0; if (rule->rulenum < IPFW_DEFAULT_RULE - V_autoinc_step) rule->rulenum += V_autoinc_step; input_rule->rulenum = rule->rulenum; } rule->id = chain->id + 1; map = swap_map(chain, map, chain->n_rules + 1); chain->static_len += l; IPFW_UH_WUNLOCK(chain); if (map) free(map, M_IPFW); return (0); } /* * Reclaim storage associated with a list of rules. This is * typically the list created using remove_rule. * A NULL pointer on input is handled correctly. */ void ipfw_reap_rules(struct ip_fw *head) { struct ip_fw *rule; while ((rule = head) != NULL) { head = head->x_next; free(rule, M_IPFW); } } /* * Used by del_entry() to check if a rule should be kept. * Returns 1 if the rule must be kept, 0 otherwise. * * Called with cmd = {0,1,5}. * cmd == 0 matches on rule numbers, excludes rules in RESVD_SET if n == 0 ; * cmd == 1 matches on set numbers only, rule numbers are ignored; * cmd == 5 matches on rule and set numbers. * * n == 0 is a wildcard for rule numbers, there is no wildcard for sets. * * Rules to keep are * (default || reserved || !match_set || !match_number) * where * default ::= (rule->rulenum == IPFW_DEFAULT_RULE) * // the default rule is always protected * * reserved ::= (cmd == 0 && n == 0 && rule->set == RESVD_SET) * // RESVD_SET is protected only if cmd == 0 and n == 0 ("ipfw flush") * * match_set ::= (cmd == 0 || rule->set == set) * // set number is ignored for cmd == 0 * * match_number ::= (cmd == 1 || n == 0 || n == rule->rulenum) * // number is ignored for cmd == 1 or n == 0 * */ static int keep_rule(struct ip_fw *rule, uint8_t cmd, uint8_t set, uint32_t n) { return (rule->rulenum == IPFW_DEFAULT_RULE) || (cmd == 0 && n == 0 && rule->set == RESVD_SET) || !(cmd == 0 || rule->set == set) || !(cmd == 1 || n == 0 || n == rule->rulenum); } /** * Remove all rules with given number, or do set manipulation. * Assumes chain != NULL && *chain != NULL. * * The argument is an uint32_t. The low 16 bit are the rule or set number; * the next 8 bits are the new set; the top 8 bits indicate the command: * * 0 delete rules numbered "rulenum" * 1 delete rules in set "rulenum" * 2 move rules "rulenum" to set "new_set" * 3 move rules from set "rulenum" to set "new_set" * 4 swap sets "rulenum" and "new_set" * 5 delete rules "rulenum" and set "new_set" */ static int del_entry(struct ip_fw_chain *chain, uint32_t arg) { struct ip_fw *rule; uint32_t num; /* rule number or old_set */ uint8_t cmd, new_set; int start, end, i, ofs, n; struct ip_fw **map = NULL; int error = 0; num = arg & 0xffff; cmd = (arg >> 24) & 0xff; new_set = (arg >> 16) & 0xff; if (cmd > 5 || new_set > RESVD_SET) return EINVAL; if (cmd == 0 || cmd == 2 || cmd == 5) { if (num >= IPFW_DEFAULT_RULE) return EINVAL; } else { if (num > RESVD_SET) /* old_set */ return EINVAL; } IPFW_UH_WLOCK(chain); /* arbitrate writers */ chain->reap = NULL; /* prepare for deletions */ switch (cmd) { case 0: /* delete rules "num" (num == 0 matches all) */ case 1: /* delete all rules in set N */ case 5: /* delete rules with number N and set "new_set". */ /* * Locate first rule to delete (start), the rule after * the last one to delete (end), and count how many * rules to delete (n). Always use keep_rule() to * determine which rules to keep. */ n = 0; if (cmd == 1) { /* look for a specific set including RESVD_SET. * Must scan the entire range, ignore num. */ new_set = num; for (start = -1, end = i = 0; i < chain->n_rules; i++) { if (keep_rule(chain->map[i], cmd, new_set, 0)) continue; if (start < 0) start = i; end = i; n++; } end++; /* first non-matching */ } else { /* Optimized search on rule numbers */ start = ipfw_find_rule(chain, num, 0); for (end = start; end < chain->n_rules; end++) { rule = chain->map[end]; if (num > 0 && rule->rulenum != num) break; if (!keep_rule(rule, cmd, new_set, num)) n++; } } if (n == 0) { /* A flush request (arg == 0) on empty ruleset * returns with no error. On the contrary, * if there is no match on a specific request, * we return EINVAL. */ error = (arg == 0) ? 0 : EINVAL; break; } /* We have something to delete. Allocate the new map */ map = get_map(chain, -n, 1 /* locked */); if (map == NULL) { error = EINVAL; break; } /* 1. bcopy the initial part of the map */ if (start > 0) bcopy(chain->map, map, start * sizeof(struct ip_fw *)); /* 2. copy active rules between start and end */ for (i = ofs = start; i < end; i++) { rule = chain->map[i]; if (keep_rule(rule, cmd, new_set, num)) map[ofs++] = rule; } /* 3. copy the final part of the map */ bcopy(chain->map + end, map + ofs, (chain->n_rules - end) * sizeof(struct ip_fw *)); /* 4. swap the maps (under BH_LOCK) */ map = swap_map(chain, map, chain->n_rules - n); /* 5. now remove the rules deleted from the old map */ for (i = start; i < end; i++) { int l; rule = map[i]; if (keep_rule(rule, cmd, new_set, num)) continue; l = RULESIZE(rule); chain->static_len -= l; ipfw_remove_dyn_children(rule); rule->x_next = chain->reap; chain->reap = rule; } break; /* * In the next 3 cases the loop stops at (n_rules - 1) * because the default rule is never eligible.. */ case 2: /* move rules with given RULE number to new set */ for (i = 0; i < chain->n_rules - 1; i++) { rule = chain->map[i]; if (rule->rulenum == num) rule->set = new_set; } break; case 3: /* move rules with given SET number to new set */ for (i = 0; i < chain->n_rules - 1; i++) { rule = chain->map[i]; if (rule->set == num) rule->set = new_set; } break; case 4: /* swap two sets */ for (i = 0; i < chain->n_rules - 1; i++) { rule = chain->map[i]; if (rule->set == num) rule->set = new_set; else if (rule->set == new_set) rule->set = num; } break; } rule = chain->reap; chain->reap = NULL; IPFW_UH_WUNLOCK(chain); ipfw_reap_rules(rule); if (map) free(map, M_IPFW); return error; } /* * Clear counters for a specific rule. * Normally run under IPFW_UH_RLOCK, but these are idempotent ops * so we only care that rules do not disappear. */ static void clear_counters(struct ip_fw *rule, int log_only) { ipfw_insn_log *l = (ipfw_insn_log *)ACTION_PTR(rule); if (log_only == 0) { rule->bcnt = rule->pcnt = 0; rule->timestamp = 0; } if (l->o.opcode == O_LOG) l->log_left = l->max_log; } /** * Reset some or all counters on firewall rules. * The argument `arg' is an u_int32_t. The low 16 bit are the rule number, * the next 8 bits are the set number, the top 8 bits are the command: * 0 work with rules from all set's; * 1 work with rules only from specified set. * Specified rule number is zero if we want to clear all entries. * log_only is 1 if we only want to reset logs, zero otherwise. */ static int zero_entry(struct ip_fw_chain *chain, u_int32_t arg, int log_only) { struct ip_fw *rule; char *msg; int i; uint16_t rulenum = arg & 0xffff; uint8_t set = (arg >> 16) & 0xff; uint8_t cmd = (arg >> 24) & 0xff; if (cmd > 1) return (EINVAL); if (cmd == 1 && set > RESVD_SET) return (EINVAL); IPFW_UH_RLOCK(chain); if (rulenum == 0) { V_norule_counter = 0; for (i = 0; i < chain->n_rules; i++) { rule = chain->map[i]; /* Skip rules not in our set. */ if (cmd == 1 && rule->set != set) continue; clear_counters(rule, log_only); } msg = log_only ? "All logging counts reset" : "Accounting cleared"; } else { int cleared = 0; for (i = 0; i < chain->n_rules; i++) { rule = chain->map[i]; if (rule->rulenum == rulenum) { if (cmd == 0 || rule->set == set) clear_counters(rule, log_only); cleared = 1; } if (rule->rulenum > rulenum) break; } if (!cleared) { /* we did not find any matching rules */ IPFW_UH_RUNLOCK(chain); return (EINVAL); } msg = log_only ? "logging count reset" : "cleared"; } IPFW_UH_RUNLOCK(chain); if (V_fw_verbose) { int lev = LOG_SECURITY | LOG_NOTICE; if (rulenum) log(lev, "ipfw: Entry %d %s.\n", rulenum, msg); else log(lev, "ipfw: %s.\n", msg); } return (0); } /* * Check validity of the structure before insert. * Rules are simple, so this mostly need to check rule sizes. */ static int check_ipfw_struct(struct ip_fw *rule, int size) { int l, cmdlen = 0; int have_action=0; ipfw_insn *cmd; if (size < sizeof(*rule)) { printf("ipfw: rule too short\n"); return (EINVAL); } /* first, check for valid size */ l = RULESIZE(rule); if (l != size) { printf("ipfw: size mismatch (have %d want %d)\n", size, l); return (EINVAL); } if (rule->act_ofs >= rule->cmd_len) { printf("ipfw: bogus action offset (%u > %u)\n", rule->act_ofs, rule->cmd_len - 1); return (EINVAL); } /* * Now go for the individual checks. Very simple ones, basically only * instruction sizes. */ for (l = rule->cmd_len, cmd = rule->cmd ; l > 0 ; l -= cmdlen, cmd += cmdlen) { cmdlen = F_LEN(cmd); if (cmdlen > l) { printf("ipfw: opcode %d size truncated\n", cmd->opcode); return EINVAL; } switch (cmd->opcode) { case O_PROBE_STATE: case O_KEEP_STATE: case O_PROTO: case O_IP_SRC_ME: case O_IP_DST_ME: case O_LAYER2: case O_IN: case O_FRAG: case O_DIVERTED: case O_IPOPT: case O_IPTOS: case O_IPPRECEDENCE: case O_IPVER: case O_TCPWIN: case O_TCPFLAGS: case O_TCPOPTS: case O_ESTAB: case O_VERREVPATH: case O_VERSRCREACH: case O_ANTISPOOF: case O_IPSEC: #ifdef INET6 case O_IP6_SRC_ME: case O_IP6_DST_ME: case O_EXT_HDR: case O_IP6: #endif case O_IP4: case O_TAG: if (cmdlen != F_INSN_SIZE(ipfw_insn)) goto bad_size; break; case O_FIB: if (cmdlen != F_INSN_SIZE(ipfw_insn)) goto bad_size; if (cmd->arg1 >= rt_numfibs) { printf("ipfw: invalid fib number %d\n", cmd->arg1); return EINVAL; } break; case O_SETFIB: if (cmdlen != F_INSN_SIZE(ipfw_insn)) goto bad_size; if (cmd->arg1 >= rt_numfibs) { printf("ipfw: invalid fib number %d\n", cmd->arg1); return EINVAL; } goto check_action; case O_UID: case O_GID: case O_JAIL: case O_IP_SRC: case O_IP_DST: case O_TCPSEQ: case O_TCPACK: case O_PROB: case O_ICMPTYPE: if (cmdlen != F_INSN_SIZE(ipfw_insn_u32)) goto bad_size; break; case O_LIMIT: if (cmdlen != F_INSN_SIZE(ipfw_insn_limit)) goto bad_size; break; case O_LOG: if (cmdlen != F_INSN_SIZE(ipfw_insn_log)) goto bad_size; ((ipfw_insn_log *)cmd)->log_left = ((ipfw_insn_log *)cmd)->max_log; break; case O_IP_SRC_MASK: case O_IP_DST_MASK: /* only odd command lengths */ if ( !(cmdlen & 1) || cmdlen > 31) goto bad_size; break; case O_IP_SRC_SET: case O_IP_DST_SET: if (cmd->arg1 == 0 || cmd->arg1 > 256) { printf("ipfw: invalid set size %d\n", cmd->arg1); return EINVAL; } if (cmdlen != F_INSN_SIZE(ipfw_insn_u32) + (cmd->arg1+31)/32 ) goto bad_size; break; case O_IP_SRC_LOOKUP: case O_IP_DST_LOOKUP: if (cmd->arg1 >= IPFW_TABLES_MAX) { printf("ipfw: invalid table number %d\n", cmd->arg1); return (EINVAL); } if (cmdlen != F_INSN_SIZE(ipfw_insn) && cmdlen != F_INSN_SIZE(ipfw_insn_u32) + 1 && cmdlen != F_INSN_SIZE(ipfw_insn_u32)) goto bad_size; break; case O_MACADDR2: if (cmdlen != F_INSN_SIZE(ipfw_insn_mac)) goto bad_size; break; case O_NOP: case O_IPID: case O_IPTTL: case O_IPLEN: case O_TCPDATALEN: case O_TAGGED: if (cmdlen < 1 || cmdlen > 31) goto bad_size; break; case O_MAC_TYPE: case O_IP_SRCPORT: case O_IP_DSTPORT: /* XXX artificial limit, 30 port pairs */ if (cmdlen < 2 || cmdlen > 31) goto bad_size; break; case O_RECV: case O_XMIT: case O_VIA: if (cmdlen != F_INSN_SIZE(ipfw_insn_if)) goto bad_size; break; case O_ALTQ: if (cmdlen != F_INSN_SIZE(ipfw_insn_altq)) goto bad_size; break; case O_PIPE: case O_QUEUE: if (cmdlen != F_INSN_SIZE(ipfw_insn)) goto bad_size; goto check_action; case O_FORWARD_IP: #ifdef IPFIREWALL_FORWARD if (cmdlen != F_INSN_SIZE(ipfw_insn_sa)) goto bad_size; goto check_action; #else return EINVAL; #endif case O_DIVERT: case O_TEE: if (ip_divert_ptr == NULL) return EINVAL; else goto check_size; case O_NETGRAPH: case O_NGTEE: if (ng_ipfw_input_p == NULL) return EINVAL; else goto check_size; case O_NAT: if (!IPFW_NAT_LOADED) return EINVAL; if (cmdlen != F_INSN_SIZE(ipfw_insn_nat)) goto bad_size; goto check_action; case O_FORWARD_MAC: /* XXX not implemented yet */ case O_CHECK_STATE: case O_COUNT: case O_ACCEPT: case O_DENY: case O_REJECT: #ifdef INET6 case O_UNREACH6: #endif case O_SKIPTO: case O_REASS: check_size: if (cmdlen != F_INSN_SIZE(ipfw_insn)) goto bad_size; check_action: if (have_action) { printf("ipfw: opcode %d, multiple actions" " not allowed\n", cmd->opcode); return EINVAL; } have_action = 1; if (l != cmdlen) { printf("ipfw: opcode %d, action must be" " last opcode\n", cmd->opcode); return EINVAL; } break; #ifdef INET6 case O_IP6_SRC: case O_IP6_DST: if (cmdlen != F_INSN_SIZE(struct in6_addr) + F_INSN_SIZE(ipfw_insn)) goto bad_size; break; case O_FLOW6ID: if (cmdlen != F_INSN_SIZE(ipfw_insn_u32) + ((ipfw_insn_u32 *)cmd)->o.arg1) goto bad_size; break; case O_IP6_SRC_MASK: case O_IP6_DST_MASK: if ( !(cmdlen & 1) || cmdlen > 127) goto bad_size; break; case O_ICMP6TYPE: if( cmdlen != F_INSN_SIZE( ipfw_insn_icmp6 ) ) goto bad_size; break; #endif default: switch (cmd->opcode) { #ifndef INET6 case O_IP6_SRC_ME: case O_IP6_DST_ME: case O_EXT_HDR: case O_IP6: case O_UNREACH6: case O_IP6_SRC: case O_IP6_DST: case O_FLOW6ID: case O_IP6_SRC_MASK: case O_IP6_DST_MASK: case O_ICMP6TYPE: printf("ipfw: no IPv6 support in kernel\n"); return EPROTONOSUPPORT; #endif default: printf("ipfw: opcode %d, unknown opcode\n", cmd->opcode); return EINVAL; } } } if (have_action == 0) { printf("ipfw: missing action\n"); return EINVAL; } return 0; bad_size: printf("ipfw: opcode %d size %d wrong\n", cmd->opcode, cmdlen); return EINVAL; } /* * Translation of requests for compatibility with FreeBSD 7.2/8. * a static variable tells us if we have an old client from userland, * and if necessary we translate requests and responses between the * two formats. */ static int is7 = 0; struct ip_fw7 { struct ip_fw7 *next; /* linked list of rules */ struct ip_fw7 *next_rule; /* ptr to next [skipto] rule */ /* 'next_rule' is used to pass up 'set_disable' status */ uint16_t act_ofs; /* offset of action in 32-bit units */ uint16_t cmd_len; /* # of 32-bit words in cmd */ uint16_t rulenum; /* rule number */ uint8_t set; /* rule set (0..31) */ // #define RESVD_SET 31 /* set for default and persistent rules */ uint8_t _pad; /* padding */ // uint32_t id; /* rule id, only in v.8 */ /* These fields are present in all rules. */ uint64_t pcnt; /* Packet counter */ uint64_t bcnt; /* Byte counter */ uint32_t timestamp; /* tv_sec of last match */ ipfw_insn cmd[1]; /* storage for commands */ }; int convert_rule_to_7(struct ip_fw *rule); int convert_rule_to_8(struct ip_fw *rule); #ifndef RULESIZE7 #define RULESIZE7(rule) (sizeof(struct ip_fw7) + \ ((struct ip_fw7 *)(rule))->cmd_len * 4 - 4) #endif /* * Copy the static and dynamic rules to the supplied buffer * and return the amount of space actually used. * Must be run under IPFW_UH_RLOCK */ static size_t ipfw_getrules(struct ip_fw_chain *chain, void *buf, size_t space) { char *bp = buf; char *ep = bp + space; struct ip_fw *rule, *dst; int l, i; time_t boot_seconds; boot_seconds = boottime.tv_sec; for (i = 0; i < chain->n_rules; i++) { rule = chain->map[i]; if (is7) { /* Convert rule to FreeBSd 7.2 format */ l = RULESIZE7(rule); if (bp + l + sizeof(uint32_t) <= ep) { int error; bcopy(rule, bp, l + sizeof(uint32_t)); error = convert_rule_to_7((struct ip_fw *) bp); if (error) return 0; /*XXX correct? */ /* * XXX HACK. Store the disable mask in the "next" * pointer in a wild attempt to keep the ABI the same. * Why do we do this on EVERY rule? */ bcopy(&V_set_disable, &(((struct ip_fw7 *)bp)->next_rule), sizeof(V_set_disable)); if (((struct ip_fw7 *)bp)->timestamp) ((struct ip_fw7 *)bp)->timestamp += boot_seconds; bp += l; } continue; /* go to next rule */ } /* normal mode, don't touch rules */ l = RULESIZE(rule); if (bp + l > ep) { /* should not happen */ printf("overflow dumping static rules\n"); break; } dst = (struct ip_fw *)bp; bcopy(rule, dst, l); /* * XXX HACK. Store the disable mask in the "next" * pointer in a wild attempt to keep the ABI the same. * Why do we do this on EVERY rule? */ bcopy(&V_set_disable, &dst->next_rule, sizeof(V_set_disable)); if (dst->timestamp) dst->timestamp += boot_seconds; bp += l; } ipfw_get_dynamic(&bp, ep); /* protected by the dynamic lock */ return (bp - (char *)buf); } /** * {set|get}sockopt parser. */ int ipfw_ctl(struct sockopt *sopt) { #define RULE_MAXSIZE (256*sizeof(u_int32_t)) int error; size_t size; struct ip_fw *buf, *rule; struct ip_fw_chain *chain; u_int32_t rulenum[2]; error = priv_check(sopt->sopt_td, PRIV_NETINET_IPFW); if (error) return (error); /* * Disallow modifications in really-really secure mode, but still allow * the logging counters to be reset. */ if (sopt->sopt_name == IP_FW_ADD || (sopt->sopt_dir == SOPT_SET && sopt->sopt_name != IP_FW_RESETLOG)) { error = securelevel_ge(sopt->sopt_td->td_ucred, 3); if (error) return (error); } chain = &V_layer3_chain; error = 0; switch (sopt->sopt_name) { case IP_FW_GET: /* * pass up a copy of the current rules. Static rules * come first (the last of which has number IPFW_DEFAULT_RULE), * followed by a possibly empty list of dynamic rule. * The last dynamic rule has NULL in the "next" field. * * Note that the calculated size is used to bound the * amount of data returned to the user. The rule set may * change between calculating the size and returning the * data in which case we'll just return what fits. */ for (;;) { int len = 0, want; size = chain->static_len; size += ipfw_dyn_len(); if (size >= sopt->sopt_valsize) break; buf = malloc(size, M_TEMP, M_WAITOK); if (buf == NULL) break; IPFW_UH_RLOCK(chain); /* check again how much space we need */ want = chain->static_len + ipfw_dyn_len(); if (size >= want) len = ipfw_getrules(chain, buf, size); IPFW_UH_RUNLOCK(chain); if (size >= want) error = sooptcopyout(sopt, buf, len); free(buf, M_TEMP); if (size >= want) break; } break; case IP_FW_FLUSH: /* locking is done within del_entry() */ error = del_entry(chain, 0); /* special case, rule=0, cmd=0 means all */ break; case IP_FW_ADD: rule = malloc(RULE_MAXSIZE, M_TEMP, M_WAITOK); error = sooptcopyin(sopt, rule, RULE_MAXSIZE, sizeof(struct ip_fw7) ); /* * If the size of commands equals RULESIZE7 then we assume * a FreeBSD7.2 binary is talking to us (set is7=1). * is7 is persistent so the next 'ipfw list' command * will use this format. * NOTE: If wrong version is guessed (this can happen if * the first ipfw command is 'ipfw [pipe] list') * the ipfw binary may crash or loop infinitly... */ if (sopt->sopt_valsize == RULESIZE7(rule)) { is7 = 1; error = convert_rule_to_8(rule); if (error) return error; if (error == 0) error = check_ipfw_struct(rule, RULESIZE(rule)); } else { is7 = 0; if (error == 0) error = check_ipfw_struct(rule, sopt->sopt_valsize); } if (error == 0) { /* locking is done within ipfw_add_rule() */ error = ipfw_add_rule(chain, rule); size = RULESIZE(rule); if (!error && sopt->sopt_dir == SOPT_GET) { if (is7) { error = convert_rule_to_7(rule); size = RULESIZE7(rule); if (error) return error; } error = sooptcopyout(sopt, rule, size); } } free(rule, M_TEMP); break; case IP_FW_DEL: /* * IP_FW_DEL is used for deleting single rules or sets, * and (ab)used to atomically manipulate sets. Argument size * is used to distinguish between the two: * sizeof(u_int32_t) * delete single rule or set of rules, * or reassign rules (or sets) to a different set. * 2*sizeof(u_int32_t) * atomic disable/enable sets. * first u_int32_t contains sets to be disabled, * second u_int32_t contains sets to be enabled. */ error = sooptcopyin(sopt, rulenum, 2*sizeof(u_int32_t), sizeof(u_int32_t)); if (error) break; size = sopt->sopt_valsize; if (size == sizeof(u_int32_t) && rulenum[0] != 0) { /* delete or reassign, locking done in del_entry() */ error = del_entry(chain, rulenum[0]); } else if (size == 2*sizeof(u_int32_t)) { /* set enable/disable */ IPFW_UH_WLOCK(chain); V_set_disable = (V_set_disable | rulenum[0]) & ~rulenum[1] & ~(1<sopt_val != 0) { error = sooptcopyin(sopt, rulenum, sizeof(u_int32_t), sizeof(u_int32_t)); if (error) break; } error = zero_entry(chain, rulenum[0], sopt->sopt_name == IP_FW_RESETLOG); break; /*--- TABLE manipulations are protected by the IPFW_LOCK ---*/ case IP_FW_TABLE_ADD: { ipfw_table_entry ent; error = sooptcopyin(sopt, &ent, sizeof(ent), sizeof(ent)); if (error) break; error = ipfw_add_table_entry(chain, ent.tbl, ent.addr, ent.masklen, ent.value); } break; case IP_FW_TABLE_DEL: { ipfw_table_entry ent; error = sooptcopyin(sopt, &ent, sizeof(ent), sizeof(ent)); if (error) break; error = ipfw_del_table_entry(chain, ent.tbl, ent.addr, ent.masklen); } break; case IP_FW_TABLE_FLUSH: { u_int16_t tbl; error = sooptcopyin(sopt, &tbl, sizeof(tbl), sizeof(tbl)); if (error) break; IPFW_WLOCK(chain); error = ipfw_flush_table(chain, tbl); IPFW_WUNLOCK(chain); } break; case IP_FW_TABLE_GETSIZE: { u_int32_t tbl, cnt; if ((error = sooptcopyin(sopt, &tbl, sizeof(tbl), sizeof(tbl)))) break; IPFW_RLOCK(chain); error = ipfw_count_table(chain, tbl, &cnt); IPFW_RUNLOCK(chain); if (error) break; error = sooptcopyout(sopt, &cnt, sizeof(cnt)); } break; case IP_FW_TABLE_LIST: { ipfw_table *tbl; if (sopt->sopt_valsize < sizeof(*tbl)) { error = EINVAL; break; } size = sopt->sopt_valsize; tbl = malloc(size, M_TEMP, M_WAITOK); error = sooptcopyin(sopt, tbl, size, sizeof(*tbl)); if (error) { free(tbl, M_TEMP); break; } tbl->size = (size - sizeof(*tbl)) / sizeof(ipfw_table_entry); IPFW_RLOCK(chain); error = ipfw_dump_table(chain, tbl); IPFW_RUNLOCK(chain); if (error) { free(tbl, M_TEMP); break; } error = sooptcopyout(sopt, tbl, size); free(tbl, M_TEMP); } break; /*--- NAT operations are protected by the IPFW_LOCK ---*/ case IP_FW_NAT_CFG: if (IPFW_NAT_LOADED) error = ipfw_nat_cfg_ptr(sopt); else { printf("IP_FW_NAT_CFG: %s\n", "ipfw_nat not present, please load it"); error = EINVAL; } break; case IP_FW_NAT_DEL: if (IPFW_NAT_LOADED) error = ipfw_nat_del_ptr(sopt); else { printf("IP_FW_NAT_DEL: %s\n", "ipfw_nat not present, please load it"); error = EINVAL; } break; case IP_FW_NAT_GET_CONFIG: if (IPFW_NAT_LOADED) error = ipfw_nat_get_cfg_ptr(sopt); else { printf("IP_FW_NAT_GET_CFG: %s\n", "ipfw_nat not present, please load it"); error = EINVAL; } break; case IP_FW_NAT_GET_LOG: if (IPFW_NAT_LOADED) error = ipfw_nat_get_log_ptr(sopt); else { printf("IP_FW_NAT_GET_LOG: %s\n", "ipfw_nat not present, please load it"); error = EINVAL; } break; default: printf("ipfw: ipfw_ctl invalid option %d\n", sopt->sopt_name); error = EINVAL; } return (error); #undef RULE_MAXSIZE } #define RULE_MAXSIZE (256*sizeof(u_int32_t)) /* Functions to convert rules 7.2 <==> 8.0 */ int convert_rule_to_7(struct ip_fw *rule) { /* Used to modify original rule */ struct ip_fw7 *rule7 = (struct ip_fw7 *)rule; /* copy of original rule, version 8 */ struct ip_fw *tmp; /* Used to copy commands */ ipfw_insn *ccmd, *dst; int ll = 0, ccmdlen = 0; tmp = malloc(RULE_MAXSIZE, M_TEMP, M_NOWAIT | M_ZERO); if (tmp == NULL) { return 1; //XXX error } bcopy(rule, tmp, RULE_MAXSIZE); /* Copy fields */ rule7->_pad = tmp->_pad; rule7->set = tmp->set; rule7->rulenum = tmp->rulenum; rule7->cmd_len = tmp->cmd_len; rule7->act_ofs = tmp->act_ofs; rule7->next_rule = (struct ip_fw7 *)tmp->next_rule; rule7->next = (struct ip_fw7 *)tmp->x_next; rule7->cmd_len = tmp->cmd_len; rule7->pcnt = tmp->pcnt; rule7->bcnt = tmp->bcnt; rule7->timestamp = tmp->timestamp; /* Copy commands */ for (ll = tmp->cmd_len, ccmd = tmp->cmd, dst = rule7->cmd ; ll > 0 ; ll -= ccmdlen, ccmd += ccmdlen, dst += ccmdlen) { ccmdlen = F_LEN(ccmd); bcopy(ccmd, dst, F_LEN(ccmd)*sizeof(uint32_t)); if (dst->opcode > O_NAT) /* O_REASS doesn't exists in 7.2 version, so * decrement opcode if it is after O_REASS */ dst->opcode--; if (ccmdlen > ll) { printf("ipfw: opcode %d size truncated\n", ccmd->opcode); return EINVAL; } } free(tmp, M_TEMP); return 0; } int convert_rule_to_8(struct ip_fw *rule) { /* Used to modify original rule */ struct ip_fw7 *rule7 = (struct ip_fw7 *) rule; /* Used to copy commands */ ipfw_insn *ccmd, *dst; int ll = 0, ccmdlen = 0; /* Copy of original rule */ struct ip_fw7 *tmp = malloc(RULE_MAXSIZE, M_TEMP, M_NOWAIT | M_ZERO); if (tmp == NULL) { return 1; //XXX error } bcopy(rule7, tmp, RULE_MAXSIZE); for (ll = tmp->cmd_len, ccmd = tmp->cmd, dst = rule->cmd ; ll > 0 ; ll -= ccmdlen, ccmd += ccmdlen, dst += ccmdlen) { ccmdlen = F_LEN(ccmd); bcopy(ccmd, dst, F_LEN(ccmd)*sizeof(uint32_t)); if (dst->opcode > O_NAT) /* O_REASS doesn't exists in 7.2 version, so * increment opcode if it is after O_REASS */ dst->opcode++; if (ccmdlen > ll) { printf("ipfw: opcode %d size truncated\n", ccmd->opcode); return EINVAL; } } rule->_pad = tmp->_pad; rule->set = tmp->set; rule->rulenum = tmp->rulenum; rule->cmd_len = tmp->cmd_len; rule->act_ofs = tmp->act_ofs; rule->next_rule = (struct ip_fw *)tmp->next_rule; rule->x_next = (struct ip_fw *)tmp->next; rule->cmd_len = tmp->cmd_len; rule->id = 0; /* XXX see if is ok = 0 */ rule->pcnt = tmp->pcnt; rule->bcnt = tmp->bcnt; rule->timestamp = tmp->timestamp; free (tmp, M_TEMP); return 0; } /* end of file */ ipfw3-2012/sys/netinet/ipfw/ip_fw_nat.c000644 000423 000000 00000036547 12006744011 020303 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 2008 Paolo Pisati * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include __FBSDID("$FreeBSD: user/luigi/ipfw3-head/sys/netinet/ipfw/ip_fw_nat.c 200975 2009-12-25 01:15:39Z luigi $"); #include #include #include #include #include #include #include #include #define IPFW_INTERNAL /* Access to protected data structures in ip_fw.h. */ #include #include #include #include #include #include #include #include #include #include #include /* XXX for in_cksum */ static VNET_DEFINE(eventhandler_tag, ifaddr_event_tag); #define V_ifaddr_event_tag VNET(ifaddr_event_tag) static void ifaddr_change(void *arg, struct ifnet *ifp) { struct cfg_nat *ptr; struct ifaddr *ifa; struct ip_fw_chain *chain; (void)arg; chain = &V_layer3_chain; IPFW_WLOCK(chain); /* Check every nat entry... */ LIST_FOREACH(ptr, &chain->nat, _next) { /* ...using nic 'ifp->if_xname' as dynamic alias address. */ if (strncmp(ptr->if_name, ifp->if_xname, IF_NAMESIZE) != 0) continue; if_addr_rlock(ifp); TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { if (ifa->ifa_addr == NULL) continue; if (ifa->ifa_addr->sa_family != AF_INET) continue; ptr->ip = ((struct sockaddr_in *) (ifa->ifa_addr))->sin_addr; LibAliasSetAddress(ptr->lib, ptr->ip); } if_addr_runlock(ifp); } IPFW_WUNLOCK(chain); } /* * delete the pointers for nat entry ix, or all of them if ix < 0 */ static void flush_nat_ptrs(struct ip_fw_chain *chain, const int ix) { int i; ipfw_insn_nat *cmd; IPFW_WLOCK_ASSERT(chain); for (i = 0; i < chain->n_rules; i++) { cmd = (ipfw_insn_nat *)ACTION_PTR(chain->map[i]); /* XXX skip log and the like ? */ if (cmd->o.opcode == O_NAT && cmd->nat != NULL && (ix < 0 || cmd->nat->id == ix)) cmd->nat = NULL; } } static void del_redir_spool_cfg(struct cfg_nat *n, struct redir_chain *head) { struct cfg_redir *r, *tmp_r; struct cfg_spool *s, *tmp_s; int i, num; LIST_FOREACH_SAFE(r, head, _next, tmp_r) { num = 1; /* Number of alias_link to delete. */ switch (r->mode) { case REDIR_PORT: num = r->pport_cnt; /* FALLTHROUGH */ case REDIR_ADDR: case REDIR_PROTO: /* Delete all libalias redirect entry. */ for (i = 0; i < num; i++) LibAliasRedirectDelete(n->lib, r->alink[i]); /* Del spool cfg if any. */ LIST_FOREACH_SAFE(s, &r->spool_chain, _next, tmp_s) { LIST_REMOVE(s, _next); free(s, M_IPFW); } free(r->alink, M_IPFW); LIST_REMOVE(r, _next); free(r, M_IPFW); break; default: printf("unknown redirect mode: %u\n", r->mode); /* XXX - panic?!?!? */ break; } } } static int add_redir_spool_cfg(char *buf, struct cfg_nat *ptr) { struct cfg_redir *r, *ser_r; struct cfg_spool *s, *ser_s; int cnt, off, i; for (cnt = 0, off = 0; cnt < ptr->redir_cnt; cnt++) { ser_r = (struct cfg_redir *)&buf[off]; r = malloc(SOF_REDIR, M_IPFW, M_WAITOK | M_ZERO); memcpy(r, ser_r, SOF_REDIR); LIST_INIT(&r->spool_chain); off += SOF_REDIR; r->alink = malloc(sizeof(struct alias_link *) * r->pport_cnt, M_IPFW, M_WAITOK | M_ZERO); switch (r->mode) { case REDIR_ADDR: r->alink[0] = LibAliasRedirectAddr(ptr->lib, r->laddr, r->paddr); break; case REDIR_PORT: for (i = 0 ; i < r->pport_cnt; i++) { /* If remotePort is all ports, set it to 0. */ u_short remotePortCopy = r->rport + i; if (r->rport_cnt == 1 && r->rport == 0) remotePortCopy = 0; r->alink[i] = LibAliasRedirectPort(ptr->lib, r->laddr, htons(r->lport + i), r->raddr, htons(remotePortCopy), r->paddr, htons(r->pport + i), r->proto); if (r->alink[i] == NULL) { r->alink[0] = NULL; break; } } break; case REDIR_PROTO: r->alink[0] = LibAliasRedirectProto(ptr->lib ,r->laddr, r->raddr, r->paddr, r->proto); break; default: printf("unknown redirect mode: %u\n", r->mode); break; } /* XXX perhaps return an error instead of panic ? */ if (r->alink[0] == NULL) panic("LibAliasRedirect* returned NULL"); /* LSNAT handling. */ for (i = 0; i < r->spool_cnt; i++) { ser_s = (struct cfg_spool *)&buf[off]; s = malloc(SOF_REDIR, M_IPFW, M_WAITOK | M_ZERO); memcpy(s, ser_s, SOF_SPOOL); LibAliasAddServer(ptr->lib, r->alink[0], s->addr, htons(s->port)); off += SOF_SPOOL; /* Hook spool entry. */ LIST_INSERT_HEAD(&r->spool_chain, s, _next); } /* And finally hook this redir entry. */ LIST_INSERT_HEAD(&ptr->redir_chain, r, _next); } return (1); } static int ipfw_nat(struct ip_fw_args *args, struct cfg_nat *t, struct mbuf *m) { struct mbuf *mcl; struct ip *ip; /* XXX - libalias duct tape */ int ldt, retval; char *c; ldt = 0; retval = 0; mcl = m_megapullup(m, m->m_pkthdr.len); if (mcl == NULL) { args->m = NULL; return (IP_FW_DENY); } ip = mtod(mcl, struct ip *); /* * XXX - Libalias checksum offload 'duct tape': * * locally generated packets have only pseudo-header checksum * calculated and libalias will break it[1], so mark them for * later fix. Moreover there are cases when libalias modifies * tcp packet data[2], mark them for later fix too. * * [1] libalias was never meant to run in kernel, so it does * not have any knowledge about checksum offloading, and * expects a packet with a full internet checksum. * Unfortunately, packets generated locally will have just the * pseudo header calculated, and when libalias tries to adjust * the checksum it will actually compute a wrong value. * * [2] when libalias modifies tcp's data content, full TCP * checksum has to be recomputed: the problem is that * libalias does not have any idea about checksum offloading. * To work around this, we do not do checksumming in LibAlias, * but only mark the packets in th_x2 field. If we receive a * marked packet, we calculate correct checksum for it * aware of offloading. Why such a terrible hack instead of * recalculating checksum for each packet? * Because the previous checksum was not checked! * Recalculating checksums for EVERY packet will hide ALL * transmission errors. Yes, marked packets still suffer from * this problem. But, sigh, natd(8) has this problem, too. * * TODO: -make libalias mbuf aware (so * it can handle delayed checksum and tso) */ if (mcl->m_pkthdr.rcvif == NULL && mcl->m_pkthdr.csum_flags & CSUM_DELAY_DATA) ldt = 1; c = mtod(mcl, char *); if (args->oif == NULL) retval = LibAliasIn(t->lib, c, mcl->m_len + M_TRAILINGSPACE(mcl)); else retval = LibAliasOut(t->lib, c, mcl->m_len + M_TRAILINGSPACE(mcl)); if (retval == PKT_ALIAS_RESPOND) { m->m_flags |= M_SKIP_FIREWALL; retval = PKT_ALIAS_OK; } if (retval != PKT_ALIAS_OK && retval != PKT_ALIAS_FOUND_HEADER_FRAGMENT) { /* XXX - should i add some logging? */ m_free(mcl); args->m = NULL; return (IP_FW_DENY); } mcl->m_pkthdr.len = mcl->m_len = ntohs(ip->ip_len); /* * XXX - libalias checksum offload * 'duct tape' (see above) */ if ((ip->ip_off & htons(IP_OFFMASK)) == 0 && ip->ip_p == IPPROTO_TCP) { struct tcphdr *th; th = (struct tcphdr *)(ip + 1); if (th->th_x2) ldt = 1; } if (ldt) { struct tcphdr *th; struct udphdr *uh; u_short cksum; ip->ip_len = ntohs(ip->ip_len); cksum = in_pseudo(ip->ip_src.s_addr, ip->ip_dst.s_addr, htons(ip->ip_p + ip->ip_len - (ip->ip_hl << 2))); switch (ip->ip_p) { case IPPROTO_TCP: th = (struct tcphdr *)(ip + 1); /* * Maybe it was set in * libalias... */ th->th_x2 = 0; th->th_sum = cksum; mcl->m_pkthdr.csum_data = offsetof(struct tcphdr, th_sum); break; case IPPROTO_UDP: uh = (struct udphdr *)(ip + 1); uh->uh_sum = cksum; mcl->m_pkthdr.csum_data = offsetof(struct udphdr, uh_sum); break; } /* No hw checksum offloading: do it ourselves */ if ((mcl->m_pkthdr.csum_flags & CSUM_DELAY_DATA) == 0) { in_delayed_cksum(mcl); mcl->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA; } ip->ip_len = htons(ip->ip_len); } args->m = mcl; return (IP_FW_NAT); } static struct cfg_nat * lookup_nat(struct nat_list *l, int nat_id) { struct cfg_nat *res; LIST_FOREACH(res, l, _next) { if (res->id == nat_id) break; } return res; } static int ipfw_nat_cfg(struct sockopt *sopt) { struct cfg_nat *ptr, *ser_n; char *buf; struct ip_fw_chain *chain = &V_layer3_chain; buf = malloc(NAT_BUF_LEN, M_IPFW, M_WAITOK | M_ZERO); sooptcopyin(sopt, buf, NAT_BUF_LEN, sizeof(struct cfg_nat)); ser_n = (struct cfg_nat *)buf; /* check valid parameter ser_n->id > 0 ? */ /* * Find/create nat rule. */ IPFW_WLOCK(chain); ptr = lookup_nat(&chain->nat, ser_n->id); if (ptr == NULL) { /* New rule: allocate and init new instance. */ ptr = malloc(sizeof(struct cfg_nat), M_IPFW, M_NOWAIT | M_ZERO); if (ptr == NULL) { IPFW_WUNLOCK(chain); free(buf, M_IPFW); return (ENOSPC); } ptr->lib = LibAliasInit(NULL); if (ptr->lib == NULL) { IPFW_WUNLOCK(chain); free(ptr, M_IPFW); free(buf, M_IPFW); return (EINVAL); } LIST_INIT(&ptr->redir_chain); } else { /* Entry already present: temporarly unhook it. */ LIST_REMOVE(ptr, _next); flush_nat_ptrs(chain, ser_n->id); } IPFW_WUNLOCK(chain); /* * Basic nat configuration. */ ptr->id = ser_n->id; /* * XXX - what if this rule doesn't nat any ip and just * redirect? * do we set aliasaddress to 0.0.0.0? */ ptr->ip = ser_n->ip; ptr->redir_cnt = ser_n->redir_cnt; ptr->mode = ser_n->mode; LibAliasSetMode(ptr->lib, ser_n->mode, ser_n->mode); LibAliasSetAddress(ptr->lib, ptr->ip); memcpy(ptr->if_name, ser_n->if_name, IF_NAMESIZE); /* * Redir and LSNAT configuration. */ /* Delete old cfgs. */ del_redir_spool_cfg(ptr, &ptr->redir_chain); /* Add new entries. */ add_redir_spool_cfg(&buf[(sizeof(struct cfg_nat))], ptr); free(buf, M_IPFW); IPFW_WLOCK(chain); LIST_INSERT_HEAD(&chain->nat, ptr, _next); IPFW_WUNLOCK(chain); return (0); } static int ipfw_nat_del(struct sockopt *sopt) { struct cfg_nat *ptr; struct ip_fw_chain *chain = &V_layer3_chain; int i; sooptcopyin(sopt, &i, sizeof i, sizeof i); /* XXX validate i */ IPFW_WLOCK(chain); ptr = lookup_nat(&chain->nat, i); if (ptr == NULL) { IPFW_WUNLOCK(chain); return (EINVAL); } LIST_REMOVE(ptr, _next); flush_nat_ptrs(chain, i); IPFW_WUNLOCK(chain); del_redir_spool_cfg(ptr, &ptr->redir_chain); LibAliasUninit(ptr->lib); free(ptr, M_IPFW); return (0); } static int ipfw_nat_get_cfg(struct sockopt *sopt) { uint8_t *data; struct cfg_nat *n; struct cfg_redir *r; struct cfg_spool *s; int nat_cnt, off; struct ip_fw_chain *chain; int err = ENOSPC; chain = &V_layer3_chain; nat_cnt = 0; off = sizeof(nat_cnt); data = malloc(NAT_BUF_LEN, M_IPFW, M_WAITOK | M_ZERO); IPFW_RLOCK(chain); /* Serialize all the data. */ LIST_FOREACH(n, &chain->nat, _next) { nat_cnt++; if (off + SOF_NAT >= NAT_BUF_LEN) goto nospace; bcopy(n, &data[off], SOF_NAT); off += SOF_NAT; LIST_FOREACH(r, &n->redir_chain, _next) { if (off + SOF_REDIR >= NAT_BUF_LEN) goto nospace; bcopy(r, &data[off], SOF_REDIR); off += SOF_REDIR; LIST_FOREACH(s, &r->spool_chain, _next) { if (off + SOF_SPOOL >= NAT_BUF_LEN) goto nospace; bcopy(s, &data[off], SOF_SPOOL); off += SOF_SPOOL; } } } err = 0; /* all good */ nospace: IPFW_RUNLOCK(chain); if (err == 0) { bcopy(&nat_cnt, data, sizeof(nat_cnt)); sooptcopyout(sopt, data, NAT_BUF_LEN); } else { printf("serialized data buffer not big enough:" "please increase NAT_BUF_LEN\n"); } free(data, M_IPFW); return (err); } static int ipfw_nat_get_log(struct sockopt *sopt) { uint8_t *data; struct cfg_nat *ptr; int i, size; struct ip_fw_chain *chain; chain = &V_layer3_chain; IPFW_RLOCK(chain); /* one pass to count, one to copy the data */ i = 0; LIST_FOREACH(ptr, &chain->nat, _next) { if (ptr->lib->logDesc == NULL) continue; i++; } size = i * (LIBALIAS_BUF_SIZE + sizeof(int)); data = malloc(size, M_IPFW, M_NOWAIT | M_ZERO); if (data == NULL) { IPFW_RUNLOCK(chain); return (ENOSPC); } i = 0; LIST_FOREACH(ptr, &chain->nat, _next) { if (ptr->lib->logDesc == NULL) continue; bcopy(&ptr->id, &data[i], sizeof(int)); i += sizeof(int); bcopy(ptr->lib->logDesc, &data[i], LIBALIAS_BUF_SIZE); i += LIBALIAS_BUF_SIZE; } IPFW_RUNLOCK(chain); sooptcopyout(sopt, data, size); free(data, M_IPFW); return(0); } static void ipfw_nat_init(void) { IPFW_WLOCK(&V_layer3_chain); /* init ipfw hooks */ ipfw_nat_ptr = ipfw_nat; lookup_nat_ptr = lookup_nat; ipfw_nat_cfg_ptr = ipfw_nat_cfg; ipfw_nat_del_ptr = ipfw_nat_del; ipfw_nat_get_cfg_ptr = ipfw_nat_get_cfg; ipfw_nat_get_log_ptr = ipfw_nat_get_log; IPFW_WUNLOCK(&V_layer3_chain); V_ifaddr_event_tag = EVENTHANDLER_REGISTER( ifaddr_event, ifaddr_change, NULL, EVENTHANDLER_PRI_ANY); } static void ipfw_nat_destroy(void) { struct cfg_nat *ptr, *ptr_temp; struct ip_fw_chain *chain; chain = &V_layer3_chain; IPFW_WLOCK(chain); LIST_FOREACH_SAFE(ptr, &chain->nat, _next, ptr_temp) { LIST_REMOVE(ptr, _next); del_redir_spool_cfg(ptr, &ptr->redir_chain); LibAliasUninit(ptr->lib); free(ptr, M_IPFW); } EVENTHANDLER_DEREGISTER(ifaddr_event, V_ifaddr_event_tag); flush_nat_ptrs(chain, -1 /* flush all */); /* deregister ipfw_nat */ ipfw_nat_ptr = NULL; lookup_nat_ptr = NULL; ipfw_nat_cfg_ptr = NULL; ipfw_nat_del_ptr = NULL; ipfw_nat_get_cfg_ptr = NULL; ipfw_nat_get_log_ptr = NULL; IPFW_WUNLOCK(chain); } static int ipfw_nat_modevent(module_t mod, int type, void *unused) { int err = 0; switch (type) { case MOD_LOAD: ipfw_nat_init(); break; case MOD_UNLOAD: ipfw_nat_destroy(); break; default: return EOPNOTSUPP; break; } return err; } static moduledata_t ipfw_nat_mod = { "ipfw_nat", ipfw_nat_modevent, 0 }; DECLARE_MODULE(ipfw_nat, ipfw_nat_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY); MODULE_DEPEND(ipfw_nat, libalias, 1, 1, 1); MODULE_DEPEND(ipfw_nat, ipfw, 2, 2, 2); MODULE_VERSION(ipfw_nat, 1); /* end of file */ ipfw3-2012/sys/netinet/ipfw/dn_sched_wf2q.c000644 000423 000000 00000027562 12006744011 021040 0ustar00luigiwheel000000 000000 /* * Copyright (c) 2010 Riccardo Panicucci, Universita` di Pisa * Copyright (c) 2000-2002 Luigi Rizzo, Universita` di Pisa * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: dn_sched_wf2q.c 11480 2012-07-31 08:02:00Z luigi $ */ #ifdef _KERNEL #include #include #include #include #include #include #include /* IFNAMSIZ */ #include #include /* ipfw_rule_ref */ #include /* flow_id */ #include #include #include #include #else #include #endif #ifndef MAX64 #define MAX64(x,y) (( (int64_t) ( (y)-(x) )) > 0 ) ? (y) : (x) #endif /* * timestamps are computed on 64 bit using fixed point arithmetic. * LMAX_BITS, WMAX_BITS are the max number of bits for the packet len * and sum of weights, respectively. FRAC_BITS is the number of * fractional bits. We want FRAC_BITS >> WMAX_BITS to avoid too large * errors when computing the inverse, FRAC_BITS < 32 so we can do 1/w * using an unsigned 32-bit division, and to avoid wraparounds we need * LMAX_BITS + WMAX_BITS + FRAC_BITS << 64 * As an example * FRAC_BITS = 26, LMAX_BITS=14, WMAX_BITS = 19 */ #ifndef FRAC_BITS #define FRAC_BITS 28 /* shift for fixed point arithmetic */ #define ONE_FP (1UL << FRAC_BITS) #endif /* * Private information for the scheduler instance: * sch_heap (key is Finish time) returns the next queue to serve * ne_heap (key is Start time) stores not-eligible queues * idle_heap (key=start/finish time) stores idle flows. It must * support extract-from-middle. * A flow is only in 1 of the three heaps. * XXX todo: use a more efficient data structure, e.g. a tree sorted * by F with min_subtree(S) in each node */ struct wf2qp_si { struct dn_heap sch_heap; /* top extract - key Finish time */ struct dn_heap ne_heap; /* top extract - key Start time */ struct dn_heap idle_heap; /* random extract - key Start=Finish time */ uint64_t V; /* virtual time */ uint32_t inv_wsum; /* inverse of sum of weights */ uint32_t wsum; /* sum of weights */ }; struct wf2qp_queue { struct dn_queue _q; uint64_t S, F; /* start time, finish time */ uint32_t inv_w; /* ONE_FP / weight */ int32_t heap_pos; /* position (index) of struct in heap */ }; /* * This file implements a WF2Q+ scheduler as it has been in dummynet * since 2000. * The scheduler supports per-flow queues and has O(log N) complexity. * * WF2Q+ needs to drain entries from the idle heap so that we * can keep the sum of weights up to date. We can do it whenever * we get a chance, or periodically, or following some other * strategy. The function idle_check() drains at most N elements * from the idle heap. */ static void idle_check(struct wf2qp_si *si, int n, int force) { struct dn_heap *h = &si->idle_heap; while (n-- > 0 && h->elements > 0 && (force || DN_KEY_LT(HEAP_TOP(h)->key, si->V))) { struct dn_queue *q = HEAP_TOP(h)->object; struct wf2qp_queue *alg_fq = (struct wf2qp_queue *)q; heap_extract(h, NULL); /* XXX to let the flowset delete the queue we should * mark it as 'unused' by the scheduler. */ alg_fq->S = alg_fq->F + 1; /* Mark timestamp as invalid. */ si->wsum -= q->fs->fs.par[0]; /* adjust sum of weights */ if (si->wsum > 0) si->inv_wsum = ONE_FP/si->wsum; } } static int wf2qp_enqueue(struct dn_sch_inst *_si, struct dn_queue *q, struct mbuf *m) { struct dn_fsk *fs = q->fs; struct wf2qp_si *si = (struct wf2qp_si *)(_si + 1); struct wf2qp_queue *alg_fq; uint64_t len = m->m_pkthdr.len; if (m != q->mq.head) { if (dn_enqueue(q, m, 0)) /* packet was dropped */ return 1; if (m != q->mq.head) /* queue was already busy */ return 0; } /* If reach this point, queue q was idle */ alg_fq = (struct wf2qp_queue *)q; if (DN_KEY_LT(alg_fq->F, alg_fq->S)) { /* Fbrand new queue. */ alg_fq->S = si->V; /* init start time */ si->wsum += fs->fs.par[0]; /* add weight of new queue. */ si->inv_wsum = ONE_FP/si->wsum; } else { /* if it was idle then it was in the idle heap */ heap_extract(&si->idle_heap, q); alg_fq->S = MAX64(alg_fq->F, si->V); /* compute new S */ } alg_fq->F = alg_fq->S + len * alg_fq->inv_w; /* if nothing is backlogged, make sure this flow is eligible */ if (si->ne_heap.elements == 0 && si->sch_heap.elements == 0) si->V = MAX64(alg_fq->S, si->V); /* * Look at eligibility. A flow is not eligibile if S>V (when * this happens, it means that there is some other flow already * scheduled for the same pipe, so the sch_heap cannot be * empty). If the flow is not eligible we just store it in the * ne_heap. Otherwise, we store in the sch_heap. * Note that for all flows in sch_heap (SCH), S_i <= V, * and for all flows in ne_heap (NEH), S_i > V. * So when we need to compute max(V, min(S_i)) forall i in * SCH+NEH, we only need to look into NEH. */ if (DN_KEY_LT(si->V, alg_fq->S)) { /* S>V means flow Not eligible. */ if (si->sch_heap.elements == 0) D("++ ouch! not eligible but empty scheduler!"); heap_insert(&si->ne_heap, alg_fq->S, q); } else { heap_insert(&si->sch_heap, alg_fq->F, q); } return 0; } /* XXX invariant: sch > 0 || V >= min(S in neh) */ static struct mbuf * wf2qp_dequeue(struct dn_sch_inst *_si) { /* Access scheduler instance private data */ struct wf2qp_si *si = (struct wf2qp_si *)(_si + 1); struct mbuf *m; struct dn_queue *q; struct dn_heap *sch = &si->sch_heap; struct dn_heap *neh = &si->ne_heap; struct wf2qp_queue *alg_fq; if (sch->elements == 0 && neh->elements == 0) { /* we have nothing to do. We could kill the idle heap * altogether and reset V */ idle_check(si, 0x7fffffff, 1); si->V = 0; si->wsum = 0; /* should be set already */ return NULL; /* quick return if nothing to do */ } idle_check(si, 1, 0); /* drain something from the idle heap */ /* make sure at least one element is eligible, bumping V * and moving entries that have become eligible. * We need to repeat the first part twice, before and * after extracting the candidate, or enqueue() will * find the data structure in a wrong state. */ m = NULL; for(;;) { /* * Compute V = max(V, min(S_i)). Remember that all elements * in sch have by definition S_i <= V so if sch is not empty, * V is surely the max and we must not update it. Conversely, * if sch is empty we only need to look at neh. * We don't need to move the queues, as it will be done at the * next enqueue */ if (sch->elements == 0 && neh->elements > 0) { si->V = MAX64(si->V, HEAP_TOP(neh)->key); } while (neh->elements > 0 && DN_KEY_LEQ(HEAP_TOP(neh)->key, si->V)) { q = HEAP_TOP(neh)->object; alg_fq = (struct wf2qp_queue *)q; heap_extract(neh, NULL); heap_insert(sch, alg_fq->F, q); } if (m) /* pkt found in previous iteration */ break; /* ok we have at least one eligible pkt */ q = HEAP_TOP(sch)->object; alg_fq = (struct wf2qp_queue *)q; m = dn_dequeue(q); heap_extract(sch, NULL); /* Remove queue from heap. */ si->V += (uint64_t)(m->m_pkthdr.len) * si->inv_wsum; alg_fq->S = alg_fq->F; /* Update start time. */ if (q->mq.head == 0) { /* not backlogged any more. */ heap_insert(&si->idle_heap, alg_fq->F, q); } else { /* Still backlogged. */ /* Update F, store in neh or sch */ uint64_t len = q->mq.head->m_pkthdr.len; alg_fq->F += len * alg_fq->inv_w; if (DN_KEY_LEQ(alg_fq->S, si->V)) { heap_insert(sch, alg_fq->F, q); } else { heap_insert(neh, alg_fq->S, q); } } } return m; } static int wf2qp_new_sched(struct dn_sch_inst *_si) { struct wf2qp_si *si = (struct wf2qp_si *)(_si + 1); int ofs = offsetof(struct wf2qp_queue, heap_pos); /* all heaps support extract from middle */ if (heap_init(&si->idle_heap, 16, ofs) || heap_init(&si->sch_heap, 16, ofs) || heap_init(&si->ne_heap, 16, ofs)) { heap_free(&si->ne_heap); heap_free(&si->sch_heap); heap_free(&si->idle_heap); return ENOMEM; } return 0; } static int wf2qp_free_sched(struct dn_sch_inst *_si) { struct wf2qp_si *si = (struct wf2qp_si *)(_si + 1); heap_free(&si->sch_heap); heap_free(&si->ne_heap); heap_free(&si->idle_heap); return 0; } static int wf2qp_new_fsk(struct dn_fsk *fs) { ipdn_bound_var(&fs->fs.par[0], 1, 1, 100, "WF2Q+ weight"); return 0; } static int wf2qp_new_queue(struct dn_queue *_q) { struct wf2qp_queue *q = (struct wf2qp_queue *)_q; _q->ni.oid.subtype = DN_SCHED_WF2QP; q->F = 0; /* not strictly necessary */ q->S = q->F + 1; /* mark timestamp as invalid. */ q->inv_w = ONE_FP / _q->fs->fs.par[0]; if (_q->mq.head != NULL) { wf2qp_enqueue(_q->_si, _q, _q->mq.head); } return 0; } /* * Called when the infrastructure removes a queue (e.g. flowset * is reconfigured). Nothing to do if we did not 'own' the queue, * otherwise remove it from the right heap and adjust the sum * of weights. */ static int wf2qp_free_queue(struct dn_queue *q, int safe) { struct wf2qp_queue *alg_fq = (struct wf2qp_queue *)q; struct wf2qp_si *si = (struct wf2qp_si *)(q->_si + 1); if (alg_fq->S >= alg_fq->F + 1) return 0; /* nothing to do, not in any heap */ /* queue is in a scheduler heap */ if (safe) /* do not delete in safe mode */ return 1; si->wsum -= q->fs->fs.par[0]; if (si->wsum > 0) si->inv_wsum = ONE_FP/si->wsum; /* extract from the heap. XXX TODO we may need to adjust V * to make sure the invariants hold. */ if (q->mq.head == NULL) { heap_extract(&si->idle_heap, q); } else if (DN_KEY_LT(si->V, alg_fq->S)) { heap_extract(&si->ne_heap, q); } else { heap_extract(&si->sch_heap, q); } return 0; } /* * WF2Q+ scheduler descriptor * contains the type of the scheduler, the name, the size of the * structures and function pointers. */ static struct dn_alg wf2qp_desc = { _SI( .type = ) DN_SCHED_WF2QP, _SI( .name = ) "WF2Q+", _SI( .flags = ) DN_MULTIQUEUE, /* we need extra space in the si and the queue */ _SI( .schk_datalen = ) 0, _SI( .si_datalen = ) sizeof(struct wf2qp_si), _SI( .q_datalen = ) sizeof(struct wf2qp_queue) - sizeof(struct dn_queue), _SI( .enqueue = ) wf2qp_enqueue, _SI( .dequeue = ) wf2qp_dequeue, _SI( .config = ) NULL, _SI( .destroy = ) NULL, _SI( .new_sched = ) wf2qp_new_sched, _SI( .free_sched = ) wf2qp_free_sched, _SI( .new_fsk = ) wf2qp_new_fsk, _SI( .free_fsk = ) NULL, _SI( .new_queue = ) wf2qp_new_queue, _SI( .free_queue = ) wf2qp_free_queue, }; DECLARE_DNSCHED_MODULE(dn_wf2qp, &wf2qp_desc); ipfw3-2012/sys/netinet/ipfw/ip_fw_dynamic.c000644 000423 000000 00000100475 12006744011 021135 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 2002 Luigi Rizzo, Universita` di Pisa * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include __FBSDID("$FreeBSD: head/sys/netinet/ipfw/ip_fw_dynamic.c 200601 2009-12-16 10:48:40Z luigi $"); #define DEB(x) #define DDB(x) x /* * Dynamic rule support for ipfw */ #if !defined(KLD_MODULE) #include "opt_ipfw.h" #include "opt_ipdivert.h" #include "opt_ipdn.h" #include "opt_inet.h" #ifndef INET #error IPFIREWALL requires INET. #endif /* INET */ #endif #include "opt_inet6.h" #include "opt_ipsec.h" #include #include #include #include #include #include #include #include #include #include /* for ETHERTYPE_IP */ #include #include #include #include #include /* ip_defttl */ #include #include #include #include #include /* IN6_ARE_ADDR_EQUAL */ #ifdef INET6 #include #include #endif #include /* XXX for in_cksum */ #ifdef MAC #include #endif /* * Description of dynamic rules. * * Dynamic rules are stored in lists accessed through a hash table * (ipfw_dyn_v) whose size is curr_dyn_buckets. This value can * be modified through the sysctl variable dyn_buckets which is * updated when the table becomes empty. * * XXX currently there is only one list, ipfw_dyn. * * When a packet is received, its address fields are first masked * with the mask defined for the rule, then hashed, then matched * against the entries in the corresponding list. * Dynamic rules can be used for different purposes: * + stateful rules; * + enforcing limits on the number of sessions; * + in-kernel NAT (not implemented yet) * * The lifetime of dynamic rules is regulated by dyn_*_lifetime, * measured in seconds and depending on the flags. * * The total number of dynamic rules is stored in dyn_count. * The max number of dynamic rules is dyn_max. When we reach * the maximum number of rules we do not create anymore. This is * done to avoid consuming too much memory, but also too much * time when searching on each packet (ideally, we should try instead * to put a limit on the length of the list on each bucket...). * * Each dynamic rule holds a pointer to the parent ipfw rule so * we know what action to perform. Dynamic rules are removed when * the parent rule is deleted. XXX we should make them survive. * * There are some limitations with dynamic rules -- we do not * obey the 'randomized match', and we do not do multiple * passes through the firewall. XXX check the latter!!! */ /* * Static variables followed by global ones */ static VNET_DEFINE(ipfw_dyn_rule **, ipfw_dyn_v); static VNET_DEFINE(u_int32_t, dyn_buckets); static VNET_DEFINE(u_int32_t, curr_dyn_buckets); static VNET_DEFINE(struct callout, ipfw_timeout); #define V_ipfw_dyn_v VNET(ipfw_dyn_v) #define V_dyn_buckets VNET(dyn_buckets) #define V_curr_dyn_buckets VNET(curr_dyn_buckets) #define V_ipfw_timeout VNET(ipfw_timeout) static uma_zone_t ipfw_dyn_rule_zone; #ifndef __FreeBSD__ DEFINE_SPINLOCK(ipfw_dyn_mtx); #else static struct mtx ipfw_dyn_mtx; /* mutex guarding dynamic rules */ #endif #define IPFW_DYN_LOCK_INIT() \ mtx_init(&ipfw_dyn_mtx, "IPFW dynamic rules", NULL, MTX_DEF) #define IPFW_DYN_LOCK_DESTROY() mtx_destroy(&ipfw_dyn_mtx) #define IPFW_DYN_LOCK() mtx_lock(&ipfw_dyn_mtx) #define IPFW_DYN_UNLOCK() mtx_unlock(&ipfw_dyn_mtx) #define IPFW_DYN_LOCK_ASSERT() mtx_assert(&ipfw_dyn_mtx, MA_OWNED) void ipfw_dyn_unlock(void) { IPFW_DYN_UNLOCK(); } /* * Timeouts for various events in handing dynamic rules. */ static VNET_DEFINE(u_int32_t, dyn_ack_lifetime); static VNET_DEFINE(u_int32_t, dyn_syn_lifetime); static VNET_DEFINE(u_int32_t, dyn_fin_lifetime); static VNET_DEFINE(u_int32_t, dyn_rst_lifetime); static VNET_DEFINE(u_int32_t, dyn_udp_lifetime); static VNET_DEFINE(u_int32_t, dyn_short_lifetime); #define V_dyn_ack_lifetime VNET(dyn_ack_lifetime) #define V_dyn_syn_lifetime VNET(dyn_syn_lifetime) #define V_dyn_fin_lifetime VNET(dyn_fin_lifetime) #define V_dyn_rst_lifetime VNET(dyn_rst_lifetime) #define V_dyn_udp_lifetime VNET(dyn_udp_lifetime) #define V_dyn_short_lifetime VNET(dyn_short_lifetime) /* * Keepalives are sent if dyn_keepalive is set. They are sent every * dyn_keepalive_period seconds, in the last dyn_keepalive_interval * seconds of lifetime of a rule. * dyn_rst_lifetime and dyn_fin_lifetime should be strictly lower * than dyn_keepalive_period. */ static VNET_DEFINE(u_int32_t, dyn_keepalive_interval); static VNET_DEFINE(u_int32_t, dyn_keepalive_period); static VNET_DEFINE(u_int32_t, dyn_keepalive); #define V_dyn_keepalive_interval VNET(dyn_keepalive_interval) #define V_dyn_keepalive_period VNET(dyn_keepalive_period) #define V_dyn_keepalive VNET(dyn_keepalive) static VNET_DEFINE(u_int32_t, dyn_count); /* # of dynamic rules */ static VNET_DEFINE(u_int32_t, dyn_max); /* max # of dynamic rules */ #define V_dyn_count VNET(dyn_count) #define V_dyn_max VNET(dyn_max) #ifdef SYSCTL_NODE SYSBEGIN(f2) SYSCTL_DECL(_net_inet_ip_fw); SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_buckets, CTLFLAG_RW, &VNET_NAME(dyn_buckets), 0, "Number of dyn. buckets"); SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, curr_dyn_buckets, CTLFLAG_RD, &VNET_NAME(curr_dyn_buckets), 0, "Current Number of dyn. buckets"); SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_count, CTLFLAG_RD, &VNET_NAME(dyn_count), 0, "Number of dyn. rules"); SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_max, CTLFLAG_RW, &VNET_NAME(dyn_max), 0, "Max number of dyn. rules"); SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_ack_lifetime, CTLFLAG_RW, &VNET_NAME(dyn_ack_lifetime), 0, "Lifetime of dyn. rules for acks"); SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_syn_lifetime, CTLFLAG_RW, &VNET_NAME(dyn_syn_lifetime), 0, "Lifetime of dyn. rules for syn"); SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_fin_lifetime, CTLFLAG_RW, &VNET_NAME(dyn_fin_lifetime), 0, "Lifetime of dyn. rules for fin"); SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_rst_lifetime, CTLFLAG_RW, &VNET_NAME(dyn_rst_lifetime), 0, "Lifetime of dyn. rules for rst"); SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_udp_lifetime, CTLFLAG_RW, &VNET_NAME(dyn_udp_lifetime), 0, "Lifetime of dyn. rules for UDP"); SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_short_lifetime, CTLFLAG_RW, &VNET_NAME(dyn_short_lifetime), 0, "Lifetime of dyn. rules for other situations"); SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_keepalive, CTLFLAG_RW, &VNET_NAME(dyn_keepalive), 0, "Enable keepalives for dyn. rules"); SYSEND #endif /* SYSCTL_NODE */ static __inline int hash_packet6(struct ipfw_flow_id *id) { u_int32_t i; i = (id->dst_ip6.__u6_addr.__u6_addr32[2]) ^ (id->dst_ip6.__u6_addr.__u6_addr32[3]) ^ (id->src_ip6.__u6_addr.__u6_addr32[2]) ^ (id->src_ip6.__u6_addr.__u6_addr32[3]) ^ (id->dst_port) ^ (id->src_port); return i; } /* * IMPORTANT: the hash function for dynamic rules must be commutative * in source and destination (ip,port), because rules are bidirectional * and we want to find both in the same bucket. */ static __inline int hash_packet(struct ipfw_flow_id *id) { u_int32_t i; #ifdef INET6 if (IS_IP6_FLOW_ID(id)) i = hash_packet6(id); else #endif /* INET6 */ i = (id->dst_ip) ^ (id->src_ip) ^ (id->dst_port) ^ (id->src_port); i &= (V_curr_dyn_buckets - 1); return i; } static __inline void unlink_dyn_rule_print(struct ipfw_flow_id *id) { struct in_addr da; #ifdef INET6 char src[INET6_ADDRSTRLEN], dst[INET6_ADDRSTRLEN]; #else char src[INET_ADDRSTRLEN], dst[INET_ADDRSTRLEN]; #endif #ifdef INET6 if (IS_IP6_FLOW_ID(id)) { ip6_sprintf(src, &id->src_ip6); ip6_sprintf(dst, &id->dst_ip6); } else #endif { da.s_addr = htonl(id->src_ip); inet_ntoa_r(da, src); da.s_addr = htonl(id->dst_ip); inet_ntoa_r(da, dst); } printf("ipfw: unlink entry %s %d -> %s %d, %d left\n", src, id->src_port, dst, id->dst_port, V_dyn_count - 1); } /** * unlink a dynamic rule from a chain. prev is a pointer to * the previous one, q is a pointer to the rule to delete, * head is a pointer to the head of the queue. * Modifies q and potentially also head. */ #define UNLINK_DYN_RULE(prev, head, q) { \ ipfw_dyn_rule *old_q = q; \ \ /* remove a refcount to the parent */ \ if (q->dyn_type == O_LIMIT) \ q->parent->count--; \ DEB(unlink_dyn_rule_print(&q->id);) \ if (prev != NULL) \ prev->next = q = q->next; \ else \ head = q = q->next; \ V_dyn_count--; \ uma_zfree(ipfw_dyn_rule_zone, old_q); } #define TIME_LEQ(a,b) ((int)((a)-(b)) <= 0) /** * Remove dynamic rules pointing to "rule", or all of them if rule == NULL. * * If keep_me == NULL, rules are deleted even if not expired, * otherwise only expired rules are removed. * * The value of the second parameter is also used to point to identify * a rule we absolutely do not want to remove (e.g. because we are * holding a reference to it -- this is the case with O_LIMIT_PARENT * rules). The pointer is only used for comparison, so any non-null * value will do. */ static void remove_dyn_rule(struct ip_fw *rule, ipfw_dyn_rule *keep_me) { static u_int32_t last_remove = 0; #define FORCE (keep_me == NULL) ipfw_dyn_rule *prev, *q; int i, pass = 0, max_pass = 0; IPFW_DYN_LOCK_ASSERT(); if (V_ipfw_dyn_v == NULL || V_dyn_count == 0) return; /* do not expire more than once per second, it is useless */ if (!FORCE && last_remove == time_uptime) return; last_remove = time_uptime; /* * because O_LIMIT refer to parent rules, during the first pass only * remove child and mark any pending LIMIT_PARENT, and remove * them in a second pass. */ next_pass: for (i = 0 ; i < V_curr_dyn_buckets ; i++) { for (prev=NULL, q = V_ipfw_dyn_v[i] ; q ; ) { /* * Logic can become complex here, so we split tests. */ if (q == keep_me) goto next; if (rule != NULL && rule != q->rule) goto next; /* not the one we are looking for */ if (q->dyn_type == O_LIMIT_PARENT) { /* * handle parent in the second pass, * record we need one. */ max_pass = 1; if (pass == 0) goto next; if (FORCE && q->count != 0 ) { /* XXX should not happen! */ printf("ipfw: OUCH! cannot remove rule," " count %d\n", q->count); } } else { if (!FORCE && !TIME_LEQ( q->expire, time_uptime )) goto next; } if (q->dyn_type != O_LIMIT_PARENT || !q->count) { UNLINK_DYN_RULE(prev, V_ipfw_dyn_v[i], q); continue; } next: prev=q; q=q->next; } } if (pass++ < max_pass) goto next_pass; } void ipfw_remove_dyn_children(struct ip_fw *rule) { IPFW_DYN_LOCK(); remove_dyn_rule(rule, NULL /* force removal */); IPFW_DYN_UNLOCK(); } /** * lookup a dynamic rule, locked version */ static ipfw_dyn_rule * lookup_dyn_rule_locked(struct ipfw_flow_id *pkt, int *match_direction, struct tcphdr *tcp) { /* * stateful ipfw extensions. * Lookup into dynamic session queue */ #define MATCH_REVERSE 0 #define MATCH_FORWARD 1 #define MATCH_NONE 2 #define MATCH_UNKNOWN 3 int i, dir = MATCH_NONE; ipfw_dyn_rule *prev, *q=NULL; IPFW_DYN_LOCK_ASSERT(); if (V_ipfw_dyn_v == NULL) goto done; /* not found */ i = hash_packet( pkt ); for (prev=NULL, q = V_ipfw_dyn_v[i] ; q != NULL ; ) { if (q->dyn_type == O_LIMIT_PARENT && q->count) goto next; if (TIME_LEQ( q->expire, time_uptime)) { /* expire entry */ UNLINK_DYN_RULE(prev, V_ipfw_dyn_v[i], q); continue; } if (pkt->proto == q->id.proto && q->dyn_type != O_LIMIT_PARENT) { if (IS_IP6_FLOW_ID(pkt)) { if (IN6_ARE_ADDR_EQUAL(&(pkt->src_ip6), &(q->id.src_ip6)) && IN6_ARE_ADDR_EQUAL(&(pkt->dst_ip6), &(q->id.dst_ip6)) && pkt->src_port == q->id.src_port && pkt->dst_port == q->id.dst_port ) { dir = MATCH_FORWARD; break; } if (IN6_ARE_ADDR_EQUAL(&(pkt->src_ip6), &(q->id.dst_ip6)) && IN6_ARE_ADDR_EQUAL(&(pkt->dst_ip6), &(q->id.src_ip6)) && pkt->src_port == q->id.dst_port && pkt->dst_port == q->id.src_port ) { dir = MATCH_REVERSE; break; } } else { if (pkt->src_ip == q->id.src_ip && pkt->dst_ip == q->id.dst_ip && pkt->src_port == q->id.src_port && pkt->dst_port == q->id.dst_port ) { dir = MATCH_FORWARD; break; } if (pkt->src_ip == q->id.dst_ip && pkt->dst_ip == q->id.src_ip && pkt->src_port == q->id.dst_port && pkt->dst_port == q->id.src_port ) { dir = MATCH_REVERSE; break; } } } next: prev = q; q = q->next; } if (q == NULL) goto done; /* q = NULL, not found */ if ( prev != NULL) { /* found and not in front */ prev->next = q->next; q->next = V_ipfw_dyn_v[i]; V_ipfw_dyn_v[i] = q; } if (pkt->proto == IPPROTO_TCP) { /* update state according to flags */ u_char flags = pkt->_flags & (TH_FIN|TH_SYN|TH_RST); #define BOTH_SYN (TH_SYN | (TH_SYN << 8)) #define BOTH_FIN (TH_FIN | (TH_FIN << 8)) q->state |= (dir == MATCH_FORWARD ) ? flags : (flags << 8); switch (q->state) { case TH_SYN: /* opening */ q->expire = time_uptime + V_dyn_syn_lifetime; break; case BOTH_SYN: /* move to established */ case BOTH_SYN | TH_FIN : /* one side tries to close */ case BOTH_SYN | (TH_FIN << 8) : if (tcp) { #define _SEQ_GE(a,b) ((int)(a) - (int)(b) >= 0) u_int32_t ack = ntohl(tcp->th_ack); if (dir == MATCH_FORWARD) { if (q->ack_fwd == 0 || _SEQ_GE(ack, q->ack_fwd)) q->ack_fwd = ack; else { /* ignore out-of-sequence */ break; } } else { if (q->ack_rev == 0 || _SEQ_GE(ack, q->ack_rev)) q->ack_rev = ack; else { /* ignore out-of-sequence */ break; } } } q->expire = time_uptime + V_dyn_ack_lifetime; break; case BOTH_SYN | BOTH_FIN: /* both sides closed */ if (V_dyn_fin_lifetime >= V_dyn_keepalive_period) V_dyn_fin_lifetime = V_dyn_keepalive_period - 1; q->expire = time_uptime + V_dyn_fin_lifetime; break; default: #if 0 /* * reset or some invalid combination, but can also * occur if we use keep-state the wrong way. */ if ( (q->state & ((TH_RST << 8)|TH_RST)) == 0) printf("invalid state: 0x%x\n", q->state); #endif if (V_dyn_rst_lifetime >= V_dyn_keepalive_period) V_dyn_rst_lifetime = V_dyn_keepalive_period - 1; q->expire = time_uptime + V_dyn_rst_lifetime; break; } } else if (pkt->proto == IPPROTO_UDP) { q->expire = time_uptime + V_dyn_udp_lifetime; } else { /* other protocols */ q->expire = time_uptime + V_dyn_short_lifetime; } done: if (match_direction) *match_direction = dir; return q; } ipfw_dyn_rule * ipfw_lookup_dyn_rule(struct ipfw_flow_id *pkt, int *match_direction, struct tcphdr *tcp) { ipfw_dyn_rule *q; IPFW_DYN_LOCK(); q = lookup_dyn_rule_locked(pkt, match_direction, tcp); if (q == NULL) IPFW_DYN_UNLOCK(); /* NB: return table locked when q is not NULL */ return q; } static void realloc_dynamic_table(void) { IPFW_DYN_LOCK_ASSERT(); /* * Try reallocation, make sure we have a power of 2 and do * not allow more than 64k entries. In case of overflow, * default to 1024. */ if (V_dyn_buckets > 65536) V_dyn_buckets = 1024; if ((V_dyn_buckets & (V_dyn_buckets-1)) != 0) { /* not a power of 2 */ V_dyn_buckets = V_curr_dyn_buckets; /* reset */ return; } V_curr_dyn_buckets = V_dyn_buckets; if (V_ipfw_dyn_v != NULL) free(V_ipfw_dyn_v, M_IPFW); for (;;) { V_ipfw_dyn_v = malloc(V_curr_dyn_buckets * sizeof(ipfw_dyn_rule *), M_IPFW, M_NOWAIT | M_ZERO); if (V_ipfw_dyn_v != NULL || V_curr_dyn_buckets <= 2) break; V_curr_dyn_buckets /= 2; } } /** * Install state of type 'type' for a dynamic session. * The hash table contains two type of rules: * - regular rules (O_KEEP_STATE) * - rules for sessions with limited number of sess per user * (O_LIMIT). When they are created, the parent is * increased by 1, and decreased on delete. In this case, * the third parameter is the parent rule and not the chain. * - "parent" rules for the above (O_LIMIT_PARENT). */ static ipfw_dyn_rule * add_dyn_rule(struct ipfw_flow_id *id, u_int8_t dyn_type, struct ip_fw *rule) { ipfw_dyn_rule *r; int i; IPFW_DYN_LOCK_ASSERT(); if (V_ipfw_dyn_v == NULL || (V_dyn_count == 0 && V_dyn_buckets != V_curr_dyn_buckets)) { realloc_dynamic_table(); if (V_ipfw_dyn_v == NULL) return NULL; /* failed ! */ } i = hash_packet(id); r = uma_zalloc(ipfw_dyn_rule_zone, M_NOWAIT | M_ZERO); if (r == NULL) { printf ("ipfw: sorry cannot allocate state\n"); return NULL; } /* increase refcount on parent, and set pointer */ if (dyn_type == O_LIMIT) { ipfw_dyn_rule *parent = (ipfw_dyn_rule *)rule; if ( parent->dyn_type != O_LIMIT_PARENT) panic("invalid parent"); parent->count++; r->parent = parent; rule = parent->rule; } r->id = *id; r->expire = time_uptime + V_dyn_syn_lifetime; r->rule = rule; r->dyn_type = dyn_type; r->pcnt = r->bcnt = 0; r->count = 0; r->bucket = i; r->next = V_ipfw_dyn_v[i]; V_ipfw_dyn_v[i] = r; V_dyn_count++; DEB({ struct in_addr da; #ifdef INET6 char src[INET6_ADDRSTRLEN]; char dst[INET6_ADDRSTRLEN]; #else char src[INET_ADDRSTRLEN]; char dst[INET_ADDRSTRLEN]; #endif #ifdef INET6 if (IS_IP6_FLOW_ID(&(r->id))) { ip6_sprintf(src, &r->id.src_ip6); ip6_sprintf(dst, &r->id.dst_ip6); } else #endif { da.s_addr = htonl(r->id.src_ip); inet_ntoa_r(da, src); da.s_addr = htonl(r->id.dst_ip); inet_ntoa_r(da, dst); } printf("ipfw: add dyn entry ty %d %s %d -> %s %d, total %d\n", dyn_type, src, r->id.src_port, dst, r->id.dst_port, V_dyn_count); }) return r; } /** * lookup dynamic parent rule using pkt and rule as search keys. * If the lookup fails, then install one. */ static ipfw_dyn_rule * lookup_dyn_parent(struct ipfw_flow_id *pkt, struct ip_fw *rule) { ipfw_dyn_rule *q; int i; IPFW_DYN_LOCK_ASSERT(); if (V_ipfw_dyn_v) { int is_v6 = IS_IP6_FLOW_ID(pkt); i = hash_packet( pkt ); for (q = V_ipfw_dyn_v[i] ; q != NULL ; q=q->next) if (q->dyn_type == O_LIMIT_PARENT && rule== q->rule && pkt->proto == q->id.proto && pkt->src_port == q->id.src_port && pkt->dst_port == q->id.dst_port && ( (is_v6 && IN6_ARE_ADDR_EQUAL(&(pkt->src_ip6), &(q->id.src_ip6)) && IN6_ARE_ADDR_EQUAL(&(pkt->dst_ip6), &(q->id.dst_ip6))) || (!is_v6 && pkt->src_ip == q->id.src_ip && pkt->dst_ip == q->id.dst_ip) ) ) { q->expire = time_uptime + V_dyn_short_lifetime; DEB(printf("ipfw: lookup_dyn_parent found 0x%p\n",q);) return q; } } return add_dyn_rule(pkt, O_LIMIT_PARENT, rule); } /** * Install dynamic state for rule type cmd->o.opcode * * Returns 1 (failure) if state is not installed because of errors or because * session limitations are enforced. */ int ipfw_install_state(struct ip_fw *rule, ipfw_insn_limit *cmd, struct ip_fw_args *args, uint32_t tablearg) { static int last_log; ipfw_dyn_rule *q; struct in_addr da; #ifdef INET6 char src[INET6_ADDRSTRLEN + 2], dst[INET6_ADDRSTRLEN + 2]; #else char src[INET_ADDRSTRLEN], dst[INET_ADDRSTRLEN]; #endif src[0] = '\0'; dst[0] = '\0'; IPFW_DYN_LOCK(); DEB( #ifdef INET6 if (IS_IP6_FLOW_ID(&(args->f_id))) { ip6_sprintf(src, &args->f_id.src_ip6); ip6_sprintf(dst, &args->f_id.dst_ip6); } else #endif { da.s_addr = htonl(args->f_id.src_ip); inet_ntoa_r(da, src); da.s_addr = htonl(args->f_id.dst_ip); inet_ntoa_r(da, dst); } printf("ipfw: %s: type %d %s %u -> %s %u\n", __func__, cmd->o.opcode, src, args->f_id.src_port, dst, args->f_id.dst_port); src[0] = '\0'; dst[0] = '\0'; ) q = lookup_dyn_rule_locked(&args->f_id, NULL, NULL); if (q != NULL) { /* should never occur */ if (last_log != time_uptime) { last_log = time_uptime; printf("ipfw: %s: entry already present, done\n", __func__); } IPFW_DYN_UNLOCK(); return (0); } if (V_dyn_count >= V_dyn_max) /* Run out of slots, try to remove any expired rule. */ remove_dyn_rule(NULL, (ipfw_dyn_rule *)1); if (V_dyn_count >= V_dyn_max) { if (last_log != time_uptime) { last_log = time_uptime; printf("ipfw: %s: Too many dynamic rules\n", __func__); } IPFW_DYN_UNLOCK(); return (1); /* cannot install, notify caller */ } switch (cmd->o.opcode) { case O_KEEP_STATE: /* bidir rule */ add_dyn_rule(&args->f_id, O_KEEP_STATE, rule); break; case O_LIMIT: { /* limit number of sessions */ struct ipfw_flow_id id; ipfw_dyn_rule *parent; uint32_t conn_limit; uint16_t limit_mask = cmd->limit_mask; conn_limit = (cmd->conn_limit == IP_FW_TABLEARG) ? tablearg : cmd->conn_limit; DEB( if (cmd->conn_limit == IP_FW_TABLEARG) printf("ipfw: %s: O_LIMIT rule, conn_limit: %u " "(tablearg)\n", __func__, conn_limit); else printf("ipfw: %s: O_LIMIT rule, conn_limit: %u\n", __func__, conn_limit); ) id.dst_ip = id.src_ip = id.dst_port = id.src_port = 0; id.proto = args->f_id.proto; id.addr_type = args->f_id.addr_type; id.fib = M_GETFIB(args->m); if (IS_IP6_FLOW_ID (&(args->f_id))) { if (limit_mask & DYN_SRC_ADDR) id.src_ip6 = args->f_id.src_ip6; if (limit_mask & DYN_DST_ADDR) id.dst_ip6 = args->f_id.dst_ip6; } else { if (limit_mask & DYN_SRC_ADDR) id.src_ip = args->f_id.src_ip; if (limit_mask & DYN_DST_ADDR) id.dst_ip = args->f_id.dst_ip; } if (limit_mask & DYN_SRC_PORT) id.src_port = args->f_id.src_port; if (limit_mask & DYN_DST_PORT) id.dst_port = args->f_id.dst_port; if ((parent = lookup_dyn_parent(&id, rule)) == NULL) { printf("ipfw: %s: add parent failed\n", __func__); IPFW_DYN_UNLOCK(); return (1); } if (parent->count >= conn_limit) { /* See if we can remove some expired rule. */ remove_dyn_rule(rule, parent); if (parent->count >= conn_limit) { if (V_fw_verbose && last_log != time_uptime) { last_log = time_uptime; #ifdef INET6 /* * XXX IPv6 flows are not * supported yet. */ if (IS_IP6_FLOW_ID(&(args->f_id))) { char ip6buf[INET6_ADDRSTRLEN]; snprintf(src, sizeof(src), "[%s]", ip6_sprintf(ip6buf, &args->f_id.src_ip6)); snprintf(dst, sizeof(dst), "[%s]", ip6_sprintf(ip6buf, &args->f_id.dst_ip6)); } else #endif { da.s_addr = htonl(args->f_id.src_ip); inet_ntoa_r(da, src); da.s_addr = htonl(args->f_id.dst_ip); inet_ntoa_r(da, dst); } log(LOG_SECURITY | LOG_DEBUG, "ipfw: %d %s %s:%u -> %s:%u, %s\n", parent->rule->rulenum, "drop session", src, (args->f_id.src_port), dst, (args->f_id.dst_port), "too many entries"); } IPFW_DYN_UNLOCK(); return (1); } } add_dyn_rule(&args->f_id, O_LIMIT, (struct ip_fw *)parent); break; } default: printf("ipfw: %s: unknown dynamic rule type %u\n", __func__, cmd->o.opcode); IPFW_DYN_UNLOCK(); return (1); } /* XXX just set lifetime */ lookup_dyn_rule_locked(&args->f_id, NULL, NULL); IPFW_DYN_UNLOCK(); return (0); } /* * Generate a TCP packet, containing either a RST or a keepalive. * When flags & TH_RST, we are sending a RST packet, because of a * "reset" action matched the packet. * Otherwise we are sending a keepalive, and flags & TH_ * The 'replyto' mbuf is the mbuf being replied to, if any, and is required * so that MAC can label the reply appropriately. */ struct mbuf * ipfw_send_pkt(struct mbuf *replyto, struct ipfw_flow_id *id, u_int32_t seq, u_int32_t ack, int flags) { struct mbuf *m = NULL; /* stupid compiler */ int len, dir; struct ip *h = NULL; /* stupid compiler */ #ifdef INET6 struct ip6_hdr *h6 = NULL; #endif struct tcphdr *th = NULL; MGETHDR(m, M_DONTWAIT, MT_DATA); if (m == NULL) return (NULL); M_SETFIB(m, id->fib); #ifdef MAC if (replyto != NULL) mac_netinet_firewall_reply(replyto, m); else mac_netinet_firewall_send(m); #else (void)replyto; /* don't warn about unused arg */ #endif switch (id->addr_type) { case 4: len = sizeof(struct ip) + sizeof(struct tcphdr); break; #ifdef INET6 case 6: len = sizeof(struct ip6_hdr) + sizeof(struct tcphdr); break; #endif default: /* XXX: log me?!? */ FREE_PKT(m); return (NULL); } dir = ((flags & (TH_SYN | TH_RST)) == TH_SYN); m->m_data += max_linkhdr; m->m_flags |= M_SKIP_FIREWALL; m->m_pkthdr.len = m->m_len = len; m->m_pkthdr.rcvif = NULL; bzero(m->m_data, len); switch (id->addr_type) { case 4: h = mtod(m, struct ip *); /* prepare for checksum */ h->ip_p = IPPROTO_TCP; h->ip_len = htons(sizeof(struct tcphdr)); if (dir) { h->ip_src.s_addr = htonl(id->src_ip); h->ip_dst.s_addr = htonl(id->dst_ip); } else { h->ip_src.s_addr = htonl(id->dst_ip); h->ip_dst.s_addr = htonl(id->src_ip); } th = (struct tcphdr *)(h + 1); break; #ifdef INET6 case 6: h6 = mtod(m, struct ip6_hdr *); /* prepare for checksum */ h6->ip6_nxt = IPPROTO_TCP; h6->ip6_plen = htons(sizeof(struct tcphdr)); if (dir) { h6->ip6_src = id->src_ip6; h6->ip6_dst = id->dst_ip6; } else { h6->ip6_src = id->dst_ip6; h6->ip6_dst = id->src_ip6; } th = (struct tcphdr *)(h6 + 1); break; #endif } if (dir) { th->th_sport = htons(id->src_port); th->th_dport = htons(id->dst_port); } else { th->th_sport = htons(id->dst_port); th->th_dport = htons(id->src_port); } th->th_off = sizeof(struct tcphdr) >> 2; if (flags & TH_RST) { if (flags & TH_ACK) { th->th_seq = htonl(ack); th->th_flags = TH_RST; } else { if (flags & TH_SYN) seq++; th->th_ack = htonl(seq); th->th_flags = TH_RST | TH_ACK; } } else { /* * Keepalive - use caller provided sequence numbers */ th->th_seq = htonl(seq); th->th_ack = htonl(ack); th->th_flags = TH_ACK; } switch (id->addr_type) { case 4: th->th_sum = in_cksum(m, len); /* finish the ip header */ h->ip_v = 4; h->ip_hl = sizeof(*h) >> 2; h->ip_tos = IPTOS_LOWDELAY; h->ip_off = 0; /* ip_len must be in host format for ip_output */ h->ip_len = len; h->ip_ttl = V_ip_defttl; h->ip_sum = 0; break; #ifdef INET6 case 6: th->th_sum = in6_cksum(m, IPPROTO_TCP, sizeof(*h6), sizeof(struct tcphdr)); /* finish the ip6 header */ h6->ip6_vfc |= IPV6_VERSION; h6->ip6_hlim = IPV6_DEFHLIM; break; #endif } return (m); } /* * This procedure is only used to handle keepalives. It is invoked * every dyn_keepalive_period */ /* dummynet() and ipfw_tick() can't be static in windows */ void ipfw_tick(void * vnetx) { struct mbuf *m0, *m, *mnext, **mtailp; #ifdef INET6 struct mbuf *m6, **m6_tailp; #endif int i; ipfw_dyn_rule *q; #ifdef VIMAGE struct vnet *vp = vnetx; #endif CURVNET_SET(vp); if (V_dyn_keepalive == 0 || V_ipfw_dyn_v == NULL || V_dyn_count == 0) goto done; /* * We make a chain of packets to go out here -- not deferring * until after we drop the IPFW dynamic rule lock would result * in a lock order reversal with the normal packet input -> ipfw * call stack. */ m0 = NULL; mtailp = &m0; #ifdef INET6 m6 = NULL; m6_tailp = &m6; #endif IPFW_DYN_LOCK(); for (i = 0 ; i < V_curr_dyn_buckets ; i++) { for (q = V_ipfw_dyn_v[i] ; q ; q = q->next ) { if (q->dyn_type == O_LIMIT_PARENT) continue; if (q->id.proto != IPPROTO_TCP) continue; if ( (q->state & BOTH_SYN) != BOTH_SYN) continue; if (TIME_LEQ(time_uptime + V_dyn_keepalive_interval, q->expire)) continue; /* too early */ if (TIME_LEQ(q->expire, time_uptime)) continue; /* too late, rule expired */ m = ipfw_send_pkt(NULL, &(q->id), q->ack_rev - 1, q->ack_fwd, TH_SYN); mnext = ipfw_send_pkt(NULL, &(q->id), q->ack_fwd - 1, q->ack_rev, 0); switch (q->id.addr_type) { case 4: if (m != NULL) { *mtailp = m; mtailp = &(*mtailp)->m_nextpkt; } if (mnext != NULL) { *mtailp = mnext; mtailp = &(*mtailp)->m_nextpkt; } break; #ifdef INET6 case 6: if (m != NULL) { *m6_tailp = m; m6_tailp = &(*m6_tailp)->m_nextpkt; } if (mnext != NULL) { *m6_tailp = mnext; m6_tailp = &(*m6_tailp)->m_nextpkt; } break; #endif } m = mnext = NULL; } } IPFW_DYN_UNLOCK(); for (m = mnext = m0; m != NULL; m = mnext) { mnext = m->m_nextpkt; m->m_nextpkt = NULL; ip_output(m, NULL, NULL, 0, NULL, NULL); } #ifdef INET6 for (m = mnext = m6; m != NULL; m = mnext) { mnext = m->m_nextpkt; m->m_nextpkt = NULL; ip6_output(m, NULL, NULL, 0, NULL, NULL, NULL); } #endif done: callout_reset_on(&V_ipfw_timeout, V_dyn_keepalive_period * hz, ipfw_tick, vnetx, 0); CURVNET_RESTORE(); } void ipfw_dyn_attach(void) { ipfw_dyn_rule_zone = uma_zcreate("IPFW dynamic rule", sizeof(ipfw_dyn_rule), NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0); IPFW_DYN_LOCK_INIT(); } void ipfw_dyn_detach(void) { uma_zdestroy(ipfw_dyn_rule_zone); IPFW_DYN_LOCK_DESTROY(); } void ipfw_dyn_init(void) { V_ipfw_dyn_v = NULL; V_dyn_buckets = 256; /* must be power of 2 */ V_curr_dyn_buckets = 256; /* must be power of 2 */ V_dyn_ack_lifetime = 300; V_dyn_syn_lifetime = 20; V_dyn_fin_lifetime = 1; V_dyn_rst_lifetime = 1; V_dyn_udp_lifetime = 10; V_dyn_short_lifetime = 5; V_dyn_keepalive_interval = 20; V_dyn_keepalive_period = 5; V_dyn_keepalive = 1; /* do send keepalives */ V_dyn_max = 4096; /* max # of dynamic rules */ callout_init(&V_ipfw_timeout, CALLOUT_MPSAFE); callout_reset_on(&V_ipfw_timeout, hz, ipfw_tick, curvnet, 0); } void ipfw_dyn_uninit(int pass) { if (pass == 0) callout_drain(&V_ipfw_timeout); else { if (V_ipfw_dyn_v != NULL) free(V_ipfw_dyn_v, M_IPFW); } } int ipfw_dyn_len(void) { return (V_ipfw_dyn_v == NULL) ? 0 : (V_dyn_count * sizeof(ipfw_dyn_rule)); } void ipfw_get_dynamic(char **pbp, const char *ep) { ipfw_dyn_rule *p, *last = NULL; char *bp; int i; if (V_ipfw_dyn_v == NULL) return; bp = *pbp; IPFW_DYN_LOCK(); for (i = 0 ; i < V_curr_dyn_buckets; i++) for (p = V_ipfw_dyn_v[i] ; p != NULL; p = p->next) { if (bp + sizeof *p <= ep) { ipfw_dyn_rule *dst = (ipfw_dyn_rule *)bp; bcopy(p, dst, sizeof *p); bcopy(&(p->rule->rulenum), &(dst->rule), sizeof(p->rule->rulenum)); /* * store set number into high word of * dst->rule pointer. */ bcopy(&(p->rule->set), (char *)&dst->rule + sizeof(p->rule->rulenum), sizeof(p->rule->set)); /* * store a non-null value in "next". * The userland code will interpret a * NULL here as a marker * for the last dynamic rule. */ bcopy(&dst, &dst->next, sizeof(dst)); last = dst; dst->expire = TIME_LEQ(dst->expire, time_uptime) ? 0 : dst->expire - time_uptime ; bp += sizeof(ipfw_dyn_rule); } } IPFW_DYN_UNLOCK(); if (last != NULL) /* mark last dynamic rule */ bzero(&last->next, sizeof(last)); *pbp = bp; } /* end of file */ ipfw3-2012/sys/netinet/ipfw/dn_sched_fifo.c000644 000423 000000 00000007232 12006744011 021074 0ustar00luigiwheel000000 000000 /* * Copyright (c) 2010 Riccardo Panicucci, Universita` di Pisa * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: dn_sched_fifo.c 11480 2012-07-31 08:02:00Z luigi $ */ #ifdef _KERNEL #include #include #include #include #include #include #include /* IFNAMSIZ */ #include #include /* ipfw_rule_ref */ #include /* flow_id */ #include #include #include #include #else #include #endif /* * This file implements a FIFO scheduler for a single queue. * The queue is allocated as part of the scheduler instance, * and there is a single flowset is in the template which stores * queue size and policy. * Enqueue and dequeue use the default library functions. */ static int fifo_enqueue(struct dn_sch_inst *si, struct dn_queue *q, struct mbuf *m) { /* XXX if called with q != NULL and m=NULL, this is a * re-enqueue from an existing scheduler, which we should * handle. */ return dn_enqueue((struct dn_queue *)(si+1), m, 0); } static struct mbuf * fifo_dequeue(struct dn_sch_inst *si) { return dn_dequeue((struct dn_queue *)(si + 1)); } static int fifo_new_sched(struct dn_sch_inst *si) { /* This scheduler instance contains the queue */ struct dn_queue *q = (struct dn_queue *)(si + 1); set_oid(&q->ni.oid, DN_QUEUE, sizeof(*q)); q->_si = si; q->fs = si->sched->fs; return 0; } static int fifo_free_sched(struct dn_sch_inst *si) { struct dn_queue *q = (struct dn_queue *)(si + 1); dn_free_pkts(q->mq.head); bzero(q, sizeof(*q)); return 0; } /* * FIFO scheduler descriptor * contains the type of the scheduler, the name, the size of extra * data structures, and function pointers. */ static struct dn_alg fifo_desc = { _SI( .type = ) DN_SCHED_FIFO, _SI( .name = ) "FIFO", _SI( .flags = ) 0, _SI( .schk_datalen = ) 0, _SI( .si_datalen = ) sizeof(struct dn_queue), _SI( .q_datalen = ) 0, _SI( .enqueue = ) fifo_enqueue, _SI( .dequeue = ) fifo_dequeue, _SI( .config = ) NULL, _SI( .destroy = ) NULL, _SI( .new_sched = ) fifo_new_sched, _SI( .free_sched = ) fifo_free_sched, _SI( .new_fsk = ) NULL, _SI( .free_fsk = ) NULL, _SI( .new_queue = ) NULL, _SI( .free_queue = ) NULL, }; DECLARE_DNSCHED_MODULE(dn_fifo, &fifo_desc); ipfw3-2012/sys/netinet/ipfw/dn_sched_rr.c000644 000423 000000 00000016256 12006744011 020602 0ustar00luigiwheel000000 000000 /* * Copyright (c) 2010 Riccardo Panicucci, Universita` di Pisa * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: dn_sched_rr.c 11480 2012-07-31 08:02:00Z luigi $ */ #ifdef _KERNEL #include #include #include #include #include #include #include /* IFNAMSIZ */ #include #include /* ipfw_rule_ref */ #include /* flow_id */ #include #include #include #include #else #include #endif #define DN_SCHED_RR 3 // XXX Where? struct rr_queue { struct dn_queue q; /* Standard queue */ int status; /* 1: queue is in the list */ int credit; /* Number of bytes to transmit */ int quantum; /* quantum * C */ struct rr_queue *qnext; /* */ }; /* struct rr_schk contains global config parameters * and is right after dn_schk */ struct rr_schk { int min_q; /* Min quantum */ int max_q; /* Max quantum */ int q_bytes; /* Bytes per quantum */ }; /* per-instance round robin list, right after dn_sch_inst */ struct rr_si { struct rr_queue *head, *tail; /* Pointer to current queue */ }; /* Append a queue to the rr list */ static inline void rr_append(struct rr_queue *q, struct rr_si *si) { q->status = 1; /* mark as in-rr_list */ q->credit = q->quantum; /* initialize credit */ /* append to the tail */ if (si->head == NULL) si->head = q; else si->tail->qnext = q; si->tail = q; /* advance the tail pointer */ q->qnext = si->head; /* make it circular */ } /* Remove the head queue from circular list. */ static inline void rr_remove_head(struct rr_si *si) { if (si->head == NULL) return; /* empty queue */ si->head->status = 0; if (si->head == si->tail) { si->head = si->tail = NULL; return; } si->head = si->head->qnext; si->tail->qnext = si->head; } /* Remove a queue from circular list. * XXX see if ti can be merge with remove_queue() */ static inline void remove_queue_q(struct rr_queue *q, struct rr_si *si) { struct rr_queue *prev; if (q->status != 1) return; if (q == si->head) { rr_remove_head(si); return; } for (prev = si->head; prev; prev = prev->qnext) { if (prev->qnext != q) continue; prev->qnext = q->qnext; if (q == si->tail) si->tail = prev; q->status = 0; break; } } static inline void next_pointer(struct rr_si *si) { if (si->head == NULL) return; /* empty queue */ si->head = si->head->qnext; si->tail = si->tail->qnext; } static int rr_enqueue(struct dn_sch_inst *_si, struct dn_queue *q, struct mbuf *m) { struct rr_si *si; struct rr_queue *rrq; if (m != q->mq.head) { if (dn_enqueue(q, m, 0)) /* packet was dropped */ return 1; if (m != q->mq.head) return 0; } /* If reach this point, queue q was idle */ si = (struct rr_si *)(_si + 1); rrq = (struct rr_queue *)q; if (rrq->status == 1) /* Queue is already in the queue list */ return 0; /* Insert the queue in the queue list */ rr_append(rrq, si); return 0; } static struct mbuf * rr_dequeue(struct dn_sch_inst *_si) { /* Access scheduler instance private data */ struct rr_si *si = (struct rr_si *)(_si + 1); struct rr_queue *rrq; uint64_t len; while ( (rrq = si->head) ) { struct mbuf *m = rrq->q.mq.head; if ( m == NULL) { /* empty queue, remove from list */ rr_remove_head(si); continue; } len = m->m_pkthdr.len; if (len > rrq->credit) { /* Packet too big */ rrq->credit += rrq->quantum; /* Try next queue */ next_pointer(si); } else { rrq->credit -= len; return dn_dequeue(&rrq->q); } } /* no packet to dequeue*/ return NULL; } static int rr_config(struct dn_schk *_schk) { struct rr_schk *schk = (struct rr_schk *)(_schk + 1); ND("called"); /* use reasonable quantums (64..2k bytes, default 1500) */ schk->min_q = 64; schk->max_q = 2048; schk->q_bytes = 1500; /* quantum */ return 0; } static int rr_new_sched(struct dn_sch_inst *_si) { struct rr_si *si = (struct rr_si *)(_si + 1); ND("called"); si->head = si->tail = NULL; return 0; } static int rr_free_sched(struct dn_sch_inst *_si) { ND("called"); /* Nothing to do? */ return 0; } static int rr_new_fsk(struct dn_fsk *fs) { struct rr_schk *schk = (struct rr_schk *)(fs->sched + 1); /* par[0] is the weight, par[1] is the quantum step */ ipdn_bound_var(&fs->fs.par[0], 1, 1, 65536, "RR weight"); ipdn_bound_var(&fs->fs.par[1], schk->q_bytes, schk->min_q, schk->max_q, "RR quantum"); return 0; } static int rr_new_queue(struct dn_queue *_q) { struct rr_queue *q = (struct rr_queue *)_q; _q->ni.oid.subtype = DN_SCHED_RR; q->quantum = _q->fs->fs.par[0] * _q->fs->fs.par[1]; ND("called, q->quantum %d", q->quantum); q->credit = q->quantum; q->status = 0; if (_q->mq.head != NULL) { /* Queue NOT empty, insert in the queue list */ rr_append(q, (struct rr_si *)(_q->_si + 1)); } return 0; } static int rr_free_queue(struct dn_queue *_q, int safe) { struct rr_queue *q = (struct rr_queue *)_q; ND("called"); if (safe) /* Delete only if status == 0 */ return q->status; if (q->status == 1) { struct rr_si *si = (struct rr_si *)(_q->_si + 1); remove_queue_q(q, si); } return 0; } /* * RR scheduler descriptor * contains the type of the scheduler, the name, the size of the * structures and function pointers. */ static struct dn_alg rr_desc = { _SI( .type = ) DN_SCHED_RR, _SI( .name = ) "RR", _SI( .flags = ) DN_MULTIQUEUE, _SI( .schk_datalen = ) 0, _SI( .si_datalen = ) sizeof(struct rr_si), _SI( .q_datalen = ) sizeof(struct rr_queue) - sizeof(struct dn_queue), _SI( .enqueue = ) rr_enqueue, _SI( .dequeue = ) rr_dequeue, _SI( .config = ) rr_config, _SI( .destroy = ) NULL, _SI( .new_sched = ) rr_new_sched, _SI( .free_sched = ) rr_free_sched, _SI( .new_fsk = ) rr_new_fsk, _SI( .free_fsk = ) NULL, _SI( .new_queue = ) rr_new_queue, _SI( .free_queue = ) rr_free_queue, }; DECLARE_DNSCHED_MODULE(dn_rr, &rr_desc); ipfw3-2012/sys/netinet/ipfw/ip_fw_table.c000644 000423 000000 00000016437 12006744011 020604 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 2004 Ruslan Ermilov and Vsevolod Lobko. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include __FBSDID("$FreeBSD: head/sys/netinet/ipfw/ip_fw_table.c 200601 2009-12-16 10:48:40Z luigi $"); /* * Lookup table support for ipfw * * Lookup tables are implemented (at the moment) using the radix * tree used for routing tables. Tables store key-value entries, where * keys are network prefixes (addr/masklen), and values are integers. * As a degenerate case we can interpret keys as 32-bit integers * (with a /32 mask). * * The table is protected by the IPFW lock even for manipulation coming * from userland, because operations are typically fast. */ #if !defined(KLD_MODULE) #include "opt_ipfw.h" #include "opt_ipdivert.h" #include "opt_ipdn.h" #include "opt_inet.h" #ifndef INET #error IPFIREWALL requires INET. #endif /* INET */ #endif #include "opt_inet6.h" #include "opt_ipsec.h" #include #include #include #include #include #include #include #include /* ip_fw.h requires IFNAMSIZ */ #include #include #include #include #include /* struct ipfw_rule_ref */ #include #include /* LIST_HEAD */ #include #ifdef MAC #include #endif MALLOC_DEFINE(M_IPFW_TBL, "ipfw_tbl", "IpFw tables"); struct table_entry { struct radix_node rn[2]; struct sockaddr_in addr, mask; u_int32_t value; }; /* * The radix code expects addr and mask to be array of bytes, * with the first byte being the length of the array. rn_inithead * is called with the offset in bits of the lookup key within the * array. If we use a sockaddr_in as the underlying type, * sin_len is conveniently located at offset 0, sin_addr is at * offset 4 and normally aligned. * But for portability, let's avoid assumption and make the code explicit */ #define KEY_LEN(v) *((uint8_t *)&(v)) #define KEY_OFS (8*offsetof(struct sockaddr_in, sin_addr)) int ipfw_add_table_entry(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, uint8_t mlen, uint32_t value) { struct radix_node_head *rnh; struct table_entry *ent; struct radix_node *rn; if (tbl >= IPFW_TABLES_MAX) return (EINVAL); rnh = ch->tables[tbl]; ent = malloc(sizeof(*ent), M_IPFW_TBL, M_NOWAIT | M_ZERO); if (ent == NULL) return (ENOMEM); ent->value = value; KEY_LEN(ent->addr) = KEY_LEN(ent->mask) = 8; ent->mask.sin_addr.s_addr = htonl(mlen ? ~((1 << (32 - mlen)) - 1) : 0); ent->addr.sin_addr.s_addr = addr & ent->mask.sin_addr.s_addr; IPFW_WLOCK(ch); rn = rnh->rnh_addaddr(&ent->addr, &ent->mask, rnh, (void *)ent); if (rn == NULL) { IPFW_WUNLOCK(ch); free(ent, M_IPFW_TBL); return (EEXIST); } IPFW_WUNLOCK(ch); return (0); } int ipfw_del_table_entry(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, uint8_t mlen) { struct radix_node_head *rnh; struct table_entry *ent; struct sockaddr_in sa, mask; if (tbl >= IPFW_TABLES_MAX) return (EINVAL); rnh = ch->tables[tbl]; KEY_LEN(sa) = KEY_LEN(mask) = 8; mask.sin_addr.s_addr = htonl(mlen ? ~((1 << (32 - mlen)) - 1) : 0); sa.sin_addr.s_addr = addr & mask.sin_addr.s_addr; IPFW_WLOCK(ch); ent = (struct table_entry *)rnh->rnh_deladdr(&sa, &mask, rnh); if (ent == NULL) { IPFW_WUNLOCK(ch); return (ESRCH); } IPFW_WUNLOCK(ch); free(ent, M_IPFW_TBL); return (0); } static int flush_table_entry(struct radix_node *rn, void *arg) { struct radix_node_head * const rnh = arg; struct table_entry *ent; ent = (struct table_entry *) rnh->rnh_deladdr(rn->rn_key, rn->rn_mask, rnh); if (ent != NULL) free(ent, M_IPFW_TBL); return (0); } int ipfw_flush_table(struct ip_fw_chain *ch, uint16_t tbl) { struct radix_node_head *rnh; IPFW_WLOCK_ASSERT(ch); if (tbl >= IPFW_TABLES_MAX) return (EINVAL); rnh = ch->tables[tbl]; KASSERT(rnh != NULL, ("NULL IPFW table")); rnh->rnh_walktree(rnh, flush_table_entry, rnh); return (0); } void ipfw_destroy_tables(struct ip_fw_chain *ch) { uint16_t tbl; struct radix_node_head *rnh; IPFW_WLOCK_ASSERT(ch); for (tbl = 0; tbl < IPFW_TABLES_MAX; tbl++) { ipfw_flush_table(ch, tbl); rnh = ch->tables[tbl]; rn_detachhead((void **)&rnh); } } int ipfw_init_tables(struct ip_fw_chain *ch) { int i; uint16_t j; for (i = 0; i < IPFW_TABLES_MAX; i++) { if (!rn_inithead((void **)&ch->tables[i], KEY_OFS)) { for (j = 0; j < i; j++) { (void) ipfw_flush_table(ch, j); } return (ENOMEM); } } return (0); } int ipfw_lookup_table(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, uint32_t *val) { struct radix_node_head *rnh; struct table_entry *ent; struct sockaddr_in sa; if (tbl >= IPFW_TABLES_MAX) return (0); rnh = ch->tables[tbl]; KEY_LEN(sa) = 8; sa.sin_addr.s_addr = addr; ent = (struct table_entry *)(rnh->rnh_lookup(&sa, NULL, rnh)); if (ent != NULL) { *val = ent->value; return (1); } return (0); } static int count_table_entry(struct radix_node *rn, void *arg) { u_int32_t * const cnt = arg; (*cnt)++; return (0); } int ipfw_count_table(struct ip_fw_chain *ch, uint32_t tbl, uint32_t *cnt) { struct radix_node_head *rnh; if (tbl >= IPFW_TABLES_MAX) return (EINVAL); rnh = ch->tables[tbl]; *cnt = 0; rnh->rnh_walktree(rnh, count_table_entry, cnt); return (0); } static int dump_table_entry(struct radix_node *rn, void *arg) { struct table_entry * const n = (struct table_entry *)rn; ipfw_table * const tbl = arg; ipfw_table_entry *ent; if (tbl->cnt == tbl->size) return (1); ent = &tbl->ent[tbl->cnt]; ent->tbl = tbl->tbl; if (in_nullhost(n->mask.sin_addr)) ent->masklen = 0; else ent->masklen = 33 - ffs(ntohl(n->mask.sin_addr.s_addr)); ent->addr = n->addr.sin_addr.s_addr; ent->value = n->value; tbl->cnt++; return (0); } int ipfw_dump_table(struct ip_fw_chain *ch, ipfw_table *tbl) { struct radix_node_head *rnh; if (tbl->tbl >= IPFW_TABLES_MAX) return (EINVAL); rnh = ch->tables[tbl->tbl]; tbl->cnt = 0; rnh->rnh_walktree(rnh, dump_table_entry, tbl); return (0); } /* end of file */ ipfw3-2012/sys/netinet/ipfw/dn_sched.h000644 000423 000000 00000016452 12006744011 020102 0ustar00luigiwheel000000 000000 /* * Copyright (c) 2010 Riccardo Panicucci, Luigi Rizzo, Universita` di Pisa * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * The API to write a packet scheduling algorithm for dummynet. * * $FreeBSD: head/sys/netinet/ipfw/dn_sched.h 204591 2010-03-02 17:40:48Z luigi $ */ #ifndef _DN_SCHED_H #define _DN_SCHED_H #define DN_MULTIQUEUE 0x01 /* * Descriptor for a scheduling algorithm. * Contains all function pointers for a given scheduler * This is typically created when a module is loaded, and stored * in a global list of schedulers. */ struct dn_alg { uint32_t type; /* the scheduler type */ const char *name; /* scheduler name */ uint32_t flags; /* DN_MULTIQUEUE if supports multiple queues */ /* * The following define the size of 3 optional data structures * that may need to be allocated at runtime, and are appended * to each of the base data structures: scheduler, sched.inst, * and queue. We don't have a per-flowset structure. */ /* + parameters attached to the template, e.g. * default queue sizes, weights, quantum size, and so on; */ size_t schk_datalen; /* + per-instance parameters, such as timestamps, * containers for queues, etc; */ size_t si_datalen; size_t q_datalen; /* per-queue parameters (e.g. S,F) */ /* * Methods implemented by the scheduler: * enqueue enqueue packet 'm' on scheduler 's', queue 'q'. * q is NULL for !MULTIQUEUE. * Return 0 on success, 1 on drop (packet consumed anyways). * Note that q should be interpreted only as a hint * on the flow that the mbuf belongs to: while a * scheduler will normally enqueue m into q, it is ok * to leave q alone and put the mbuf elsewhere. * This function is called in two cases: * - when a new packet arrives to the scheduler; * - when a scheduler is reconfigured. In this case the * call is issued by the new_queue callback, with a * non empty queue (q) and m pointing to the first * mbuf in the queue. For this reason, the function * should internally check for (m != q->mq.head) * before calling dn_enqueue(). * * dequeue Called when scheduler instance 's' can * dequeue a packet. Return NULL if none are available. * XXX what about non work-conserving ? * * config called on 'sched X config ...', normally writes * in the area of size sch_arg * * destroy called on 'sched delete', frees everything * in sch_arg (other parts are handled by more specific * functions) * * new_sched called when a new instance is created, e.g. * to create the local queue for !MULTIQUEUE, set V or * copy parameters for WFQ, and so on. * * free_sched called when deleting an instance, cleans * extra data in the per-instance area. * * new_fsk called when a flowset is linked to a scheduler, * e.g. to validate parameters such as weights etc. * free_fsk when a flowset is unlinked from a scheduler. * (probably unnecessary) * * new_queue called to set the per-queue parameters, * e.g. S and F, adjust sum of weights in the parent, etc. * * The new_queue callback is normally called from when * creating a new queue. In some cases (such as a * scheduler change or reconfiguration) it can be called * with a non empty queue. In this case, the queue * In case of non empty queue, the new_queue callback could * need to call the enqueue function. In this case, * the callback should eventually call enqueue() passing * as m the first element in the queue. * * free_queue actions related to a queue removal, e.g. undo * all the above. If the queue has data in it, also remove * from the scheduler. This can e.g. happen during a reconfigure. * If safe == 1 remove the queue only if the scheduler no longer * need it, otherwise delete it even if the scheduler is using * it. Usually, the flag safe is set when the drain routine is * running to delete idle queues. */ int (*enqueue)(struct dn_sch_inst *, struct dn_queue *, struct mbuf *); struct mbuf * (*dequeue)(struct dn_sch_inst *); int (*config)(struct dn_schk *); int (*destroy)(struct dn_schk*); int (*new_sched)(struct dn_sch_inst *); int (*free_sched)(struct dn_sch_inst *); int (*new_fsk)(struct dn_fsk *f); int (*free_fsk)(struct dn_fsk *f); int (*new_queue)(struct dn_queue *q); int (*free_queue)(struct dn_queue *q, int safe); /* run-time fields */ int ref_count; /* XXX number of instances in the system */ SLIST_ENTRY(dn_alg) next; /* Next scheduler in the list */ }; /* MSVC does not support initializers so we need this ugly macro */ #ifdef _WIN32 #define _SI(fld) #else #define _SI(fld) fld #endif /* * Additionally, dummynet exports some functions and macros * to be used by schedulers: */ void dn_free_pkts(struct mbuf *mnext); int dn_enqueue(struct dn_queue *q, struct mbuf* m, int drop); /* bound a variable between min and max */ int ipdn_bound_var(int *v, int dflt, int lo, int hi, const char *msg); /* * Extract the head of a queue, update stats. Must be the very last * thing done on a dequeue as the queue itself may go away. */ static __inline struct mbuf* dn_dequeue(struct dn_queue *q) { struct mbuf *m = q->mq.head; if (m == NULL) return NULL; q->mq.head = m->m_nextpkt; /* Update stats for the queue */ q->ni.length--; q->ni.len_bytes -= m->m_pkthdr.len; /* When the queue becomes idle, update idle_time (used by RED) * and also update the count of idle queues (for garbage collection). */ if (q->ni.length == 0) { dn_cfg.idle_queue++; q->q_time = dn_cfg.curr_time; } if (q->_si) { struct dn_flow *ni = &(q->_si->ni); /* update stats for the scheduler instance, and keep track * of idle scheduler instances if needed */ ni->length--; ni->len_bytes -= m->m_pkthdr.len; if (ni->length == 0) dn_cfg.idle_si++; } return m; } int dn_sched_modevent(module_t mod, int cmd, void *arg); #define DECLARE_DNSCHED_MODULE(name, dnsched) \ static moduledata_t name##_mod = { \ #name, dn_sched_modevent, dnsched \ }; \ DECLARE_MODULE(name, name##_mod, \ SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY); \ MODULE_DEPEND(name, dummynet, 3, 3, 3); #endif /* _DN_SCHED_H */ ipfw3-2012/sys/netinet/ipfw/ip_fw_pfil.c000644 000423 000000 00000024304 12006744011 020437 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 2004 Andre Oppermann, Internet Business Solutions AG * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include __FBSDID("$FreeBSD: head/sys/netinet/ipfw/ip_fw_pfil.c 200601 2009-12-16 10:48:40Z luigi $"); #if !defined(KLD_MODULE) #include "opt_ipfw.h" #include "opt_ipdn.h" #include "opt_inet.h" #ifndef INET #error IPFIREWALL requires INET. #endif /* INET */ #endif /* KLD_MODULE */ #include "opt_inet6.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static VNET_DEFINE(int, fw_enable) = 1; #define V_fw_enable VNET(fw_enable) #ifdef INET6 static VNET_DEFINE(int, fw6_enable) = 1; #define V_fw6_enable VNET(fw6_enable) #endif int ipfw_chg_hook(SYSCTL_HANDLER_ARGS); /* Forward declarations. */ static int ipfw_divert(struct mbuf **, int, struct ipfw_rule_ref *, int); #ifdef SYSCTL_NODE SYSBEGIN(f1) SYSCTL_DECL(_net_inet_ip_fw); SYSCTL_VNET_PROC(_net_inet_ip_fw, OID_AUTO, enable, CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE3, &VNET_NAME(fw_enable), 0, ipfw_chg_hook, "I", "Enable ipfw"); #ifdef INET6 SYSCTL_DECL(_net_inet6_ip6_fw); SYSCTL_VNET_PROC(_net_inet6_ip6_fw, OID_AUTO, enable, CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE3, &VNET_NAME(fw6_enable), 0, ipfw_chg_hook, "I", "Enable ipfw+6"); #endif /* INET6 */ SYSEND #endif /* SYSCTL_NODE */ /* * The pfilter hook to pass packets to ipfw_chk and then to * dummynet, divert, netgraph or other modules. * The packet may be consumed. */ int ipfw_check_hook(void *arg, struct mbuf **m0, struct ifnet *ifp, int dir, struct inpcb *inp) { struct ip_fw_args args; struct m_tag *tag; int ipfw; int ret; /* all the processing now uses ip_len in net format */ if (mtod(*m0, struct ip *)->ip_v == 4) SET_NET_IPLEN(mtod(*m0, struct ip *)); /* convert dir to IPFW values */ dir = (dir == PFIL_IN) ? DIR_IN : DIR_OUT; bzero(&args, sizeof(args)); again: /* * extract and remove the tag if present. If we are left * with onepass, optimize the outgoing path. */ tag = m_tag_locate(*m0, MTAG_IPFW_RULE, 0, NULL); if (tag != NULL) { args.rule = *((struct ipfw_rule_ref *)(tag+1)); m_tag_delete(*m0, tag); if (args.rule.info & IPFW_ONEPASS) { SET_HOST_IPLEN(mtod(*m0, struct ip *)); return 0; } } args.m = *m0; args.oif = dir == DIR_OUT ? ifp : NULL; args.inp = inp; ipfw = ipfw_chk(&args); *m0 = args.m; KASSERT(*m0 != NULL || ipfw == IP_FW_DENY, ("%s: m0 is NULL", __func__)); /* breaking out of the switch means drop */ ret = 0; /* default return value for pass */ switch (ipfw) { case IP_FW_PASS: /* next_hop may be set by ipfw_chk */ if (args.next_hop == NULL) break; /* pass */ #ifndef IPFIREWALL_FORWARD ret = EACCES; #else { struct m_tag *fwd_tag; /* Incoming packets should not be tagged so we do not * m_tag_find. Outgoing packets may be tagged, so we * reuse the tag if present. */ fwd_tag = (dir == DIR_IN) ? NULL : m_tag_find(*m0, PACKET_TAG_IPFORWARD, NULL); if (fwd_tag != NULL) { m_tag_unlink(*m0, fwd_tag); } else { fwd_tag = m_tag_get(PACKET_TAG_IPFORWARD, sizeof(struct sockaddr_in), M_NOWAIT); if (fwd_tag == NULL) { ret = EACCES; break; /* i.e. drop */ } } bcopy(args.next_hop, (fwd_tag+1), sizeof(struct sockaddr_in)); m_tag_prepend(*m0, fwd_tag); if (in_localip(args.next_hop->sin_addr)) (*m0)->m_flags |= M_FASTFWD_OURS; } #endif break; case IP_FW_DENY: ret = EACCES; break; /* i.e. drop */ case IP_FW_DUMMYNET: ret = EACCES; if (ip_dn_io_ptr == NULL) break; /* i.e. drop */ if (mtod(*m0, struct ip *)->ip_v == 4) ret = ip_dn_io_ptr(m0, dir, &args); else if (mtod(*m0, struct ip *)->ip_v == 6) ret = ip_dn_io_ptr(m0, dir | PROTO_IPV6, &args); else break; /* drop it */ /* * XXX should read the return value. * dummynet normally eats the packet and sets *m0=NULL * unless the packet can be sent immediately. In this * case args is updated and we should re-run the * check without clearing args. */ if (*m0 != NULL) goto again; break; case IP_FW_TEE: case IP_FW_DIVERT: if (ip_divert_ptr == NULL) { ret = EACCES; break; /* i.e. drop */ } ret = ipfw_divert(m0, dir, &args.rule, (ipfw == IP_FW_TEE) ? 1 : 0); /* continue processing for the original packet (tee). */ if (*m0) goto again; break; case IP_FW_NGTEE: case IP_FW_NETGRAPH: if (ng_ipfw_input_p == NULL) { ret = EACCES; break; /* i.e. drop */ } ret = ng_ipfw_input_p(m0, dir, &args, (ipfw == IP_FW_NGTEE) ? 1 : 0); if (ipfw == IP_FW_NGTEE) /* ignore errors for NGTEE */ goto again; /* continue with packet */ break; case IP_FW_NAT: /* honor one-pass in case of successful nat */ if (V_fw_one_pass) break; /* ret is already 0 */ goto again; case IP_FW_REASS: goto again; /* continue with packet */ default: KASSERT(0, ("%s: unknown retval", __func__)); } if (ret != 0) { if (*m0) FREE_PKT(*m0); *m0 = NULL; } if (*m0 && mtod(*m0, struct ip *)->ip_v == 4) SET_HOST_IPLEN(mtod(*m0, struct ip *)); return ret; } /* do the divert, return 1 on error 0 on success */ static int ipfw_divert(struct mbuf **m0, int incoming, struct ipfw_rule_ref *rule, int tee) { /* * ipfw_chk() has already tagged the packet with the divert tag. * If tee is set, copy packet and return original. * If not tee, consume packet and send it to divert socket. */ struct mbuf *clone; struct ip *ip; struct m_tag *tag; /* Cloning needed for tee? */ if (tee == 0) { clone = *m0; /* use the original mbuf */ *m0 = NULL; } else { clone = m_dup(*m0, M_DONTWAIT); /* If we cannot duplicate the mbuf, we sacrifice the divert * chain and continue with the tee-ed packet. */ if (clone == NULL) return 1; } /* * Divert listeners can normally handle non-fragmented packets, * but we can only reass in the non-tee case. * This means that listeners on a tee rule may get fragments, * and have to live with that. * Note that we now have the 'reass' ipfw option so if we care * we can do it before a 'tee'. */ ip = mtod(clone, struct ip *); if (!tee && ntohs(ip->ip_off) & (IP_MF | IP_OFFMASK)) { int hlen; struct mbuf *reass; SET_HOST_IPLEN(ip); /* ip_reass wants host order */ reass = ip_reass(clone); /* Reassemble packet. */ if (reass == NULL) return 0; /* not an error */ /* if reass = NULL then it was consumed by ip_reass */ /* * IP header checksum fixup after reassembly and leave header * in network byte order. */ ip = mtod(reass, struct ip *); hlen = ip->ip_hl << 2; SET_NET_IPLEN(ip); ip->ip_sum = 0; if (hlen == sizeof(struct ip)) ip->ip_sum = in_cksum_hdr(ip); else ip->ip_sum = in_cksum(reass, hlen); clone = reass; } /* attach a tag to the packet with the reinject info */ tag = m_tag_alloc(MTAG_IPFW_RULE, 0, sizeof(struct ipfw_rule_ref), M_NOWAIT); if (tag == NULL) { FREE_PKT(clone); return 1; } *((struct ipfw_rule_ref *)(tag+1)) = *rule; m_tag_prepend(clone, tag); /* Do the dirty job... */ ip_divert_ptr(clone, incoming); return 0; } /* * attach or detach hooks for a given protocol family */ static int ipfw_hook(int onoff, int pf) { struct pfil_head *pfh; pfh = pfil_head_get(PFIL_TYPE_AF, pf); if (pfh == NULL) return ENOENT; (void) (onoff ? pfil_add_hook : pfil_remove_hook) (ipfw_check_hook, NULL, PFIL_IN | PFIL_OUT | PFIL_WAITOK, pfh); return 0; } int ipfw_attach_hooks(int arg) { int error = 0; if (arg == 0) /* detach */ ipfw_hook(0, AF_INET); else if (V_fw_enable && ipfw_hook(1, AF_INET) != 0) { error = ENOENT; /* see ip_fw_pfil.c::ipfw_hook() */ printf("ipfw_hook() error\n"); } #ifdef INET6 if (arg == 0) /* detach */ ipfw_hook(0, AF_INET6); else if (V_fw6_enable && ipfw_hook(1, AF_INET6) != 0) { error = ENOENT; printf("ipfw6_hook() error\n"); } #endif return error; } int ipfw_chg_hook(SYSCTL_HANDLER_ARGS) { int enable; int oldenable; int error; int af; if (arg1 == &VNET_NAME(fw_enable)) { enable = V_fw_enable; af = AF_INET; } #ifdef INET6 else if (arg1 == &VNET_NAME(fw6_enable)) { enable = V_fw6_enable; af = AF_INET6; } #endif else return (EINVAL); oldenable = enable; error = sysctl_handle_int(oidp, &enable, 0, req); if (error) return (error); enable = (enable) ? 1 : 0; if (enable == oldenable) return (0); error = ipfw_hook(enable, af); if (error) return (error); if (af == AF_INET) V_fw_enable = enable; #ifdef INET6 else if (af == AF_INET6) V_fw6_enable = enable; #endif return (0); } /* end of file */ ipfw3-2012/sys/netinet/ipfw/dn_sched_qfq.c000644 000423 000000 00000055520 12010150105 020731 0ustar00luigiwheel000000 000000 /* * Copyright (c) 2010 Fabio Checconi, Luigi Rizzo, Paolo Valente * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: dn_sched_qfq.c 11656 2012-08-07 08:39:06Z luigi $ */ #ifdef _KERNEL #include #include #include #include #include #include #include /* IFNAMSIZ */ #include #include /* ipfw_rule_ref */ #include /* flow_id */ #include #include #include #include #else #include #endif #ifdef QFQ_DEBUG struct qfq_sched; static void dump_sched(struct qfq_sched *q, const char *msg); #define NO(x) x #else #define NO(x) #endif #define DN_SCHED_QFQ 4 // XXX Where? typedef unsigned long bitmap; /* * bitmaps ops are critical. Some linux versions have __fls * and the bitmap ops. Some machines have ffs */ #if defined(_WIN32) || (defined(__MIPSEL__) && defined(LINUX_24)) int fls(unsigned int n) { int i = 0; for (i = 0; n > 0; n >>= 1, i++) ; return i; } #endif #if !defined(_KERNEL) || defined( __FreeBSD__ ) || defined(_WIN32) || (defined(__MIPSEL__) && defined(LINUX_24)) static inline unsigned long __fls(unsigned long word) { return fls(word) - 1; } #endif #if !defined(_KERNEL) || !defined(__linux__) #ifdef QFQ_DEBUG int test_bit(int ix, bitmap *p) { if (ix < 0 || ix > 31) D("bad index %d", ix); return *p & (1< 31) D("bad index %d", ix); *p |= (1< 31) D("bad index %d", ix); *p &= ~(1<index = 0 *.__grp->slot_shift where MIN_SLOT_SHIFT is derived by difference from the others. The max group index corresponds to Lmax/w_min, where Lmax=1<group mapping. Class weights are * in the range [1, QFQ_MAX_WEIGHT], we to map each class i to the * group with the smallest index that can support the L_i / r_i * configured for the class. * * grp->index is the index of the group; and grp->slot_shift * is the shift for the corresponding (scaled) sigma_i. * * When computing the group index, we do (len<i_wsum) #define IWSUM ((1< 0; } /* Round a precise timestamp to its slotted value. */ static inline uint64_t qfq_round_down(uint64_t ts, unsigned int shift) { return ts & ~((1ULL << shift) - 1); } /* return the pointer to the group with lowest index in the bitmap */ static inline struct qfq_group *qfq_ffs(struct qfq_sched *q, unsigned long bitmap) { int index = ffs(bitmap) - 1; // zero-based return &q->groups[index]; } /* * Calculate a flow index, given its weight and maximum packet length. * index = log_2(maxlen/weight) but we need to apply the scaling. * This is used only once at flow creation. */ static int qfq_calc_index(uint32_t inv_w, unsigned int maxlen) { uint64_t slot_size = (uint64_t)maxlen *inv_w; unsigned long size_map; int index = 0; size_map = (unsigned long)(slot_size >> QFQ_MIN_SLOT_SHIFT); if (!size_map) goto out; index = __fls(size_map) + 1; // basically a log_2() index -= !(slot_size - (1ULL << (index + QFQ_MIN_SLOT_SHIFT - 1))); if (index < 0) index = 0; out: ND("W = %d, L = %d, I = %d\n", ONE_FP/inv_w, maxlen, index); return index; } /*---- end support functions ----*/ /*-------- API calls --------------------------------*/ /* * Validate and copy parameters from flowset. */ static int qfq_new_queue(struct dn_queue *_q) { struct qfq_sched *q = (struct qfq_sched *)(_q->_si + 1); struct qfq_class *cl = (struct qfq_class *)_q; int i; uint32_t w; /* approximated weight */ /* import parameters from the flowset. They should be correct * already. */ w = _q->fs->fs.par[0]; cl->lmax = _q->fs->fs.par[1]; if (!w || w > QFQ_MAX_WEIGHT) { w = 1; D("rounding weight to 1"); } cl->inv_w = ONE_FP/w; w = ONE_FP/cl->inv_w; if (q->wsum + w > QFQ_MAX_WSUM) return EINVAL; i = qfq_calc_index(cl->inv_w, cl->lmax); cl->grp = &q->groups[i]; q->wsum += w; // XXX cl->S = q->V; ? // XXX compute q->i_wsum return 0; } /* remove an empty queue */ static int qfq_free_queue(struct dn_queue *_q, int safe) { struct qfq_sched *q = (struct qfq_sched *)(_q->_si + 1); struct qfq_class *cl = (struct qfq_class *)_q; if (cl->inv_w) { q->wsum -= ONE_FP/cl->inv_w; cl->inv_w = 0; /* reset weight to avoid run twice */ } return 0; } /* Calculate a mask to mimic what would be ffs_from(). */ static inline unsigned long mask_from(unsigned long bitmap, int from) { return bitmap & ~((1UL << from) - 1); } /* * The state computation relies on ER=0, IR=1, EB=2, IB=3 * First compute eligibility comparing grp->S, q->V, * then check if someone is blocking us and possibly add EB */ static inline unsigned int qfq_calc_state(struct qfq_sched *q, struct qfq_group *grp) { /* if S > V we are not eligible */ unsigned int state = qfq_gt(grp->S, q->V); unsigned long mask = mask_from(q->bitmaps[ER], grp->index); struct qfq_group *next; if (mask) { next = qfq_ffs(q, mask); if (qfq_gt(grp->F, next->F)) state |= EB; } return state; } /* * In principle * q->bitmaps[dst] |= q->bitmaps[src] & mask; * q->bitmaps[src] &= ~mask; * but we should make sure that src != dst */ static inline void qfq_move_groups(struct qfq_sched *q, unsigned long mask, int src, int dst) { q->bitmaps[dst] |= q->bitmaps[src] & mask; q->bitmaps[src] &= ~mask; } static inline void qfq_unblock_groups(struct qfq_sched *q, int index, uint64_t old_finish) { unsigned long mask = mask_from(q->bitmaps[ER], index + 1); struct qfq_group *next; if (mask) { next = qfq_ffs(q, mask); if (!qfq_gt(next->F, old_finish)) return; } mask = (1UL << index) - 1; qfq_move_groups(q, mask, EB, ER); qfq_move_groups(q, mask, IB, IR); } /* * perhaps * old_V ^= q->V; old_V >>= QFQ_MIN_SLOT_SHIFT; if (old_V) { ... } * */ static inline void qfq_make_eligible(struct qfq_sched *q, uint64_t old_V) { unsigned long mask, vslot, old_vslot; vslot = q->V >> QFQ_MIN_SLOT_SHIFT; old_vslot = old_V >> QFQ_MIN_SLOT_SHIFT; if (vslot != old_vslot) { mask = (2UL << (__fls(vslot ^ old_vslot))) - 1; qfq_move_groups(q, mask, IR, ER); qfq_move_groups(q, mask, IB, EB); } } /* * XXX we should make sure that slot becomes less than 32. * This is guaranteed by the input values. * roundedS is always cl->S rounded on grp->slot_shift bits. */ static inline void qfq_slot_insert(struct qfq_group *grp, struct qfq_class *cl, uint64_t roundedS) { uint64_t slot = (roundedS - grp->S) >> grp->slot_shift; unsigned int i = (grp->front + slot) % QFQ_MAX_SLOTS; cl->next = grp->slots[i]; grp->slots[i] = cl; __set_bit(slot, &grp->full_slots); } /* * remove the entry from the slot */ static inline void qfq_front_slot_remove(struct qfq_group *grp) { struct qfq_class **h = &grp->slots[grp->front]; *h = (*h)->next; if (!*h) __clear_bit(0, &grp->full_slots); } /* * Returns the first full queue in a group. As a side effect, * adjust the bucket list so the first non-empty bucket is at * position 0 in full_slots. */ static inline struct qfq_class * qfq_slot_scan(struct qfq_group *grp) { int i; ND("grp %d full %x", grp->index, grp->full_slots); if (!grp->full_slots) return NULL; i = ffs(grp->full_slots) - 1; // zero-based if (i > 0) { grp->front = (grp->front + i) % QFQ_MAX_SLOTS; grp->full_slots >>= i; } return grp->slots[grp->front]; } /* * adjust the bucket list. When the start time of a group decreases, * we move the index down (modulo QFQ_MAX_SLOTS) so we don't need to * move the objects. The mask of occupied slots must be shifted * because we use ffs() to find the first non-empty slot. * This covers decreases in the group's start time, but what about * increases of the start time ? * Here too we should make sure that i is less than 32 */ static inline void qfq_slot_rotate(struct qfq_sched *q, struct qfq_group *grp, uint64_t roundedS) { unsigned int i = (grp->S - roundedS) >> grp->slot_shift; grp->full_slots <<= i; grp->front = (grp->front - i) % QFQ_MAX_SLOTS; } static inline void qfq_update_eligible(struct qfq_sched *q, uint64_t old_V) { bitmap ineligible; ineligible = q->bitmaps[IR] | q->bitmaps[IB]; if (ineligible) { if (!q->bitmaps[ER]) { struct qfq_group *grp; grp = qfq_ffs(q, ineligible); if (qfq_gt(grp->S, q->V)) q->V = grp->S; } qfq_make_eligible(q, old_V); } } /* * Updates the class, returns true if also the group needs to be updated. */ static inline int qfq_update_class(struct qfq_sched *q, struct qfq_group *grp, struct qfq_class *cl) { cl->S = cl->F; if (cl->_q.mq.head == NULL) { qfq_front_slot_remove(grp); } else { unsigned int len; uint64_t roundedS; len = cl->_q.mq.head->m_pkthdr.len; cl->F = cl->S + (uint64_t)len * cl->inv_w; roundedS = qfq_round_down(cl->S, grp->slot_shift); if (roundedS == grp->S) return 0; qfq_front_slot_remove(grp); qfq_slot_insert(grp, cl, roundedS); } return 1; } static struct mbuf * qfq_dequeue(struct dn_sch_inst *si) { struct qfq_sched *q = (struct qfq_sched *)(si + 1); struct qfq_group *grp; struct qfq_class *cl; struct mbuf *m; uint64_t old_V; NO(q->loops++;) if (!q->bitmaps[ER]) { NO(if (q->queued) dump_sched(q, "start dequeue");) return NULL; } grp = qfq_ffs(q, q->bitmaps[ER]); cl = grp->slots[grp->front]; /* extract from the first bucket in the bucket list */ m = dn_dequeue(&cl->_q); if (!m) { D("BUG/* non-workconserving leaf */"); return NULL; } NO(q->queued--;) old_V = q->V; q->V += (uint64_t)m->m_pkthdr.len * IWSUM; ND("m is %p F 0x%llx V now 0x%llx", m, cl->F, q->V); if (qfq_update_class(q, grp, cl)) { uint64_t old_F = grp->F; cl = qfq_slot_scan(grp); if (!cl) { /* group gone, remove from ER */ __clear_bit(grp->index, &q->bitmaps[ER]); // grp->S = grp->F + 1; // XXX debugging only } else { uint64_t roundedS = qfq_round_down(cl->S, grp->slot_shift); unsigned int s; if (grp->S == roundedS) goto skip_unblock; grp->S = roundedS; grp->F = roundedS + (2ULL << grp->slot_shift); /* remove from ER and put in the new set */ __clear_bit(grp->index, &q->bitmaps[ER]); s = qfq_calc_state(q, grp); __set_bit(grp->index, &q->bitmaps[s]); } /* we need to unblock even if the group has gone away */ qfq_unblock_groups(q, grp->index, old_F); } skip_unblock: qfq_update_eligible(q, old_V); NO(if (!q->bitmaps[ER] && q->queued) dump_sched(q, "end dequeue");) return m; } /* * Assign a reasonable start time for a new flow k in group i. * Admissible values for \hat(F) are multiples of \sigma_i * no greater than V+\sigma_i . Larger values mean that * we had a wraparound so we consider the timestamp to be stale. * * If F is not stale and F >= V then we set S = F. * Otherwise we should assign S = V, but this may violate * the ordering in ER. So, if we have groups in ER, set S to * the F_j of the first group j which would be blocking us. * We are guaranteed not to move S backward because * otherwise our group i would still be blocked. */ static inline void qfq_update_start(struct qfq_sched *q, struct qfq_class *cl) { unsigned long mask; uint64_t limit, roundedF; int slot_shift = cl->grp->slot_shift; roundedF = qfq_round_down(cl->F, slot_shift); limit = qfq_round_down(q->V, slot_shift) + (1UL << slot_shift); if (!qfq_gt(cl->F, q->V) || qfq_gt(roundedF, limit)) { /* timestamp was stale */ mask = mask_from(q->bitmaps[ER], cl->grp->index); if (mask) { struct qfq_group *next = qfq_ffs(q, mask); if (qfq_gt(roundedF, next->F)) { cl->S = next->F; return; } } cl->S = q->V; } else { /* timestamp is not stale */ cl->S = cl->F; } } static int qfq_enqueue(struct dn_sch_inst *si, struct dn_queue *_q, struct mbuf *m) { struct qfq_sched *q = (struct qfq_sched *)(si + 1); struct qfq_group *grp; struct qfq_class *cl = (struct qfq_class *)_q; uint64_t roundedS; int s; NO(q->loops++;) DX(4, "len %d flow %p inv_w 0x%x grp %d", m->m_pkthdr.len, _q, cl->inv_w, cl->grp->index); /* XXX verify that the packet obeys the parameters */ if (m != _q->mq.head) { if (dn_enqueue(_q, m, 0)) /* packet was dropped */ return 1; NO(q->queued++;) if (m != _q->mq.head) return 0; } /* If reach this point, queue q was idle */ grp = cl->grp; qfq_update_start(q, cl); /* adjust start time */ /* compute new finish time and rounded start. */ cl->F = cl->S + (uint64_t)(m->m_pkthdr.len) * cl->inv_w; roundedS = qfq_round_down(cl->S, grp->slot_shift); /* * insert cl in the correct bucket. * If cl->S >= grp->S we don't need to adjust the * bucket list and simply go to the insertion phase. * Otherwise grp->S is decreasing, we must make room * in the bucket list, and also recompute the group state. * Finally, if there were no flows in this group and nobody * was in ER make sure to adjust V. */ if (grp->full_slots) { if (!qfq_gt(grp->S, cl->S)) goto skip_update; /* create a slot for this cl->S */ qfq_slot_rotate(q, grp, roundedS); /* group was surely ineligible, remove */ __clear_bit(grp->index, &q->bitmaps[IR]); __clear_bit(grp->index, &q->bitmaps[IB]); } else if (!q->bitmaps[ER] && qfq_gt(roundedS, q->V)) q->V = roundedS; grp->S = roundedS; grp->F = roundedS + (2ULL << grp->slot_shift); // i.e. 2\sigma_i s = qfq_calc_state(q, grp); __set_bit(grp->index, &q->bitmaps[s]); ND("new state %d 0x%x", s, q->bitmaps[s]); ND("S %llx F %llx V %llx", cl->S, cl->F, q->V); skip_update: qfq_slot_insert(grp, cl, roundedS); return 0; } #if 0 static inline void qfq_slot_remove(struct qfq_sched *q, struct qfq_group *grp, struct qfq_class *cl, struct qfq_class **pprev) { unsigned int i, offset; uint64_t roundedS; roundedS = qfq_round_down(cl->S, grp->slot_shift); offset = (roundedS - grp->S) >> grp->slot_shift; i = (grp->front + offset) % QFQ_MAX_SLOTS; #ifdef notyet if (!pprev) { pprev = &grp->slots[i]; while (*pprev && *pprev != cl) pprev = &(*pprev)->next; } #endif *pprev = cl->next; if (!grp->slots[i]) __clear_bit(offset, &grp->full_slots); } /* * called to forcibly destroy a queue. * If the queue is not in the front bucket, or if it has * other queues in the front bucket, we can simply remove * the queue with no other side effects. * Otherwise we must propagate the event up. * XXX description to be completed. */ static void qfq_deactivate_class(struct qfq_sched *q, struct qfq_class *cl, struct qfq_class **pprev) { struct qfq_group *grp = &q->groups[cl->index]; unsigned long mask; uint64_t roundedS; int s; cl->F = cl->S; // not needed if the class goes away. qfq_slot_remove(q, grp, cl, pprev); if (!grp->full_slots) { /* nothing left in the group, remove from all sets. * Do ER last because if we were blocking other groups * we must unblock them. */ __clear_bit(grp->index, &q->bitmaps[IR]); __clear_bit(grp->index, &q->bitmaps[EB]); __clear_bit(grp->index, &q->bitmaps[IB]); if (test_bit(grp->index, &q->bitmaps[ER]) && !(q->bitmaps[ER] & ~((1UL << grp->index) - 1))) { mask = q->bitmaps[ER] & ((1UL << grp->index) - 1); if (mask) mask = ~((1UL << __fls(mask)) - 1); else mask = ~0UL; qfq_move_groups(q, mask, EB, ER); qfq_move_groups(q, mask, IB, IR); } __clear_bit(grp->index, &q->bitmaps[ER]); } else if (!grp->slots[grp->front]) { cl = qfq_slot_scan(grp); roundedS = qfq_round_down(cl->S, grp->slot_shift); if (grp->S != roundedS) { __clear_bit(grp->index, &q->bitmaps[ER]); __clear_bit(grp->index, &q->bitmaps[IR]); __clear_bit(grp->index, &q->bitmaps[EB]); __clear_bit(grp->index, &q->bitmaps[IB]); grp->S = roundedS; grp->F = roundedS + (2ULL << grp->slot_shift); s = qfq_calc_state(q, grp); __set_bit(grp->index, &q->bitmaps[s]); } } qfq_update_eligible(q, q->V); } #endif static int qfq_new_fsk(struct dn_fsk *f) { ipdn_bound_var(&f->fs.par[0], 1, 1, QFQ_MAX_WEIGHT, "qfq weight"); ipdn_bound_var(&f->fs.par[1], 1500, 1, 2000, "qfq maxlen"); ND("weight %d len %d\n", f->fs.par[0], f->fs.par[1]); return 0; } /* * initialize a new scheduler instance */ static int qfq_new_sched(struct dn_sch_inst *si) { struct qfq_sched *q = (struct qfq_sched *)(si + 1); struct qfq_group *grp; int i; for (i = 0; i <= QFQ_MAX_INDEX; i++) { grp = &q->groups[i]; grp->index = i; grp->slot_shift = QFQ_MTU_SHIFT + FRAC_BITS - (QFQ_MAX_INDEX - i); } return 0; } /* * QFQ scheduler descriptor */ static struct dn_alg qfq_desc = { _SI( .type = ) DN_SCHED_QFQ, _SI( .name = ) "QFQ", _SI( .flags = ) DN_MULTIQUEUE, _SI( .schk_datalen = ) 0, _SI( .si_datalen = ) sizeof(struct qfq_sched), _SI( .q_datalen = ) sizeof(struct qfq_class) - sizeof(struct dn_queue), _SI( .enqueue = ) qfq_enqueue, _SI( .dequeue = ) qfq_dequeue, _SI( .config = ) NULL, _SI( .destroy = ) NULL, _SI( .new_sched = ) qfq_new_sched, _SI( .free_sched = ) NULL, _SI( .new_fsk = ) qfq_new_fsk, _SI( .free_fsk = ) NULL, _SI( .new_queue = ) qfq_new_queue, _SI( .free_queue = ) qfq_free_queue, }; DECLARE_DNSCHED_MODULE(dn_qfq, &qfq_desc); #ifdef QFQ_DEBUG static void dump_groups(struct qfq_sched *q, uint32_t mask) { int i, j; for (i = 0; i < QFQ_MAX_INDEX + 1; i++) { struct qfq_group *g = &q->groups[i]; if (0 == (mask & (1<slots[j]) D(" bucket %d %p", j, g->slots[j]); } D("full_slots 0x%x", g->full_slots); D(" %2d S 0x%20llx F 0x%llx %c", i, g->S, g->F, mask & (1<loops, q->queued, q->V); D(" ER 0x%08x", q->bitmaps[ER]); D(" EB 0x%08x", q->bitmaps[EB]); D(" IR 0x%08x", q->bitmaps[IR]); D(" IB 0x%08x", q->bitmaps[IB]); dump_groups(q, 0xffffffff); }; #endif /* QFQ_DEBUG */ ipfw3-2012/sys/netinet/ipfw/ip_dn_io.c000644 000423 000000 00000066364 12010047557 020123 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 2010 Luigi Rizzo, Riccardo Panicucci, Universita` di Pisa * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * Dummynet portions related to packet handling. */ #include __FBSDID("$FreeBSD: user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dn_io.c 203321 2010-01-31 21:39:25Z luigi $"); #include "opt_inet6.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* IFNAMSIZ, struct ifaddr, ifq head, lock.h mutex.h */ #include #include #include #include /* ip_len, ip_off */ #include /* ip_output(), IP_FORWARDING */ #include #include #include #include #include #include #include /* various ether_* routines */ #include /* for ip6_input, ip6_output prototypes */ #include /* * We keep a private variable for the simulation time, but we could * probably use an existing one ("softticks" in sys/kern/kern_timeout.c) * instead of dn_cfg.curr_time */ struct dn_parms dn_cfg; //VNET_DEFINE(struct dn_parms, _base_dn_cfg); static long tick_last; /* Last tick duration (usec). */ static long tick_delta; /* Last vs standard tick diff (usec). */ static long tick_delta_sum; /* Accumulated tick difference (usec).*/ static long tick_adjustment; /* Tick adjustments done. */ static long tick_lost; /* Lost(coalesced) ticks number. */ /* Adjusted vs non-adjusted curr_time difference (ticks). */ static long tick_diff; static unsigned long io_pkt; static unsigned long io_pkt_fast; static unsigned long io_pkt_drop; /* * We use a heap to store entities for which we have pending timer events. * The heap is checked at every tick and all entities with expired events * are extracted. */ MALLOC_DEFINE(M_DUMMYNET, "dummynet", "dummynet heap"); extern void (*bridge_dn_p)(struct mbuf *, struct ifnet *); #ifdef SYSCTL_NODE SYSBEGIN(f4) SYSCTL_DECL(_net_inet); SYSCTL_DECL(_net_inet_ip); SYSCTL_NODE(_net_inet_ip, OID_AUTO, dummynet, CTLFLAG_RW, 0, "Dummynet"); /* wrapper to pass dn_cfg fields to SYSCTL_* */ //#define DC(x) (&(VNET_NAME(_base_dn_cfg).x)) #define DC(x) (&(dn_cfg.x)) /* parameters */ SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, hash_size, CTLFLAG_RW, DC(hash_size), 0, "Default hash table size"); SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, pipe_slot_limit, CTLFLAG_RW, DC(slot_limit), 0, "Upper limit in slots for pipe queue."); SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, pipe_byte_limit, CTLFLAG_RW, DC(byte_limit), 0, "Upper limit in bytes for pipe queue."); SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, io_fast, CTLFLAG_RW, DC(io_fast), 0, "Enable fast dummynet io."); SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, debug, CTLFLAG_RW, DC(debug), 0, "Dummynet debug level"); /* RED parameters */ SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, red_lookup_depth, CTLFLAG_RD, DC(red_lookup_depth), 0, "Depth of RED lookup table"); SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, red_avg_pkt_size, CTLFLAG_RD, DC(red_avg_pkt_size), 0, "RED Medium packet size"); SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, red_max_pkt_size, CTLFLAG_RD, DC(red_max_pkt_size), 0, "RED Max packet size"); /* time adjustment */ SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, tick_delta, CTLFLAG_RD, &tick_delta, 0, "Last vs standard tick difference (usec)."); SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, tick_delta_sum, CTLFLAG_RD, &tick_delta_sum, 0, "Accumulated tick difference (usec)."); SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, tick_adjustment, CTLFLAG_RD, &tick_adjustment, 0, "Tick adjustments done."); SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, tick_diff, CTLFLAG_RD, &tick_diff, 0, "Adjusted vs non-adjusted curr_time difference (ticks)."); SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, tick_lost, CTLFLAG_RD, &tick_lost, 0, "Number of ticks coalesced by dummynet taskqueue."); /* Drain parameters */ SYSCTL_UINT(_net_inet_ip_dummynet, OID_AUTO, expire, CTLFLAG_RW, DC(expire), 0, "Expire empty queues/pipes"); SYSCTL_UINT(_net_inet_ip_dummynet, OID_AUTO, expire_cycle, CTLFLAG_RD, DC(expire_cycle), 0, "Expire cycle for queues/pipes"); SYSCTL_UINT(_net_inet_ip_dummynet, OID_AUTO, expire_object, CTLFLAG_RW, DC(expire_object), 0, "Min # of objects before start drain routine"); SYSCTL_UINT(_net_inet_ip_dummynet, OID_AUTO, object_idle_tick, CTLFLAG_RD, DC(object_idle_tick), 0, "Time (in ticks) to cosiderer an object as idle"); SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, drain_ratio, CTLFLAG_RD, DC(drain_ratio), 0, "% of dummynet_task() to dedicate to drain routine"); /* statistics */ SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, schk_count, CTLFLAG_RD, DC(schk_count), 0, "Number of schedulers"); SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, si_count, CTLFLAG_RD, DC(si_count), 0, "Number of scheduler instances"); SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, fsk_count, CTLFLAG_RD, DC(fsk_count), 0, "Number of flowsets"); SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, queue_count, CTLFLAG_RD, DC(queue_count), 0, "Number of queues"); SYSCTL_ULONG(_net_inet_ip_dummynet, OID_AUTO, io_pkt, CTLFLAG_RD, &io_pkt, 0, "Number of packets passed to dummynet."); SYSCTL_ULONG(_net_inet_ip_dummynet, OID_AUTO, io_pkt_fast, CTLFLAG_RD, &io_pkt_fast, 0, "Number of packets bypassed dummynet scheduler."); SYSCTL_ULONG(_net_inet_ip_dummynet, OID_AUTO, io_pkt_drop, CTLFLAG_RD, &io_pkt_drop, 0, "Number of packets dropped by dummynet."); #undef DC SYSEND #endif static void dummynet_send(struct mbuf *); /* * Packets processed by dummynet have an mbuf tag associated with * them that carries their dummynet state. * Outside dummynet, only the 'rule' field is relevant, and it must * be at the beginning of the structure. */ struct dn_pkt_tag { struct ipfw_rule_ref rule; /* matching rule */ /* second part, dummynet specific */ int dn_dir; /* action when packet comes out.*/ /* see ip_fw_private.h */ uint64_t output_time; /* when the pkt is due for delivery*/ struct ifnet *ifp; /* interface, for ip_output */ struct _ip6dn_args ip6opt; /* XXX ipv6 options */ }; /* * Return the mbuf tag holding the dummynet state (it should * be the first one on the list). */ static struct dn_pkt_tag * dn_tag_get(struct mbuf *m) { struct m_tag *mtag = m_tag_first(m); KASSERT(mtag != NULL && mtag->m_tag_cookie == MTAG_ABI_COMPAT && mtag->m_tag_id == PACKET_TAG_DUMMYNET, ("packet on dummynet queue w/o dummynet tag!")); return (struct dn_pkt_tag *)(mtag+1); } static inline void mq_append(struct mq *q, struct mbuf *m) { if (q->head == NULL) q->head = m; else q->tail->m_nextpkt = m; q->tail = m; m->m_nextpkt = NULL; } /* * Dispose a list of packet. Use a functions so if we need to do * more work, this is a central point to do it. */ void dn_free_pkts(struct mbuf *mnext) { struct mbuf *m; while ((m = mnext) != NULL) { mnext = m->m_nextpkt; FREE_PKT(m); } } static int red_drops (struct dn_queue *q, int len) { /* * RED algorithm * * RED calculates the average queue size (avg) using a low-pass filter * with an exponential weighted (w_q) moving average: * avg <- (1-w_q) * avg + w_q * q_size * where q_size is the queue length (measured in bytes or * packets). * * If q_size == 0, we compute the idle time for the link, and set * avg = (1 - w_q)^(idle/s) * where s is the time needed for transmitting a medium-sized packet. * * Now, if avg < min_th the packet is enqueued. * If avg > max_th the packet is dropped. Otherwise, the packet is * dropped with probability P function of avg. */ struct dn_fsk *fs = q->fs; int64_t p_b = 0; /* Queue in bytes or packets? */ uint32_t q_size = (fs->fs.flags & DN_QSIZE_BYTES) ? q->ni.len_bytes : q->ni.length; /* Average queue size estimation. */ if (q_size != 0) { /* Queue is not empty, avg <- avg + (q_size - avg) * w_q */ int diff = SCALE(q_size) - q->avg; int64_t v = SCALE_MUL((int64_t)diff, (int64_t)fs->w_q); q->avg += (int)v; } else { /* * Queue is empty, find for how long the queue has been * empty and use a lookup table for computing * (1 - * w_q)^(idle_time/s) where s is the time to send a * (small) packet. * XXX check wraps... */ if (q->avg) { u_int t = div64((dn_cfg.curr_time - q->q_time), fs->lookup_step); q->avg = (t < fs->lookup_depth) ? SCALE_MUL(q->avg, fs->w_q_lookup[t]) : 0; } } /* Should i drop? */ if (q->avg < fs->min_th) { q->count = -1; return (0); /* accept packet */ } if (q->avg >= fs->max_th) { /* average queue >= max threshold */ if (fs->fs.flags & DN_IS_GENTLE_RED) { /* * According to Gentle-RED, if avg is greater than * max_th the packet is dropped with a probability * p_b = c_3 * avg - c_4 * where c_3 = (1 - max_p) / max_th * c_4 = 1 - 2 * max_p */ p_b = SCALE_MUL((int64_t)fs->c_3, (int64_t)q->avg) - fs->c_4; } else { q->count = -1; return (1); } } else if (q->avg > fs->min_th) { /* * We compute p_b using the linear dropping function * p_b = c_1 * avg - c_2 * where c_1 = max_p / (max_th - min_th) * c_2 = max_p * min_th / (max_th - min_th) */ p_b = SCALE_MUL((int64_t)fs->c_1, (int64_t)q->avg) - fs->c_2; } if (fs->fs.flags & DN_QSIZE_BYTES) p_b = div64((p_b * len) , fs->max_pkt_size); if (++q->count == 0) q->random = random() & 0xffff; else { /* * q->count counts packets arrived since last drop, so a greater * value of q->count means a greater packet drop probability. */ if (SCALE_MUL(p_b, SCALE((int64_t)q->count)) > q->random) { q->count = 0; /* After a drop we calculate a new random value. */ q->random = random() & 0xffff; return (1); /* drop */ } } /* End of RED algorithm. */ return (0); /* accept */ } /* * Enqueue a packet in q, subject to space and queue management policy * (whose parameters are in q->fs). * Update stats for the queue and the scheduler. * Return 0 on success, 1 on drop. The packet is consumed anyways. */ int dn_enqueue(struct dn_queue *q, struct mbuf* m, int drop) { struct dn_fs *f; struct dn_flow *ni; /* stats for scheduler instance */ uint64_t len; if (q->fs == NULL || q->_si == NULL) { printf("%s fs %p si %p, dropping\n", __FUNCTION__, q->fs, q->_si); FREE_PKT(m); return 1; } f = &(q->fs->fs); ni = &q->_si->ni; len = m->m_pkthdr.len; /* Update statistics, then check reasons to drop pkt. */ q->ni.tot_bytes += len; q->ni.tot_pkts++; ni->tot_bytes += len; ni->tot_pkts++; if (drop) goto drop; if (f->plr && random() < f->plr) goto drop; if (f->flags & DN_IS_RED && red_drops(q, m->m_pkthdr.len)) goto drop; if (f->flags & DN_QSIZE_BYTES) { if (q->ni.len_bytes > f->qsize) goto drop; } else if (q->ni.length >= f->qsize) { goto drop; } mq_append(&q->mq, m); if (q->ni.length == 0) { /* queue was idle */ dn_cfg.idle_queue--; if (ni->length == 0) /* scheduler was idle */ dn_cfg.idle_si--; } q->ni.length++; q->ni.len_bytes += len; ni->length++; ni->len_bytes += len; return 0; drop: io_pkt_drop++; q->ni.drops++; ni->drops++; FREE_PKT(m); return 1; } /* * Fetch packets from the delay line which are due now. If there are * leftover packets, reinsert the delay line in the heap. * Runs under scheduler lock. */ static void transmit_event(struct mq *q, struct delay_line *dline, uint64_t now) { struct mbuf *m; struct dn_pkt_tag *pkt = NULL; dline->oid.subtype = 0; /* not in heap */ while ((m = dline->mq.head) != NULL) { pkt = dn_tag_get(m); if (!DN_KEY_LEQ(pkt->output_time, now)) break; dline->mq.head = m->m_nextpkt; mq_append(q, m); } if (m != NULL) { dline->oid.subtype = 1; /* in heap */ heap_insert(&dn_cfg.evheap, pkt->output_time, dline); } } /* * Convert the additional MAC overheads/delays into an equivalent * number of bits for the given data rate. The samples are * in milliseconds so we need to divide by 1000. */ static uint64_t extra_bits(struct mbuf *m, struct dn_schk *s) { int index; uint64_t bits; struct dn_profile *pf = s->profile; if (!pf || pf->samples_no == 0) return 0; index = random() % pf->samples_no; bits = div64((uint64_t)pf->samples[index] * s->link.bandwidth, 1000); if (index >= pf->loss_level) { struct dn_pkt_tag *dt = dn_tag_get(m); if (dt) dt->dn_dir = DIR_DROP; } return bits; } /* * Send traffic from a scheduler instance due by 'now'. * Return a pointer to the head of the queue. */ static struct mbuf * serve_sched(struct mq *q, struct dn_sch_inst *si, uint64_t now) { struct mq def_q; struct dn_schk *s = si->sched; struct mbuf *m = NULL; int delay_line_idle = (si->dline.mq.head == NULL); int done, bw; if (q == NULL) { q = &def_q; q->head = NULL; } bw = s->link.bandwidth; si->kflags &= ~DN_ACTIVE; if (bw > 0) si->credit += (now - si->sched_time) * bw; else si->credit = 0; si->sched_time = now; done = 0; while (si->credit >= 0 && (m = s->fp->dequeue(si)) != NULL) { uint64_t len_scaled; /* * Some schedulers might want wake up the scheduler later. * To suppor this the caller returns an mbuf with len < 0 * this will result in a new wake up of the scheduler * instance between m->m_pkthdr.len ticks. */ if (m->m_pkthdr.len < 0) { si->kflags |= DN_ACTIVE; heap_insert(&dn_cfg.evheap, now - m->m_pkthdr.len, si); if (delay_line_idle && done) transmit_event(q, &si->dline, now); return NULL; } /* a regular mbuf received */ done++; len_scaled = (bw == 0) ? 0 : hz * (m->m_pkthdr.len * 8 + extra_bits(m, s)); si->credit -= len_scaled; /* Move packet in the delay line */ dn_tag_get(m)->output_time = dn_cfg.curr_time + s->link.delay; mq_append(&si->dline.mq, m); } /* * If credit >= 0 the instance is idle, mark time. * Otherwise put back in the heap, and adjust the output * time of the last inserted packet, m, which was too early. */ if (si->credit >= 0) { si->idle_time = now; } else { uint64_t t; KASSERT (bw > 0, ("bw=0 and credit<0 ?")); t = div64(bw - 1 - si->credit, bw); if (m) dn_tag_get(m)->output_time += t; si->kflags |= DN_ACTIVE; heap_insert(&dn_cfg.evheap, now + t, si); } if (delay_line_idle && done) transmit_event(q, &si->dline, now); return q->head; } /* * Support function to read the TSC (or equivalent). We use this * high resolution timer to adapt the amount of work done for * expiring the clock. * Supports Linux and FreeBSD both i386 and amd64 platform * Supports OpenWRT mips architecture * * SMP no special works is needed in * - In linux 2.6 timers will always run in the same cpu that have added it.See * (http://book.opensourceproject.org.cn/kernel/kernel3rd/opensource/0596005652/understandlk-chp-6-sect-5.html) * - FreeBSD8 has a new callout_reset_on() with specify the cpu on which * the timer must be run * - Windows runs dummynet_task() on cpu0. * * - Linux 2.4 doesn't assure to run a timer in the same cpu every time. */ #ifdef HAVE_TSC uint64_t readTSC (void) { uint64_t a=0; #ifdef __linux__ /* Linux and openwrt have a macro to read the tsc for i386 and * amd64. * Openwrt have patched the kernel and allow use of tsc with mips * and other platforms * rdtscll() is a macro defined in include/asm-xxx/msr.h, * where xxx is the architecture (x86, mips). */ rdtscll(a); #elif defined(_WIN32) /* Microsoft recommends the use of KeQueryPerformanceCounter() * insteead of rdtsc(). */ KeQueryPerformanceCounter((PLARGE_INTEGER)&a); //XXX not tested! #elif defined(__FreeBSD__) /* FreeBSD (i386/amd64) has macro rdtsc() defined in machine/cpufunc.h. * We could use the macro instead of explicity assembly XXX */ return rdtsc(); #endif return a; } #endif /* HAVE_TSC */ /* * compute avg task period. * We could do something more complex, possibly. */ static void do_update_cycle(void) { #ifdef HAVE_TSC uint64_t tmp = readTSC(); #if defined (LINUX_24) && defined(CONFIG_SMP) /* on LINUX24 and SMP, we have no guarantees on which cpu runs * the timer callbacks. If the difference between new and * old value is negative, we assume that the values come from * different cpus so we adjust 'new' accordingly. */ if (tmp <= dn_cfg.cycle_task_new) dn_cfg.cycle_task_new = tmp - dn_cfg.cycle_task; #endif /* !(linux24 && SMP) */ dn_cfg.cycle_task_old = dn_cfg.cycle_task_new; dn_cfg.cycle_task_new = tmp; dn_cfg.cycle_task = dn_cfg.cycle_task_new - dn_cfg.cycle_task_old; /* Update the average * avg = (2^N * avg + new - avg ) / 2^N * avg * N==4 seems to be a good compromise between clock clock change * and 'spurious' cycle_task value */ #define DN_N 4 dn_cfg.cycle_task_avg = (dn_cfg.cycle_task_avg << DN_N) + dn_cfg.cycle_task - dn_cfg.cycle_task_avg; dn_cfg.cycle_task_avg = dn_cfg.cycle_task_avg >> DN_N; #undef DN_N #endif /* HAVE_TSC */ } static void do_drain(void) { #ifdef HAVE_TSC uint64_t dt_max; #endif if (!dn_cfg.expire || ++dn_cfg.expire_cycle < dn_cfg.expire) return; /* It's time to check if drain routines should be called */ dn_cfg.expire_cycle = 0; dn_cfg.idle_queue_wait = 0; dn_cfg.idle_si_wait = 0; /* Do a drain cycle even if there isn't time to do it */ #ifdef HAVE_TSC dt_max = dn_cfg.cycle_task_avg * dn_cfg.drain_ratio; #endif for (;;) { int done = 0; if (dn_cfg.idle_queue > dn_cfg.expire_object && dn_cfg.idle_queue_wait < dn_cfg.idle_queue) { dn_drain_queue(); done = 1; } if (dn_cfg.idle_si > dn_cfg.expire_object && dn_cfg.idle_si_wait < dn_cfg.idle_si) { dn_drain_scheduler(); done = 1; } /* time to end ? */ #ifndef HAVE_TSC /* If tsc does not exist, do only one drain cycle and exit */ break; #else /* Exit when nothing was done or we have consumed all time */ if ( (done == 0) || ((readTSC() - dn_cfg.cycle_task_new) * 100 > dt_max) ) break; #endif /* HAVE_TSC */ } } /* * The timer handler for dummynet. Time is computed in ticks, but * but the code is tolerant to the actual rate at which this is called. * Once complete, the function reschedules itself for the next tick. */ void dummynet_task(void *context, int pending) { struct timeval t; struct mq q = { NULL, NULL }; /* queue to accumulate results */ CURVNET_SET((struct vnet *)context); do_update_cycle(); /* compute avg. tick duration */ DN_BH_WLOCK(); /* Update number of lost(coalesced) ticks. */ tick_lost += pending - 1; getmicrouptime(&t); /* Last tick duration (usec). */ tick_last = (t.tv_sec - dn_cfg.prev_t.tv_sec) * 1000000 + (t.tv_usec - dn_cfg.prev_t.tv_usec); /* Last tick vs standard tick difference (usec). */ tick_delta = (tick_last * hz - 1000000) / hz; /* Accumulated tick difference (usec). */ tick_delta_sum += tick_delta; dn_cfg.prev_t = t; /* * Adjust curr_time if the accumulated tick difference is * greater than the 'standard' tick. Since curr_time should * be monotonically increasing, we do positive adjustments * as required, and throttle curr_time in case of negative * adjustment. */ dn_cfg.curr_time++; if (tick_delta_sum - tick >= 0) { int diff = tick_delta_sum / tick; dn_cfg.curr_time += diff; tick_diff += diff; tick_delta_sum %= tick; tick_adjustment++; } else if (tick_delta_sum + tick <= 0) { dn_cfg.curr_time--; tick_diff--; tick_delta_sum += tick; tick_adjustment++; } /* serve pending events, accumulate in q */ for (;;) { struct dn_id *p; /* generic parameter to handler */ if (dn_cfg.evheap.elements == 0 || DN_KEY_LT(dn_cfg.curr_time, HEAP_TOP(&dn_cfg.evheap)->key)) break; p = HEAP_TOP(&dn_cfg.evheap)->object; heap_extract(&dn_cfg.evheap, NULL); if (p->type == DN_SCH_I) { serve_sched(&q, (struct dn_sch_inst *)p, dn_cfg.curr_time); } else { /* extracted a delay line */ transmit_event(&q, (struct delay_line *)p, dn_cfg.curr_time); } } do_drain(); DN_BH_WUNLOCK(); dn_reschedule(); if (q.head != NULL) dummynet_send(q.head); CURVNET_RESTORE(); } /* * forward a chain of packets to the proper destination. * This runs outside the dummynet lock. */ static void dummynet_send(struct mbuf *m) { struct mbuf *n; for (; m != NULL; m = n) { struct ifnet *ifp = NULL; /* gcc 3.4.6 complains */ struct m_tag *tag; int dst; n = m->m_nextpkt; m->m_nextpkt = NULL; tag = m_tag_first(m); if (tag == NULL) { /* should not happen */ dst = DIR_DROP; } else { struct dn_pkt_tag *pkt = dn_tag_get(m); /* extract the dummynet info, rename the tag * to carry reinject info. */ dst = pkt->dn_dir; ifp = pkt->ifp; tag->m_tag_cookie = MTAG_IPFW_RULE; tag->m_tag_id = 0; } switch (dst) { case DIR_OUT: SET_HOST_IPLEN(mtod(m, struct ip *)); ip_output(m, NULL, NULL, IP_FORWARDING, NULL, NULL); break ; case DIR_IN : /* put header in network format for ip_input() */ //SET_NET_IPLEN(mtod(m, struct ip *)); netisr_dispatch(NETISR_IP, m); break; #ifdef INET6 case DIR_IN | PROTO_IPV6: netisr_dispatch(NETISR_IPV6, m); break; case DIR_OUT | PROTO_IPV6: SET_HOST_IPLEN(mtod(m, struct ip *)); ip6_output(m, NULL, NULL, IPV6_FORWARDING, NULL, NULL, NULL); break; #endif case DIR_FWD | PROTO_IFB: /* DN_TO_IFB_FWD: */ if (bridge_dn_p != NULL) ((*bridge_dn_p)(m, ifp)); else printf("dummynet: if_bridge not loaded\n"); break; case DIR_IN | PROTO_LAYER2: /* DN_TO_ETH_DEMUX: */ /* * The Ethernet code assumes the Ethernet header is * contiguous in the first mbuf header. * Insure this is true. */ if (m->m_len < ETHER_HDR_LEN && (m = m_pullup(m, ETHER_HDR_LEN)) == NULL) { printf("dummynet/ether: pullup failed, " "dropping packet\n"); break; } ether_demux(m->m_pkthdr.rcvif, m); break; case DIR_OUT | PROTO_LAYER2: /* N_TO_ETH_OUT: */ ether_output_frame(ifp, m); break; case DIR_DROP: /* drop the packet after some time */ FREE_PKT(m); break; default: printf("dummynet: bad switch %d!\n", dst); FREE_PKT(m); break; } } } static inline int tag_mbuf(struct mbuf *m, int dir, struct ip_fw_args *fwa) { struct dn_pkt_tag *dt; struct m_tag *mtag; mtag = m_tag_get(PACKET_TAG_DUMMYNET, sizeof(*dt), M_NOWAIT | M_ZERO); if (mtag == NULL) return 1; /* Cannot allocate packet header. */ m_tag_prepend(m, mtag); /* Attach to mbuf chain. */ dt = (struct dn_pkt_tag *)(mtag + 1); dt->rule = fwa->rule; dt->rule.info &= IPFW_ONEPASS; /* only keep this info */ dt->dn_dir = dir; dt->ifp = fwa->oif; /* dt->output tame is updated as we move through */ dt->output_time = dn_cfg.curr_time; return 0; } /* * dummynet hook for packets. * We use the argument to locate the flowset fs and the sched_set sch * associated to it. The we apply flow_mask and sched_mask to * determine the queue and scheduler instances. * * dir where shall we send the packet after dummynet. * *m0 the mbuf with the packet * ifp the 'ifp' parameter from the caller. * NULL in ip_input, destination interface in ip_output, */ int dummynet_io(struct mbuf **m0, int dir, struct ip_fw_args *fwa) { struct mbuf *m = *m0; struct dn_fsk *fs = NULL; struct dn_sch_inst *si; struct dn_queue *q = NULL; /* default */ int fs_id = (fwa->rule.info & IPFW_INFO_MASK) + ((fwa->rule.info & IPFW_IS_PIPE) ? 2*DN_MAX_ID : 0); DN_BH_WLOCK(); io_pkt++; /* we could actually tag outside the lock, but who cares... */ if (tag_mbuf(m, dir, fwa)) goto dropit; if (dn_cfg.busy) { /* if the upper half is busy doing something expensive, * lets queue the packet and move forward */ mq_append(&dn_cfg.pending, m); m = *m0 = NULL; /* consumed */ goto done; /* already active, nothing to do */ } /* XXX locate_flowset could be optimised with a direct ref. */ fs = dn_ht_find(dn_cfg.fshash, fs_id, 0, NULL); if (fs == NULL) goto dropit; /* This queue/pipe does not exist! */ if (fs->sched == NULL) /* should not happen */ goto dropit; /* * If the scheduler supports multiple queues, find the right one * (otherwise it will be ignored by enqueue). */ if (fs->sched->fp->flags & DN_MULTIQUEUE) { q = ipdn_q_find(fs, &(fwa->f_id)); if (q == NULL) goto dropit; /* The scheduler instance lookup is done only for new queue. * The callback q_new() will create the scheduler instance * if needed. */ si = q->_si; } else si = ipdn_si_find(fs->sched, &(fwa->f_id)); if (si == NULL) goto dropit; if (fs->sched->fp->enqueue(si, q, m)) { /* packet was dropped by enqueue() */ m = *m0 = NULL; goto dropit; } if (si->kflags & DN_ACTIVE) { m = *m0 = NULL; /* consumed */ goto done; /* already active, nothing to do */ } /* compute the initial allowance */ if (si->idle_time < dn_cfg.curr_time) { /* Do this only on the first packet on an idle pipe */ struct dn_link *p = &fs->sched->link; si->sched_time = dn_cfg.curr_time; si->credit = dn_cfg.io_fast ? p->bandwidth : 0; if (p->burst) { uint64_t burst = (dn_cfg.curr_time - si->idle_time) * p->bandwidth; if (burst > p->burst) burst = p->burst; si->credit += burst; } } /* pass through scheduler and delay line */ m = serve_sched(NULL, si, dn_cfg.curr_time); /* optimization -- pass it back to ipfw for immediate send */ /* XXX Don't call dummynet_send() if scheduler return the packet * just enqueued. This avoid a lock order reversal. * */ if (/*dn_cfg.io_fast &&*/ m == *m0 && (dir & PROTO_LAYER2) == 0 ) { /* fast io, rename the tag * to carry reinject info. */ struct m_tag *tag = m_tag_first(m); tag->m_tag_cookie = MTAG_IPFW_RULE; tag->m_tag_id = 0; io_pkt_fast++; if (m->m_nextpkt != NULL) { printf("dummynet: fast io: pkt chain detected!\n"); m->m_nextpkt = NULL; } m = NULL; } else { *m0 = NULL; } done: DN_BH_WUNLOCK(); if (m) dummynet_send(m); return 0; dropit: io_pkt_drop++; DN_BH_WUNLOCK(); if (m) FREE_PKT(m); *m0 = NULL; return (fs && (fs->fs.flags & DN_NOERROR)) ? 0 : ENOBUFS; } ipfw3-2012/sys/netinet/ipfw/ip_fw2.c000644 000423 000000 00000201511 12010146035 017501 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 2002-2009 Luigi Rizzo, Universita` di Pisa * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include __FBSDID("$FreeBSD: head/sys/netinet/ipfw/ip_fw2.c 200601 2009-12-16 10:48:40Z luigi $"); /* * The FreeBSD IP packet firewall, main file */ #include "opt_ipfw.h" #include "opt_ipdivert.h" #include "opt_inet.h" #ifndef INET #error "IPFIREWALL requires INET" #endif /* INET */ #include "opt_inet6.h" #include "opt_ipsec.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* for ETHERTYPE_IP */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef INET6 #include #include #include #endif #include /* XXX for in_cksum */ #ifdef MAC #include #endif /* * static variables followed by global ones. * All ipfw global variables are here. */ /* ipfw_vnet_ready controls when we are open for business */ static VNET_DEFINE(int, ipfw_vnet_ready) = 0; #define V_ipfw_vnet_ready VNET(ipfw_vnet_ready) static VNET_DEFINE(int, fw_deny_unknown_exthdrs); #define V_fw_deny_unknown_exthdrs VNET(fw_deny_unknown_exthdrs) #ifdef IPFIREWALL_DEFAULT_TO_ACCEPT static int default_to_accept = 1; #else static int default_to_accept; #endif VNET_DEFINE(int, autoinc_step); /* * Each rule belongs to one of 32 different sets (0..31). * The variable set_disable contains one bit per set. * If the bit is set, all rules in the corresponding set * are disabled. Set RESVD_SET(31) is reserved for the default rule * and rules that are not deleted by the flush command, * and CANNOT be disabled. * Rules in set RESVD_SET can only be deleted individually. */ VNET_DEFINE(u_int32_t, set_disable); #define V_set_disable VNET(set_disable) VNET_DEFINE(int, fw_verbose); /* counter for ipfw_log(NULL...) */ VNET_DEFINE(u_int64_t, norule_counter); VNET_DEFINE(int, verbose_limit); /* layer3_chain contains the list of rules for layer 3 */ VNET_DEFINE(struct ip_fw_chain, layer3_chain); ipfw_nat_t *ipfw_nat_ptr = NULL; struct cfg_nat *(*lookup_nat_ptr)(struct nat_list *, int); ipfw_nat_cfg_t *ipfw_nat_cfg_ptr; ipfw_nat_cfg_t *ipfw_nat_del_ptr; ipfw_nat_cfg_t *ipfw_nat_get_cfg_ptr; ipfw_nat_cfg_t *ipfw_nat_get_log_ptr; #ifdef SYSCTL_NODE uint32_t dummy_def = IPFW_DEFAULT_RULE; uint32_t dummy_tables_max = IPFW_TABLES_MAX; SYSBEGIN(f3) SYSCTL_NODE(_net_inet_ip, OID_AUTO, fw, CTLFLAG_RW, 0, "Firewall"); SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, one_pass, CTLFLAG_RW | CTLFLAG_SECURE3, &VNET_NAME(fw_one_pass), 0, "Only do a single pass through ipfw when using dummynet(4)"); SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, autoinc_step, CTLFLAG_RW, &VNET_NAME(autoinc_step), 0, "Rule number auto-increment step"); SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, verbose, CTLFLAG_RW | CTLFLAG_SECURE3, &VNET_NAME(fw_verbose), 0, "Log matches to ipfw rules"); SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, verbose_limit, CTLFLAG_RW, &VNET_NAME(verbose_limit), 0, "Set upper limit of matches of ipfw rules logged"); SYSCTL_UINT(_net_inet_ip_fw, OID_AUTO, default_rule, CTLFLAG_RD, &dummy_def, 0, "The default/max possible rule number."); SYSCTL_UINT(_net_inet_ip_fw, OID_AUTO, tables_max, CTLFLAG_RD, &dummy_tables_max, 0, "The maximum number of tables."); SYSCTL_INT(_net_inet_ip_fw, OID_AUTO, default_to_accept, CTLFLAG_RDTUN, &default_to_accept, 0, "Make the default rule accept all packets."); TUNABLE_INT("net.inet.ip.fw.default_to_accept", &default_to_accept); SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, static_count, CTLFLAG_RD, &VNET_NAME(layer3_chain.n_rules), 0, "Number of static rules"); #ifdef INET6 SYSCTL_DECL(_net_inet6_ip6); SYSCTL_NODE(_net_inet6_ip6, OID_AUTO, fw, CTLFLAG_RW, 0, "Firewall"); SYSCTL_VNET_INT(_net_inet6_ip6_fw, OID_AUTO, deny_unknown_exthdrs, CTLFLAG_RW | CTLFLAG_SECURE, &VNET_NAME(fw_deny_unknown_exthdrs), 0, "Deny packets with unknown IPv6 Extension Headers"); #endif /* INET6 */ SYSEND #endif /* SYSCTL_NODE */ /* * Some macros used in the various matching options. * L3HDR maps an ipv4 pointer into a layer3 header pointer of type T * Other macros just cast void * into the appropriate type */ #define L3HDR(T, ip) ((T *)((u_int32_t *)(ip) + (ip)->ip_hl)) #define TCP(p) ((struct tcphdr *)(p)) #define SCTP(p) ((struct sctphdr *)(p)) #define UDP(p) ((struct udphdr *)(p)) #define ICMP(p) ((struct icmphdr *)(p)) #define ICMP6(p) ((struct icmp6_hdr *)(p)) static __inline int icmptype_match(struct icmphdr *icmp, ipfw_insn_u32 *cmd) { int type = icmp->icmp_type; return (type <= ICMP_MAXTYPE && (cmd->d[0] & (1<icmp_type; return (type <= ICMP_MAXTYPE && (TT & (1<arg1 or cmd->d[0]. * * We scan options and store the bits we find set. We succeed if * * (want_set & ~bits) == 0 && (want_clear & ~bits) == want_clear * * The code is sometimes optimized not to store additional variables. */ static int flags_match(ipfw_insn *cmd, u_int8_t bits) { u_char want_clear; bits = ~bits; if ( ((cmd->arg1 & 0xff) & bits) != 0) return 0; /* some bits we want set were clear */ want_clear = (cmd->arg1 >> 8) & 0xff; if ( (want_clear & bits) != want_clear) return 0; /* some bits we want clear were set */ return 1; } static int ipopts_match(struct ip *ip, ipfw_insn *cmd) { int optlen, bits = 0; u_char *cp = (u_char *)(ip + 1); int x = (ip->ip_hl << 2) - sizeof (struct ip); for (; x > 0; x -= optlen, cp += optlen) { int opt = cp[IPOPT_OPTVAL]; if (opt == IPOPT_EOL) break; if (opt == IPOPT_NOP) optlen = 1; else { optlen = cp[IPOPT_OLEN]; if (optlen <= 0 || optlen > x) return 0; /* invalid or truncated */ } switch (opt) { default: break; case IPOPT_LSRR: bits |= IP_FW_IPOPT_LSRR; break; case IPOPT_SSRR: bits |= IP_FW_IPOPT_SSRR; break; case IPOPT_RR: bits |= IP_FW_IPOPT_RR; break; case IPOPT_TS: bits |= IP_FW_IPOPT_TS; break; } } return (flags_match(cmd, bits)); } static int tcpopts_match(struct tcphdr *tcp, ipfw_insn *cmd) { int optlen, bits = 0; u_char *cp = (u_char *)(tcp + 1); int x = (tcp->th_off << 2) - sizeof(struct tcphdr); for (; x > 0; x -= optlen, cp += optlen) { int opt = cp[0]; if (opt == TCPOPT_EOL) break; if (opt == TCPOPT_NOP) optlen = 1; else { optlen = cp[1]; if (optlen <= 0) break; } switch (opt) { default: break; case TCPOPT_MAXSEG: bits |= IP_FW_TCPOPT_MSS; break; case TCPOPT_WINDOW: bits |= IP_FW_TCPOPT_WINDOW; break; case TCPOPT_SACK_PERMITTED: case TCPOPT_SACK: bits |= IP_FW_TCPOPT_SACK; break; case TCPOPT_TIMESTAMP: bits |= IP_FW_TCPOPT_TS; break; } } return (flags_match(cmd, bits)); } static int iface_match(struct ifnet *ifp, ipfw_insn_if *cmd) { if (ifp == NULL) /* no iface with this packet, match fails */ return 0; /* Check by name or by IP address */ if (cmd->name[0] != '\0') { /* match by name */ /* Check name */ if (cmd->p.glob) { if (fnmatch(cmd->name, ifp->if_xname, 0) == 0) return(1); } else { if (strncmp(ifp->if_xname, cmd->name, IFNAMSIZ) == 0) return(1); } } else { #ifdef __FreeBSD__ /* and OSX too ? */ struct ifaddr *ia; if_addr_rlock(ifp); TAILQ_FOREACH(ia, &ifp->if_addrhead, ifa_link) { if (ia->ifa_addr->sa_family != AF_INET) continue; if (cmd->p.ip.s_addr == ((struct sockaddr_in *) (ia->ifa_addr))->sin_addr.s_addr) { if_addr_runlock(ifp); return(1); /* match */ } } if_addr_runlock(ifp); #endif /* __FreeBSD__ */ } return(0); /* no match, fail ... */ } /* * The verify_path function checks if a route to the src exists and * if it is reachable via ifp (when provided). * * The 'verrevpath' option checks that the interface that an IP packet * arrives on is the same interface that traffic destined for the * packet's source address would be routed out of. * The 'versrcreach' option just checks that the source address is * reachable via any route (except default) in the routing table. * These two are a measure to block forged packets. This is also * commonly known as "anti-spoofing" or Unicast Reverse Path * Forwarding (Unicast RFP) in Cisco-ese. The name of the knobs * is purposely reminiscent of the Cisco IOS command, * * ip verify unicast reverse-path * ip verify unicast source reachable-via any * * which implements the same functionality. But note that the syntax * is misleading, and the check may be performed on all IP packets * whether unicast, multicast, or broadcast. */ static int verify_path(struct in_addr src, struct ifnet *ifp, u_int fib) { #ifndef __FreeBSD__ return 0; #else struct route ro; struct sockaddr_in *dst; bzero(&ro, sizeof(ro)); dst = (struct sockaddr_in *)&(ro.ro_dst); dst->sin_family = AF_INET; dst->sin_len = sizeof(*dst); dst->sin_addr = src; in_rtalloc_ign(&ro, 0, fib); if (ro.ro_rt == NULL) return 0; /* * If ifp is provided, check for equality with rtentry. * We should use rt->rt_ifa->ifa_ifp, instead of rt->rt_ifp, * in order to pass packets injected back by if_simloop(): * if useloopback == 1 routing entry (via lo0) for our own address * may exist, so we need to handle routing assymetry. */ if (ifp != NULL && ro.ro_rt->rt_ifa->ifa_ifp != ifp) { RTFREE(ro.ro_rt); return 0; } /* if no ifp provided, check if rtentry is not default route */ if (ifp == NULL && satosin(rt_key(ro.ro_rt))->sin_addr.s_addr == INADDR_ANY) { RTFREE(ro.ro_rt); return 0; } /* or if this is a blackhole/reject route */ if (ifp == NULL && ro.ro_rt->rt_flags & (RTF_REJECT|RTF_BLACKHOLE)) { RTFREE(ro.ro_rt); return 0; } /* found valid route */ RTFREE(ro.ro_rt); return 1; #endif /* __FreeBSD__ */ } #ifdef INET6 /* * ipv6 specific rules here... */ static __inline int icmp6type_match (int type, ipfw_insn_u32 *cmd) { return (type <= ICMP6_MAXTYPE && (cmd->d[type/32] & (1<<(type%32)) ) ); } static int flow6id_match( int curr_flow, ipfw_insn_u32 *cmd ) { int i; for (i=0; i <= cmd->o.arg1; ++i ) if (curr_flow == cmd->d[i] ) return 1; return 0; } /* support for IP6_*_ME opcodes */ static int search_ip6_addr_net (struct in6_addr * ip6_addr) { struct ifnet *mdc; struct ifaddr *mdc2; struct in6_ifaddr *fdm; struct in6_addr copia; TAILQ_FOREACH(mdc, &V_ifnet, if_link) { if_addr_rlock(mdc); TAILQ_FOREACH(mdc2, &mdc->if_addrhead, ifa_link) { if (mdc2->ifa_addr->sa_family == AF_INET6) { fdm = (struct in6_ifaddr *)mdc2; copia = fdm->ia_addr.sin6_addr; /* need for leaving scope_id in the sock_addr */ in6_clearscope(&copia); if (IN6_ARE_ADDR_EQUAL(ip6_addr, &copia)) { if_addr_runlock(mdc); return 1; } } } if_addr_runlock(mdc); } return 0; } static int verify_path6(struct in6_addr *src, struct ifnet *ifp) { struct route_in6 ro; struct sockaddr_in6 *dst; bzero(&ro, sizeof(ro)); dst = (struct sockaddr_in6 * )&(ro.ro_dst); dst->sin6_family = AF_INET6; dst->sin6_len = sizeof(*dst); dst->sin6_addr = *src; /* XXX MRT 0 for ipv6 at this time */ rtalloc_ign((struct route *)&ro, 0); if (ro.ro_rt == NULL) return 0; /* * if ifp is provided, check for equality with rtentry * We should use rt->rt_ifa->ifa_ifp, instead of rt->rt_ifp, * to support the case of sending packets to an address of our own. * (where the former interface is the first argument of if_simloop() * (=ifp), the latter is lo0) */ if (ifp != NULL && ro.ro_rt->rt_ifa->ifa_ifp != ifp) { RTFREE(ro.ro_rt); return 0; } /* if no ifp provided, check if rtentry is not default route */ if (ifp == NULL && IN6_IS_ADDR_UNSPECIFIED(&satosin6(rt_key(ro.ro_rt))->sin6_addr)) { RTFREE(ro.ro_rt); return 0; } /* or if this is a blackhole/reject route */ if (ifp == NULL && ro.ro_rt->rt_flags & (RTF_REJECT|RTF_BLACKHOLE)) { RTFREE(ro.ro_rt); return 0; } /* found valid route */ RTFREE(ro.ro_rt); return 1; } static int is_icmp6_query(int icmp6_type) { if ((icmp6_type <= ICMP6_MAXTYPE) && (icmp6_type == ICMP6_ECHO_REQUEST || icmp6_type == ICMP6_MEMBERSHIP_QUERY || icmp6_type == ICMP6_WRUREQUEST || icmp6_type == ICMP6_FQDN_QUERY || icmp6_type == ICMP6_NI_QUERY)) return (1); return (0); } static void send_reject6(struct ip_fw_args *args, int code, u_int hlen, struct ip6_hdr *ip6) { struct mbuf *m; m = args->m; if (code == ICMP6_UNREACH_RST && args->f_id.proto == IPPROTO_TCP) { struct tcphdr *tcp; tcp = (struct tcphdr *)((char *)ip6 + hlen); if ((tcp->th_flags & TH_RST) == 0) { struct mbuf *m0; m0 = ipfw_send_pkt(args->m, &(args->f_id), ntohl(tcp->th_seq), ntohl(tcp->th_ack), tcp->th_flags | TH_RST); if (m0 != NULL) ip6_output(m0, NULL, NULL, 0, NULL, NULL, NULL); } FREE_PKT(m); } else if (code != ICMP6_UNREACH_RST) { /* Send an ICMPv6 unreach. */ #if 0 /* * Unlike above, the mbufs need to line up with the ip6 hdr, * as the contents are read. We need to m_adj() the * needed amount. * The mbuf will however be thrown away so we can adjust it. * Remember we did an m_pullup on it already so we * can make some assumptions about contiguousness. */ if (args->L3offset) m_adj(m, args->L3offset); #endif icmp6_error(m, ICMP6_DST_UNREACH, code, 0); } else FREE_PKT(m); args->m = NULL; } #endif /* INET6 */ /* * sends a reject message, consuming the mbuf passed as an argument. */ static void send_reject(struct ip_fw_args *args, int code, int iplen, struct ip *ip) { #if 0 /* XXX When ip is not guaranteed to be at mtod() we will * need to account for this */ * The mbuf will however be thrown away so we can adjust it. * Remember we did an m_pullup on it already so we * can make some assumptions about contiguousness. */ if (args->L3offset) m_adj(m, args->L3offset); #endif if (code != ICMP_REJECT_RST) { /* Send an ICMP unreach */ /* We need the IP header in host order for icmp_error(). */ SET_HOST_IPLEN(ip); icmp_error(args->m, ICMP_UNREACH, code, 0L, 0); } else if (args->f_id.proto == IPPROTO_TCP) { struct tcphdr *const tcp = L3HDR(struct tcphdr, mtod(args->m, struct ip *)); if ( (tcp->th_flags & TH_RST) == 0) { struct mbuf *m; m = ipfw_send_pkt(args->m, &(args->f_id), ntohl(tcp->th_seq), ntohl(tcp->th_ack), tcp->th_flags | TH_RST); if (m != NULL) ip_output(m, NULL, NULL, 0, NULL, NULL); } FREE_PKT(args->m); } else FREE_PKT(args->m); args->m = NULL; } /* * Support for uid/gid/jail lookup. These tests are expensive * (because we may need to look into the list of active sockets) * so we cache the results. ugid_lookupp is 0 if we have not * yet done a lookup, 1 if we succeeded, and -1 if we tried * and failed. The function always returns the match value. * We could actually spare the variable and use *uc, setting * it to '(void *)check_uidgid if we have no info, NULL if * we tried and failed, or any other value if successful. */ static int check_uidgid(ipfw_insn_u32 *insn, int proto, struct ifnet *oif, struct in_addr dst_ip, u_int16_t dst_port, struct in_addr src_ip, u_int16_t src_port, int *ugid_lookupp, struct ucred **uc, struct inpcb *inp) { #ifndef __FreeBSD__ return cred_check(insn, proto, oif, dst_ip, dst_port, src_ip, src_port, (struct bsd_ucred *)uc, ugid_lookupp, ((struct mbuf *)inp)->m_skb); #else /* FreeBSD */ struct inpcbinfo *pi; int wildcard; struct inpcb *pcb; int match; /* * Check to see if the UDP or TCP stack supplied us with * the PCB. If so, rather then holding a lock and looking * up the PCB, we can use the one that was supplied. */ if (inp && *ugid_lookupp == 0) { INP_LOCK_ASSERT(inp); if (inp->inp_socket != NULL) { *uc = crhold(inp->inp_cred); *ugid_lookupp = 1; } else *ugid_lookupp = -1; } /* * If we have already been here and the packet has no * PCB entry associated with it, then we can safely * assume that this is a no match. */ if (*ugid_lookupp == -1) return (0); if (proto == IPPROTO_TCP) { wildcard = 0; pi = &V_tcbinfo; } else if (proto == IPPROTO_UDP) { wildcard = INPLOOKUP_WILDCARD; pi = &V_udbinfo; } else return 0; match = 0; if (*ugid_lookupp == 0) { INP_INFO_RLOCK(pi); pcb = (oif) ? in_pcblookup_hash(pi, dst_ip, htons(dst_port), src_ip, htons(src_port), wildcard, oif) : in_pcblookup_hash(pi, src_ip, htons(src_port), dst_ip, htons(dst_port), wildcard, NULL); if (pcb != NULL) { *uc = crhold(pcb->inp_cred); *ugid_lookupp = 1; } INP_INFO_RUNLOCK(pi); if (*ugid_lookupp == 0) { /* * We tried and failed, set the variable to -1 * so we will not try again on this packet. */ *ugid_lookupp = -1; return (0); } } if (insn->o.opcode == O_UID) match = ((*uc)->cr_uid == (uid_t)insn->d[0]); else if (insn->o.opcode == O_GID) match = groupmember((gid_t)insn->d[0], *uc); else if (insn->o.opcode == O_JAIL) match = ((*uc)->cr_prison->pr_id == (int)insn->d[0]); return match; #endif /* __FreeBSD__ */ } /* * Helper function to set args with info on the rule after the matching * one. slot is precise, whereas we guess rule_id as they are * assigned sequentially. */ static inline void set_match(struct ip_fw_args *args, int slot, struct ip_fw_chain *chain) { args->rule.chain_id = chain->id; args->rule.slot = slot + 1; /* we use 0 as a marker */ args->rule.rule_id = 1 + chain->map[slot]->id; args->rule.rulenum = chain->map[slot]->rulenum; } /* * The main check routine for the firewall. * * All arguments are in args so we can modify them and return them * back to the caller. * * Parameters: * * args->m (in/out) The packet; we set to NULL when/if we nuke it. * Starts with the IP header. * args->eh (in) Mac header if present, NULL for layer3 packet. * args->L3offset Number of bytes bypassed if we came from L2. * e.g. often sizeof(eh) ** NOTYET ** * args->oif Outgoing interface, NULL if packet is incoming. * The incoming interface is in the mbuf. (in) * args->divert_rule (in/out) * Skip up to the first rule past this rule number; * upon return, non-zero port number for divert or tee. * * args->rule Pointer to the last matching rule (in/out) * args->next_hop Socket we are forwarding to (out). * args->f_id Addresses grabbed from the packet (out) * args->rule.info a cookie depending on rule action * * Return value: * * IP_FW_PASS the packet must be accepted * IP_FW_DENY the packet must be dropped * IP_FW_DIVERT divert packet, port in m_tag * IP_FW_TEE tee packet, port in m_tag * IP_FW_DUMMYNET to dummynet, pipe in args->cookie * IP_FW_NETGRAPH into netgraph, cookie args->cookie * args->rule contains the matching rule, * args->rule.info has additional information. * */ int ipfw_chk(struct ip_fw_args *args) { /* * Local variables holding state while processing a packet: * * IMPORTANT NOTE: to speed up the processing of rules, there * are some assumption on the values of the variables, which * are documented here. Should you change them, please check * the implementation of the various instructions to make sure * that they still work. * * args->eh The MAC header. It is non-null for a layer2 * packet, it is NULL for a layer-3 packet. * **notyet** * args->L3offset Offset in the packet to the L3 (IP or equiv.) header. * * m | args->m Pointer to the mbuf, as received from the caller. * It may change if ipfw_chk() does an m_pullup, or if it * consumes the packet because it calls send_reject(). * XXX This has to change, so that ipfw_chk() never modifies * or consumes the buffer. * ip is the beginning of the ip(4 or 6) header. * Calculated by adding the L3offset to the start of data. * (Until we start using L3offset, the packet is * supposed to start with the ip header). */ struct mbuf *m = args->m; struct ip *ip = mtod(m, struct ip *); /* * For rules which contain uid/gid or jail constraints, cache * a copy of the users credentials after the pcb lookup has been * executed. This will speed up the processing of rules with * these types of constraints, as well as decrease contention * on pcb related locks. */ #ifndef __FreeBSD__ struct bsd_ucred ucred_cache; #else struct ucred *ucred_cache = NULL; #endif int ucred_lookup = 0; /* * oif | args->oif If NULL, ipfw_chk has been called on the * inbound path (ether_input, ip_input). * If non-NULL, ipfw_chk has been called on the outbound path * (ether_output, ip_output). */ struct ifnet *oif = args->oif; int f_pos = 0; /* index of current rule in the array */ int retval = 0; /* * hlen The length of the IP header. */ u_int hlen = 0; /* hlen >0 means we have an IP pkt */ /* * offset The offset of a fragment. offset != 0 means that * we have a fragment at this offset of an IPv4 packet. * offset == 0 means that (if this is an IPv4 packet) * this is the first or only fragment. * For IPv6 offset == 0 means there is no Fragment Header. * If offset != 0 for IPv6 always use correct mask to * get the correct offset because we add IP6F_MORE_FRAG * to be able to dectect the first fragment which would * otherwise have offset = 0. */ u_short offset = 0; /* * Local copies of addresses. They are only valid if we have * an IP packet. * * proto The protocol. Set to 0 for non-ip packets, * or to the protocol read from the packet otherwise. * proto != 0 means that we have an IPv4 packet. * * src_port, dst_port port numbers, in HOST format. Only * valid for TCP and UDP packets. * * src_ip, dst_ip ip addresses, in NETWORK format. * Only valid for IPv4 packets. */ uint8_t proto; uint16_t src_port = 0, dst_port = 0; /* NOTE: host format */ struct in_addr src_ip, dst_ip; /* NOTE: network format */ uint16_t iplen=0; int pktlen; uint16_t etype = 0; /* Host order stored ether type */ /* * dyn_dir = MATCH_UNKNOWN when rules unchecked, * MATCH_NONE when checked and not matched (q = NULL), * MATCH_FORWARD or MATCH_REVERSE otherwise (q != NULL) */ int dyn_dir = MATCH_UNKNOWN; ipfw_dyn_rule *q = NULL; struct ip_fw_chain *chain = &V_layer3_chain; /* * We store in ulp a pointer to the upper layer protocol header. * In the ipv4 case this is easy to determine from the header, * but for ipv6 we might have some additional headers in the middle. * ulp is NULL if not found. */ void *ulp = NULL; /* upper layer protocol pointer. */ /* XXX ipv6 variables */ int is_ipv6 = 0; uint8_t icmp6_type = 0; uint16_t ext_hd = 0; /* bits vector for extension header filtering */ /* end of ipv6 variables */ int is_ipv4 = 0; int done = 0; /* flag to exit the outer loop */ if (m->m_flags & M_SKIP_FIREWALL || (! V_ipfw_vnet_ready)) return (IP_FW_PASS); /* accept */ dst_ip.s_addr = 0; /* make sure it is initialized */ src_ip.s_addr = 0; /* make sure it is initialized */ pktlen = m->m_pkthdr.len; args->f_id.fib = M_GETFIB(m); /* note mbuf not altered) */ proto = args->f_id.proto = 0; /* mark f_id invalid */ /* XXX 0 is a valid proto: IP/IPv6 Hop-by-Hop Option */ /* * PULLUP_TO(len, p, T) makes sure that len + sizeof(T) is contiguous, * then it sets p to point at the offset "len" in the mbuf. WARNING: the * pointer might become stale after other pullups (but we never use it * this way). */ #define PULLUP_TO(_len, p, T) \ do { \ int x = (_len) + sizeof(T); \ if ((m)->m_len < x) { \ args->m = m = m_pullup(m, x); \ if (m == NULL) \ goto pullup_failed; \ } \ p = (mtod(m, char *) + (_len)); \ } while (0) /* * if we have an ether header, */ if (args->eh) etype = ntohs(args->eh->ether_type); /* Identify IP packets and fill up variables. */ if (pktlen >= sizeof(struct ip6_hdr) && (args->eh == NULL || etype == ETHERTYPE_IPV6) && ip->ip_v == 6) { struct ip6_hdr *ip6 = (struct ip6_hdr *)ip; is_ipv6 = 1; args->f_id.addr_type = 6; hlen = sizeof(struct ip6_hdr); proto = ip6->ip6_nxt; /* Search extension headers to find upper layer protocols */ while (ulp == NULL) { switch (proto) { case IPPROTO_ICMPV6: PULLUP_TO(hlen, ulp, struct icmp6_hdr); icmp6_type = ICMP6(ulp)->icmp6_type; break; case IPPROTO_TCP: PULLUP_TO(hlen, ulp, struct tcphdr); dst_port = TCP(ulp)->th_dport; src_port = TCP(ulp)->th_sport; /* save flags for dynamic rules */ args->f_id._flags = TCP(ulp)->th_flags; break; case IPPROTO_SCTP: PULLUP_TO(hlen, ulp, struct sctphdr); src_port = SCTP(ulp)->src_port; dst_port = SCTP(ulp)->dest_port; break; case IPPROTO_UDP: PULLUP_TO(hlen, ulp, struct udphdr); dst_port = UDP(ulp)->uh_dport; src_port = UDP(ulp)->uh_sport; break; case IPPROTO_HOPOPTS: /* RFC 2460 */ PULLUP_TO(hlen, ulp, struct ip6_hbh); ext_hd |= EXT_HOPOPTS; hlen += (((struct ip6_hbh *)ulp)->ip6h_len + 1) << 3; proto = ((struct ip6_hbh *)ulp)->ip6h_nxt; ulp = NULL; break; case IPPROTO_ROUTING: /* RFC 2460 */ PULLUP_TO(hlen, ulp, struct ip6_rthdr); switch (((struct ip6_rthdr *)ulp)->ip6r_type) { case 0: ext_hd |= EXT_RTHDR0; break; case 2: ext_hd |= EXT_RTHDR2; break; default: printf("IPFW2: IPV6 - Unknown Routing " "Header type(%d)\n", ((struct ip6_rthdr *)ulp)->ip6r_type); if (V_fw_deny_unknown_exthdrs) return (IP_FW_DENY); break; } ext_hd |= EXT_ROUTING; hlen += (((struct ip6_rthdr *)ulp)->ip6r_len + 1) << 3; proto = ((struct ip6_rthdr *)ulp)->ip6r_nxt; ulp = NULL; break; case IPPROTO_FRAGMENT: /* RFC 2460 */ PULLUP_TO(hlen, ulp, struct ip6_frag); ext_hd |= EXT_FRAGMENT; hlen += sizeof (struct ip6_frag); proto = ((struct ip6_frag *)ulp)->ip6f_nxt; offset = ((struct ip6_frag *)ulp)->ip6f_offlg & IP6F_OFF_MASK; /* Add IP6F_MORE_FRAG for offset of first * fragment to be != 0. */ offset |= ((struct ip6_frag *)ulp)->ip6f_offlg & IP6F_MORE_FRAG; if (offset == 0) { printf("IPFW2: IPV6 - Invalid Fragment " "Header\n"); if (V_fw_deny_unknown_exthdrs) return (IP_FW_DENY); break; } args->f_id.extra = ntohl(((struct ip6_frag *)ulp)->ip6f_ident); ulp = NULL; break; case IPPROTO_DSTOPTS: /* RFC 2460 */ PULLUP_TO(hlen, ulp, struct ip6_hbh); ext_hd |= EXT_DSTOPTS; hlen += (((struct ip6_hbh *)ulp)->ip6h_len + 1) << 3; proto = ((struct ip6_hbh *)ulp)->ip6h_nxt; ulp = NULL; break; case IPPROTO_AH: /* RFC 2402 */ PULLUP_TO(hlen, ulp, struct ip6_ext); ext_hd |= EXT_AH; hlen += (((struct ip6_ext *)ulp)->ip6e_len + 2) << 2; proto = ((struct ip6_ext *)ulp)->ip6e_nxt; ulp = NULL; break; case IPPROTO_ESP: /* RFC 2406 */ PULLUP_TO(hlen, ulp, uint32_t); /* SPI, Seq# */ /* Anything past Seq# is variable length and * data past this ext. header is encrypted. */ ext_hd |= EXT_ESP; break; case IPPROTO_NONE: /* RFC 2460 */ /* * Packet ends here, and IPv6 header has * already been pulled up. If ip6e_len!=0 * then octets must be ignored. */ ulp = ip; /* non-NULL to get out of loop. */ break; case IPPROTO_OSPFIGP: /* XXX OSPF header check? */ PULLUP_TO(hlen, ulp, struct ip6_ext); break; case IPPROTO_PIM: /* XXX PIM header check? */ PULLUP_TO(hlen, ulp, struct pim); break; case IPPROTO_CARP: PULLUP_TO(hlen, ulp, struct carp_header); if (((struct carp_header *)ulp)->carp_version != CARP_VERSION) return (IP_FW_DENY); if (((struct carp_header *)ulp)->carp_type != CARP_ADVERTISEMENT) return (IP_FW_DENY); break; case IPPROTO_IPV6: /* RFC 2893 */ PULLUP_TO(hlen, ulp, struct ip6_hdr); break; case IPPROTO_IPV4: /* RFC 2893 */ PULLUP_TO(hlen, ulp, struct ip); break; default: printf("IPFW2: IPV6 - Unknown Extension " "Header(%d), ext_hd=%x\n", proto, ext_hd); if (V_fw_deny_unknown_exthdrs) return (IP_FW_DENY); PULLUP_TO(hlen, ulp, struct ip6_ext); break; } /*switch */ } ip = mtod(m, struct ip *); ip6 = (struct ip6_hdr *)ip; args->f_id.src_ip6 = ip6->ip6_src; args->f_id.dst_ip6 = ip6->ip6_dst; args->f_id.src_ip = 0; args->f_id.dst_ip = 0; args->f_id.flow_id6 = ntohl(ip6->ip6_flow); } else if (pktlen >= sizeof(struct ip) && (args->eh == NULL || etype == ETHERTYPE_IP) && ip->ip_v == 4) { is_ipv4 = 1; hlen = ip->ip_hl << 2; args->f_id.addr_type = 4; /* * Collect parameters into local variables for faster matching. */ proto = ip->ip_p; src_ip = ip->ip_src; dst_ip = ip->ip_dst; offset = ntohs(ip->ip_off) & IP_OFFMASK; iplen = ntohs(ip->ip_len); pktlen = iplen < pktlen ? iplen : pktlen; if (offset == 0) { switch (proto) { case IPPROTO_TCP: PULLUP_TO(hlen, ulp, struct tcphdr); dst_port = TCP(ulp)->th_dport; src_port = TCP(ulp)->th_sport; /* save flags for dynamic rules */ args->f_id._flags = TCP(ulp)->th_flags; break; case IPPROTO_UDP: PULLUP_TO(hlen, ulp, struct udphdr); dst_port = UDP(ulp)->uh_dport; src_port = UDP(ulp)->uh_sport; break; case IPPROTO_ICMP: PULLUP_TO(hlen, ulp, struct icmphdr); //args->f_id.flags = ICMP(ulp)->icmp_type; break; default: break; } } ip = mtod(m, struct ip *); args->f_id.src_ip = ntohl(src_ip.s_addr); args->f_id.dst_ip = ntohl(dst_ip.s_addr); } #undef PULLUP_TO if (proto) { /* we may have port numbers, store them */ args->f_id.proto = proto; args->f_id.src_port = src_port = ntohs(src_port); args->f_id.dst_port = dst_port = ntohs(dst_port); } IPFW_RLOCK(chain); if (! V_ipfw_vnet_ready) { /* shutting down, leave NOW. */ IPFW_RUNLOCK(chain); return (IP_FW_PASS); /* accept */ } if (args->rule.slot) { /* * Packet has already been tagged as a result of a previous * match on rule args->rule aka args->rule_id (PIPE, QUEUE, * REASS, NETGRAPH, DIVERT/TEE...) * Validate the slot and continue from the next one * if still present, otherwise do a lookup. */ f_pos = (args->rule.chain_id == chain->id) ? args->rule.slot : ipfw_find_rule(chain, args->rule.rulenum, args->rule.rule_id); } else { f_pos = 0; } /* * Now scan the rules, and parse microinstructions for each rule. * We have two nested loops and an inner switch. Sometimes we * need to break out of one or both loops, or re-enter one of * the loops with updated variables. Loop variables are: * * f_pos (outer loop) points to the current rule. * On output it points to the matching rule. * done (outer loop) is used as a flag to break the loop. * l (inner loop) residual length of current rule. * cmd points to the current microinstruction. * * We break the inner loop by setting l=0 and possibly * cmdlen=0 if we don't want to advance cmd. * We break the outer loop by setting done=1 * We can restart the inner loop by setting l>0 and f_pos, f, cmd * as needed. */ for (; f_pos < chain->n_rules; f_pos++) { ipfw_insn *cmd; uint32_t tablearg = 0; int l, cmdlen, skip_or; /* skip rest of OR block */ struct ip_fw *f; f = chain->map[f_pos]; if (V_set_disable & (1 << f->set) ) continue; skip_or = 0; for (l = f->cmd_len, cmd = f->cmd ; l > 0 ; l -= cmdlen, cmd += cmdlen) { int match; /* * check_body is a jump target used when we find a * CHECK_STATE, and need to jump to the body of * the target rule. */ /* check_body: */ cmdlen = F_LEN(cmd); /* * An OR block (insn_1 || .. || insn_n) has the * F_OR bit set in all but the last instruction. * The first match will set "skip_or", and cause * the following instructions to be skipped until * past the one with the F_OR bit clear. */ if (skip_or) { /* skip this instruction */ if ((cmd->len & F_OR) == 0) skip_or = 0; /* next one is good */ continue; } match = 0; /* set to 1 if we succeed */ switch (cmd->opcode) { /* * The first set of opcodes compares the packet's * fields with some pattern, setting 'match' if a * match is found. At the end of the loop there is * logic to deal with F_NOT and F_OR flags associated * with the opcode. */ case O_NOP: match = 1; break; case O_FORWARD_MAC: printf("ipfw: opcode %d unimplemented\n", cmd->opcode); break; case O_GID: case O_UID: case O_JAIL: /* * We only check offset == 0 && proto != 0, * as this ensures that we have a * packet with the ports info. */ if (offset!=0) break; if (is_ipv6) /* XXX to be fixed later */ break; if (proto == IPPROTO_TCP || proto == IPPROTO_UDP) match = check_uidgid( (ipfw_insn_u32 *)cmd, proto, oif, dst_ip, dst_port, src_ip, src_port, &ucred_lookup, #ifdef __FreeBSD__ &ucred_cache, args->inp); #else (void *)&ucred_cache, (struct inpcb *)args->m); #endif break; case O_RECV: match = iface_match(m->m_pkthdr.rcvif, (ipfw_insn_if *)cmd); break; case O_XMIT: match = iface_match(oif, (ipfw_insn_if *)cmd); break; case O_VIA: match = iface_match(oif ? oif : m->m_pkthdr.rcvif, (ipfw_insn_if *)cmd); break; case O_MACADDR2: if (args->eh != NULL) { /* have MAC header */ u_int32_t *want = (u_int32_t *) ((ipfw_insn_mac *)cmd)->addr; u_int32_t *mask = (u_int32_t *) ((ipfw_insn_mac *)cmd)->mask; u_int32_t *hdr = (u_int32_t *)args->eh; match = ( want[0] == (hdr[0] & mask[0]) && want[1] == (hdr[1] & mask[1]) && want[2] == (hdr[2] & mask[2]) ); } break; case O_MAC_TYPE: if (args->eh != NULL) { u_int16_t *p = ((ipfw_insn_u16 *)cmd)->ports; int i; for (i = cmdlen - 1; !match && i>0; i--, p += 2) match = (etype >= p[0] && etype <= p[1]); } break; case O_FRAG: match = (offset != 0); break; case O_IN: /* "out" is "not in" */ match = (oif == NULL); break; case O_LAYER2: match = (args->eh != NULL); break; case O_DIVERTED: { /* For diverted packets, args->rule.info * contains the divert port (in host format) * reason and direction. */ uint32_t i = args->rule.info; match = (i&IPFW_IS_MASK) == IPFW_IS_DIVERT && cmd->arg1 & ((i & IPFW_INFO_IN) ? 1 : 2); } break; case O_PROTO: /* * We do not allow an arg of 0 so the * check of "proto" only suffices. */ match = (proto == cmd->arg1); break; case O_IP_SRC: match = is_ipv4 && (((ipfw_insn_ip *)cmd)->addr.s_addr == src_ip.s_addr); break; case O_IP_SRC_LOOKUP: case O_IP_DST_LOOKUP: if (is_ipv4) { uint32_t key = (cmd->opcode == O_IP_DST_LOOKUP) ? dst_ip.s_addr : src_ip.s_addr; uint32_t v = 0; if (cmdlen > F_INSN_SIZE(ipfw_insn_u32)) { /* generic lookup. The key must be * in 32bit big-endian format. */ v = ((ipfw_insn_u32 *)cmd)->d[1]; if (v == 0) key = dst_ip.s_addr; else if (v == 1) key = src_ip.s_addr; else if (v == 6) /* dscp */ key = (ip->ip_tos >> 2) & 0x3f; else if (offset != 0) break; else if (proto != IPPROTO_TCP && proto != IPPROTO_UDP) break; else if (v == 2) key = htonl(dst_port); else if (v == 3) key = htonl(src_port); else if (v == 4 || v == 5) { check_uidgid( (ipfw_insn_u32 *)cmd, proto, oif, dst_ip, dst_port, src_ip, src_port, &ucred_lookup, #ifdef __FreeBSD__ &ucred_cache, args->inp); if (v == 4 /* O_UID */) key = ucred_cache->cr_uid; else if (v == 5 /* O_JAIL */) key = ucred_cache->cr_prison->pr_id; #else /* !__FreeBSD__ */ (void *)&ucred_cache, (struct inpcb *)args->m); if (v ==4 /* O_UID */) key = ucred_cache.uid; else if (v == 5 /* O_JAIL */) key = ucred_cache.xid; #endif /* !__FreeBSD__ */ key = htonl(key); } else break; } match = ipfw_lookup_table(chain, cmd->arg1, key, &v); if (!match) break; if (cmdlen == F_INSN_SIZE(ipfw_insn_u32)) match = ((ipfw_insn_u32 *)cmd)->d[0] == v; else tablearg = v; } break; case O_IP_SRC_MASK: case O_IP_DST_MASK: if (is_ipv4) { uint32_t a = (cmd->opcode == O_IP_DST_MASK) ? dst_ip.s_addr : src_ip.s_addr; uint32_t *p = ((ipfw_insn_u32 *)cmd)->d; int i = cmdlen-1; for (; !match && i>0; i-= 2, p+= 2) match = (p[0] == (a & p[1])); } break; case O_IP_SRC_ME: if (is_ipv4) { struct ifnet *tif; INADDR_TO_IFP(src_ip, tif); match = (tif != NULL); break; } #ifdef INET6 /* FALLTHROUGH */ case O_IP6_SRC_ME: match= is_ipv6 && search_ip6_addr_net(&args->f_id.src_ip6); #endif break; case O_IP_DST_SET: case O_IP_SRC_SET: if (is_ipv4) { u_int32_t *d = (u_int32_t *)(cmd+1); u_int32_t addr = cmd->opcode == O_IP_DST_SET ? args->f_id.dst_ip : args->f_id.src_ip; if (addr < d[0]) break; addr -= d[0]; /* subtract base */ match = (addr < cmd->arg1) && ( d[ 1 + (addr>>5)] & (1<<(addr & 0x1f)) ); } break; case O_IP_DST: match = is_ipv4 && (((ipfw_insn_ip *)cmd)->addr.s_addr == dst_ip.s_addr); break; case O_IP_DST_ME: if (is_ipv4) { struct ifnet *tif; INADDR_TO_IFP(dst_ip, tif); match = (tif != NULL); break; } #ifdef INET6 /* FALLTHROUGH */ case O_IP6_DST_ME: match= is_ipv6 && search_ip6_addr_net(&args->f_id.dst_ip6); #endif break; case O_IP_SRCPORT: case O_IP_DSTPORT: /* * offset == 0 && proto != 0 is enough * to guarantee that we have a * packet with port info. */ if ((proto==IPPROTO_UDP || proto==IPPROTO_TCP) && offset == 0) { u_int16_t x = (cmd->opcode == O_IP_SRCPORT) ? src_port : dst_port ; u_int16_t *p = ((ipfw_insn_u16 *)cmd)->ports; int i; for (i = cmdlen - 1; !match && i>0; i--, p += 2) match = (x>=p[0] && x<=p[1]); } break; case O_ICMPTYPE: match = (offset == 0 && proto==IPPROTO_ICMP && icmptype_match(ICMP(ulp), (ipfw_insn_u32 *)cmd) ); break; #ifdef INET6 case O_ICMP6TYPE: match = is_ipv6 && offset == 0 && proto==IPPROTO_ICMPV6 && icmp6type_match( ICMP6(ulp)->icmp6_type, (ipfw_insn_u32 *)cmd); break; #endif /* INET6 */ case O_IPOPT: match = (is_ipv4 && ipopts_match(ip, cmd) ); break; case O_IPVER: match = (is_ipv4 && cmd->arg1 == ip->ip_v); break; case O_IPID: case O_IPLEN: case O_IPTTL: if (is_ipv4) { /* only for IP packets */ uint16_t x; uint16_t *p; int i; if (cmd->opcode == O_IPLEN) x = iplen; else if (cmd->opcode == O_IPTTL) x = ip->ip_ttl; else /* must be IPID */ x = ntohs(ip->ip_id); if (cmdlen == 1) { match = (cmd->arg1 == x); break; } /* otherwise we have ranges */ p = ((ipfw_insn_u16 *)cmd)->ports; i = cmdlen - 1; for (; !match && i>0; i--, p += 2) match = (x >= p[0] && x <= p[1]); } break; case O_IPPRECEDENCE: match = (is_ipv4 && (cmd->arg1 == (ip->ip_tos & 0xe0)) ); break; case O_IPTOS: match = (is_ipv4 && flags_match(cmd, ip->ip_tos)); break; case O_TCPDATALEN: if (proto == IPPROTO_TCP && offset == 0) { struct tcphdr *tcp; uint16_t x; uint16_t *p; int i; tcp = TCP(ulp); x = iplen - ((ip->ip_hl + tcp->th_off) << 2); if (cmdlen == 1) { match = (cmd->arg1 == x); break; } /* otherwise we have ranges */ p = ((ipfw_insn_u16 *)cmd)->ports; i = cmdlen - 1; for (; !match && i>0; i--, p += 2) match = (x >= p[0] && x <= p[1]); } break; case O_TCPFLAGS: match = (proto == IPPROTO_TCP && offset == 0 && flags_match(cmd, TCP(ulp)->th_flags)); break; case O_TCPOPTS: match = (proto == IPPROTO_TCP && offset == 0 && tcpopts_match(TCP(ulp), cmd)); break; case O_TCPSEQ: match = (proto == IPPROTO_TCP && offset == 0 && ((ipfw_insn_u32 *)cmd)->d[0] == TCP(ulp)->th_seq); break; case O_TCPACK: match = (proto == IPPROTO_TCP && offset == 0 && ((ipfw_insn_u32 *)cmd)->d[0] == TCP(ulp)->th_ack); break; case O_TCPWIN: match = (proto == IPPROTO_TCP && offset == 0 && cmd->arg1 == TCP(ulp)->th_win); break; case O_ESTAB: /* reject packets which have SYN only */ /* XXX should i also check for TH_ACK ? */ match = (proto == IPPROTO_TCP && offset == 0 && (TCP(ulp)->th_flags & (TH_RST | TH_ACK | TH_SYN)) != TH_SYN); break; case O_ALTQ: { struct pf_mtag *at; ipfw_insn_altq *altq = (ipfw_insn_altq *)cmd; match = 1; at = pf_find_mtag(m); if (at != NULL && at->qid != 0) break; at = pf_get_mtag(m); if (at == NULL) { /* * Let the packet fall back to the * default ALTQ. */ break; } at->qid = altq->qid; if (is_ipv4) at->af = AF_INET; else at->af = AF_LINK; at->hdr = ip; break; } case O_LOG: ipfw_log(f, hlen, args, m, oif, offset, tablearg, ip); match = 1; break; case O_PROB: match = (random()<((ipfw_insn_u32 *)cmd)->d[0]); break; case O_VERREVPATH: /* Outgoing packets automatically pass/match */ match = ((oif != NULL) || (m->m_pkthdr.rcvif == NULL) || ( #ifdef INET6 is_ipv6 ? verify_path6(&(args->f_id.src_ip6), m->m_pkthdr.rcvif) : #endif verify_path(src_ip, m->m_pkthdr.rcvif, args->f_id.fib))); break; case O_VERSRCREACH: /* Outgoing packets automatically pass/match */ match = (hlen > 0 && ((oif != NULL) || #ifdef INET6 is_ipv6 ? verify_path6(&(args->f_id.src_ip6), NULL) : #endif verify_path(src_ip, NULL, args->f_id.fib))); break; case O_ANTISPOOF: /* Outgoing packets automatically pass/match */ if (oif == NULL && hlen > 0 && ( (is_ipv4 && in_localaddr(src_ip)) #ifdef INET6 || (is_ipv6 && in6_localaddr(&(args->f_id.src_ip6))) #endif )) match = #ifdef INET6 is_ipv6 ? verify_path6( &(args->f_id.src_ip6), m->m_pkthdr.rcvif) : #endif verify_path(src_ip, m->m_pkthdr.rcvif, args->f_id.fib); else match = 1; break; case O_IPSEC: #ifdef IPSEC match = (m_tag_find(m, PACKET_TAG_IPSEC_IN_DONE, NULL) != NULL); #endif /* otherwise no match */ break; #ifdef INET6 case O_IP6_SRC: match = is_ipv6 && IN6_ARE_ADDR_EQUAL(&args->f_id.src_ip6, &((ipfw_insn_ip6 *)cmd)->addr6); break; case O_IP6_DST: match = is_ipv6 && IN6_ARE_ADDR_EQUAL(&args->f_id.dst_ip6, &((ipfw_insn_ip6 *)cmd)->addr6); break; case O_IP6_SRC_MASK: case O_IP6_DST_MASK: if (is_ipv6) { int i = cmdlen - 1; struct in6_addr p; struct in6_addr *d = &((ipfw_insn_ip6 *)cmd)->addr6; for (; !match && i > 0; d += 2, i -= F_INSN_SIZE(struct in6_addr) * 2) { p = (cmd->opcode == O_IP6_SRC_MASK) ? args->f_id.src_ip6: args->f_id.dst_ip6; APPLY_MASK(&p, &d[1]); match = IN6_ARE_ADDR_EQUAL(&d[0], &p); } } break; case O_FLOW6ID: match = is_ipv6 && flow6id_match(args->f_id.flow_id6, (ipfw_insn_u32 *) cmd); break; case O_EXT_HDR: match = is_ipv6 && (ext_hd & ((ipfw_insn *) cmd)->arg1); break; case O_IP6: match = is_ipv6; break; #endif case O_IP4: match = is_ipv4; break; case O_TAG: { struct m_tag *mtag; uint32_t tag = (cmd->arg1 == IP_FW_TABLEARG) ? tablearg : cmd->arg1; /* Packet is already tagged with this tag? */ mtag = m_tag_locate(m, MTAG_IPFW, tag, NULL); /* We have `untag' action when F_NOT flag is * present. And we must remove this mtag from * mbuf and reset `match' to zero (`match' will * be inversed later). * Otherwise we should allocate new mtag and * push it into mbuf. */ if (cmd->len & F_NOT) { /* `untag' action */ if (mtag != NULL) m_tag_delete(m, mtag); match = 0; } else if (mtag == NULL) { if ((mtag = m_tag_alloc(MTAG_IPFW, tag, 0, M_NOWAIT)) != NULL) m_tag_prepend(m, mtag); match = 1; } break; } case O_FIB: /* try match the specified fib */ if (args->f_id.fib == cmd->arg1) match = 1; break; case O_TAGGED: { struct m_tag *mtag; uint32_t tag = (cmd->arg1 == IP_FW_TABLEARG) ? tablearg : cmd->arg1; if (cmdlen == 1) { match = m_tag_locate(m, MTAG_IPFW, tag, NULL) != NULL; break; } /* we have ranges */ for (mtag = m_tag_first(m); mtag != NULL && !match; mtag = m_tag_next(m, mtag)) { uint16_t *p; int i; if (mtag->m_tag_cookie != MTAG_IPFW) continue; p = ((ipfw_insn_u16 *)cmd)->ports; i = cmdlen - 1; for(; !match && i > 0; i--, p += 2) match = mtag->m_tag_id >= p[0] && mtag->m_tag_id <= p[1]; } break; } /* * The second set of opcodes represents 'actions', * i.e. the terminal part of a rule once the packet * matches all previous patterns. * Typically there is only one action for each rule, * and the opcode is stored at the end of the rule * (but there are exceptions -- see below). * * In general, here we set retval and terminate the * outer loop (would be a 'break 3' in some language, * but we need to set l=0, done=1) * * Exceptions: * O_COUNT and O_SKIPTO actions: * instead of terminating, we jump to the next rule * (setting l=0), or to the SKIPTO target (setting * f/f_len, cmd and l as needed), respectively. * * O_TAG, O_LOG and O_ALTQ action parameters: * perform some action and set match = 1; * * O_LIMIT and O_KEEP_STATE: these opcodes are * not real 'actions', and are stored right * before the 'action' part of the rule. * These opcodes try to install an entry in the * state tables; if successful, we continue with * the next opcode (match=1; break;), otherwise * the packet must be dropped (set retval, * break loops with l=0, done=1) * * O_PROBE_STATE and O_CHECK_STATE: these opcodes * cause a lookup of the state table, and a jump * to the 'action' part of the parent rule * if an entry is found, or * (CHECK_STATE only) a jump to the next rule if * the entry is not found. * The result of the lookup is cached so that * further instances of these opcodes become NOPs. * The jump to the next rule is done by setting * l=0, cmdlen=0. */ case O_LIMIT: case O_KEEP_STATE: if (ipfw_install_state(f, (ipfw_insn_limit *)cmd, args, tablearg)) { /* error or limit violation */ retval = IP_FW_DENY; l = 0; /* exit inner loop */ done = 1; /* exit outer loop */ } match = 1; break; case O_PROBE_STATE: case O_CHECK_STATE: /* * dynamic rules are checked at the first * keep-state or check-state occurrence, * with the result being stored in dyn_dir. * The compiler introduces a PROBE_STATE * instruction for us when we have a * KEEP_STATE (because PROBE_STATE needs * to be run first). */ if (dyn_dir == MATCH_UNKNOWN && (q = ipfw_lookup_dyn_rule(&args->f_id, &dyn_dir, proto == IPPROTO_TCP ? TCP(ulp) : NULL)) != NULL) { /* * Found dynamic entry, update stats * and jump to the 'action' part of * the parent rule by setting * f, cmd, l and clearing cmdlen. */ q->pcnt++; q->bcnt += pktlen; /* XXX we would like to have f_pos * readily accessible in the dynamic * rule, instead of having to * lookup q->rule. */ f = q->rule; f_pos = ipfw_find_rule(chain, f->rulenum, f->id); cmd = ACTION_PTR(f); l = f->cmd_len - f->act_ofs; ipfw_dyn_unlock(); cmdlen = 0; match = 1; break; } /* * Dynamic entry not found. If CHECK_STATE, * skip to next rule, if PROBE_STATE just * ignore and continue with next opcode. */ if (cmd->opcode == O_CHECK_STATE) l = 0; /* exit inner loop */ match = 1; break; case O_ACCEPT: retval = 0; /* accept */ l = 0; /* exit inner loop */ done = 1; /* exit outer loop */ break; case O_PIPE: case O_QUEUE: set_match(args, f_pos, chain); args->rule.info = (cmd->arg1 == IP_FW_TABLEARG) ? tablearg : cmd->arg1; if (cmd->opcode == O_PIPE) args->rule.info |= IPFW_IS_PIPE; if (V_fw_one_pass) args->rule.info |= IPFW_ONEPASS; retval = IP_FW_DUMMYNET; l = 0; /* exit inner loop */ done = 1; /* exit outer loop */ break; case O_DIVERT: case O_TEE: if (args->eh) /* not on layer 2 */ break; /* otherwise this is terminal */ l = 0; /* exit inner loop */ done = 1; /* exit outer loop */ retval = (cmd->opcode == O_DIVERT) ? IP_FW_DIVERT : IP_FW_TEE; set_match(args, f_pos, chain); args->rule.info = (cmd->arg1 == IP_FW_TABLEARG) ? tablearg : cmd->arg1; break; case O_COUNT: f->pcnt++; /* update stats */ f->bcnt += pktlen; f->timestamp = time_uptime; l = 0; /* exit inner loop */ break; case O_SKIPTO: f->pcnt++; /* update stats */ f->bcnt += pktlen; f->timestamp = time_uptime; /* If possible use cached f_pos (in f->next_rule), * whose version is written in f->next_rule * (horrible hacks to avoid changing the ABI). */ if (cmd->arg1 != IP_FW_TABLEARG && (uintptr_t)f->x_next == chain->id) { f_pos = (uintptr_t)f->next_rule; } else { int i = (cmd->arg1 == IP_FW_TABLEARG) ? tablearg : cmd->arg1; /* make sure we do not jump backward */ if (i <= f->rulenum) i = f->rulenum + 1; f_pos = ipfw_find_rule(chain, i, 0); /* update the cache */ if (cmd->arg1 != IP_FW_TABLEARG) { f->next_rule = (void *)(uintptr_t)f_pos; f->x_next = (void *)(uintptr_t)chain->id; } } /* * Skip disabled rules, and re-enter * the inner loop with the correct * f_pos, f, l and cmd. * Also clear cmdlen and skip_or */ for (; f_pos < chain->n_rules - 1 && (V_set_disable & (1 << chain->map[f_pos]->set)); f_pos++) ; /* Re-enter the inner loop at the skipto rule. */ f = chain->map[f_pos]; l = f->cmd_len; cmd = f->cmd; match = 1; cmdlen = 0; skip_or = 0; continue; break; /* not reached */ case O_REJECT: /* * Drop the packet and send a reject notice * if the packet is not ICMP (or is an ICMP * query), and it is not multicast/broadcast. */ if (hlen > 0 && is_ipv4 && offset == 0 && (proto != IPPROTO_ICMP || is_icmp_query(ICMP(ulp))) && !(m->m_flags & (M_BCAST|M_MCAST)) && !IN_MULTICAST(ntohl(dst_ip.s_addr))) { send_reject(args, cmd->arg1, iplen, ip); m = args->m; } /* FALLTHROUGH */ #ifdef INET6 case O_UNREACH6: if (hlen > 0 && is_ipv6 && ((offset & IP6F_OFF_MASK) == 0) && (proto != IPPROTO_ICMPV6 || (is_icmp6_query(icmp6_type) == 1)) && !(m->m_flags & (M_BCAST|M_MCAST)) && !IN6_IS_ADDR_MULTICAST(&args->f_id.dst_ip6)) { send_reject6( args, cmd->arg1, hlen, (struct ip6_hdr *)ip); m = args->m; } /* FALLTHROUGH */ #endif case O_DENY: retval = IP_FW_DENY; l = 0; /* exit inner loop */ done = 1; /* exit outer loop */ break; case O_FORWARD_IP: if (args->eh) /* not valid on layer2 pkts */ break; if (!q || dyn_dir == MATCH_FORWARD) { struct sockaddr_in *sa; sa = &(((ipfw_insn_sa *)cmd)->sa); if (sa->sin_addr.s_addr == INADDR_ANY) { bcopy(sa, &args->hopstore, sizeof(*sa)); args->hopstore.sin_addr.s_addr = htonl(tablearg); args->next_hop = &args->hopstore; } else { args->next_hop = sa; } } retval = IP_FW_PASS; l = 0; /* exit inner loop */ done = 1; /* exit outer loop */ break; case O_NETGRAPH: case O_NGTEE: set_match(args, f_pos, chain); args->rule.info = (cmd->arg1 == IP_FW_TABLEARG) ? tablearg : cmd->arg1; if (V_fw_one_pass) args->rule.info |= IPFW_ONEPASS; retval = (cmd->opcode == O_NETGRAPH) ? IP_FW_NETGRAPH : IP_FW_NGTEE; l = 0; /* exit inner loop */ done = 1; /* exit outer loop */ break; case O_SETFIB: f->pcnt++; /* update stats */ f->bcnt += pktlen; f->timestamp = time_uptime; M_SETFIB(m, cmd->arg1); args->f_id.fib = cmd->arg1; l = 0; /* exit inner loop */ break; case O_NAT: if (!IPFW_NAT_LOADED) { retval = IP_FW_DENY; } else { struct cfg_nat *t; int nat_id; set_match(args, f_pos, chain); t = ((ipfw_insn_nat *)cmd)->nat; if (t == NULL) { nat_id = (cmd->arg1 == IP_FW_TABLEARG) ? tablearg : cmd->arg1; t = (*lookup_nat_ptr)(&chain->nat, nat_id); if (t == NULL) { retval = IP_FW_DENY; l = 0; /* exit inner loop */ done = 1; /* exit outer loop */ break; } if (cmd->arg1 != IP_FW_TABLEARG) ((ipfw_insn_nat *)cmd)->nat = t; } retval = ipfw_nat_ptr(args, t, m); } l = 0; /* exit inner loop */ done = 1; /* exit outer loop */ break; case O_REASS: { int ip_off; f->pcnt++; f->bcnt += pktlen; l = 0; /* in any case exit inner loop */ ip_off = ntohs(ip->ip_off); /* if not fragmented, go to next rule */ if ((ip_off & (IP_MF | IP_OFFMASK)) == 0) break; /* * ip_reass() expects len & off in host * byte order. */ SET_HOST_IPLEN(ip); args->m = m = ip_reass(m); /* * do IP header checksum fixup. */ if (m == NULL) { /* fragment got swallowed */ retval = IP_FW_DENY; } else { /* good, packet complete */ int hlen; ip = mtod(m, struct ip *); hlen = ip->ip_hl << 2; SET_NET_IPLEN(ip); ip->ip_sum = 0; if (hlen == sizeof(struct ip)) ip->ip_sum = in_cksum_hdr(ip); else ip->ip_sum = in_cksum(m, hlen); retval = IP_FW_REASS; set_match(args, f_pos, chain); } done = 1; /* exit outer loop */ break; } default: panic("-- unknown opcode %d\n", cmd->opcode); } /* end of switch() on opcodes */ /* * if we get here with l=0, then match is irrelevant. */ if (cmd->len & F_NOT) match = !match; if (match) { if (cmd->len & F_OR) skip_or = 1; } else { if (!(cmd->len & F_OR)) /* not an OR block, */ break; /* try next rule */ } } /* end of inner loop, scan opcodes */ if (done) break; /* next_rule:; */ /* try next rule */ } /* end of outer for, scan rules */ if (done) { struct ip_fw *rule = chain->map[f_pos]; /* Update statistics */ rule->pcnt++; rule->bcnt += pktlen; rule->timestamp = time_uptime; } else { retval = IP_FW_DENY; printf("ipfw: ouch!, skip past end of rules, denying packet\n"); } IPFW_RUNLOCK(chain); #ifdef __FreeBSD__ if (ucred_cache != NULL) crfree(ucred_cache); #endif return (retval); pullup_failed: if (V_fw_verbose) printf("ipfw: pullup failed\n"); return (IP_FW_DENY); } /* * Module and VNET glue */ /* * Stuff that must be initialised only on boot or module load */ static int ipfw_init(void) { int error = 0; ipfw_dyn_attach(); /* * Only print out this stuff the first time around, * when called from the sysinit code. */ printf("ipfw2 " #ifdef INET6 "(+ipv6) " #endif "initialized, divert %s, nat %s, " "rule-based forwarding " #ifdef IPFIREWALL_FORWARD "enabled, " #else "disabled, " #endif "default to %s, logging ", #ifdef IPDIVERT "enabled", #else "loadable", #endif #ifdef IPFIREWALL_NAT "enabled", #else "loadable", #endif default_to_accept ? "accept" : "deny"); /* * Note: V_xxx variables can be accessed here but the vnet specific * initializer may not have been called yet for the VIMAGE case. * Tuneables will have been processed. We will print out values for * the default vnet. * XXX This should all be rationalized AFTER 8.0 */ if (V_fw_verbose == 0) printf("disabled\n"); else if (V_verbose_limit == 0) printf("unlimited\n"); else printf("limited to %d packets/entry by default\n", V_verbose_limit); ipfw_log_bpf(1); /* init */ return (error); } /* * Called for the removal of the last instance only on module unload. */ static void ipfw_destroy(void) { ipfw_log_bpf(0); /* uninit */ ipfw_dyn_detach(); printf("IP firewall unloaded\n"); } /* * Stuff that must be initialized for every instance * (including the first of course). */ static int vnet_ipfw_init(const void *unused) { int error; struct ip_fw *rule = NULL; struct ip_fw_chain *chain; chain = &V_layer3_chain; /* First set up some values that are compile time options */ V_autoinc_step = 100; /* bounded to 1..1000 in add_rule() */ V_fw_deny_unknown_exthdrs = 1; #ifdef IPFIREWALL_VERBOSE V_fw_verbose = 1; #endif #ifdef IPFIREWALL_VERBOSE_LIMIT V_verbose_limit = IPFIREWALL_VERBOSE_LIMIT; #endif #ifdef IPFIREWALL_NAT LIST_INIT(&chain->nat); #endif /* insert the default rule and create the initial map */ chain->n_rules = 1; chain->static_len = sizeof(struct ip_fw); chain->map = malloc(sizeof(struct ip_fw *), M_IPFW, M_NOWAIT | M_ZERO); if (chain->map) rule = malloc(chain->static_len, M_IPFW, M_NOWAIT | M_ZERO); if (rule == NULL) { if (chain->map) free(chain->map, M_IPFW); printf("ipfw2: ENOSPC initializing default rule " "(support disabled)\n"); return (ENOSPC); } error = ipfw_init_tables(chain); if (error) { panic("init_tables"); /* XXX Marko fix this ! */ } /* fill and insert the default rule */ rule->act_ofs = 0; rule->rulenum = IPFW_DEFAULT_RULE; rule->cmd_len = 1; rule->set = RESVD_SET; rule->cmd[0].len = 1; rule->cmd[0].opcode = default_to_accept ? O_ACCEPT : O_DENY; chain->rules = chain->default_rule = chain->map[0] = rule; chain->id = rule->id = 1; IPFW_LOCK_INIT(chain); ipfw_dyn_init(); /* First set up some values that are compile time options */ V_ipfw_vnet_ready = 1; /* Open for business */ /* * Hook the sockopt handler, and the layer2 (V_ip_fw_chk_ptr) * and pfil hooks for ipv4 and ipv6. Even if the latter two fail * we still keep the module alive because the sockopt and * layer2 paths are still useful. * ipfw[6]_hook return 0 on success, ENOENT on failure, * so we can ignore the exact return value and just set a flag. * * Note that V_fw[6]_enable are manipulated by a SYSCTL_PROC so * changes in the underlying (per-vnet) variables trigger * immediate hook()/unhook() calls. * In layer2 we have the same behaviour, except that V_ether_ipfw * is checked on each packet because there are no pfil hooks. */ V_ip_fw_ctl_ptr = ipfw_ctl; V_ip_fw_chk_ptr = ipfw_chk; error = ipfw_attach_hooks(1); return (error); } /* * Called for the removal of each instance. */ static int vnet_ipfw_uninit(const void *unused) { struct ip_fw *reap, *rule; struct ip_fw_chain *chain = &V_layer3_chain; int i; V_ipfw_vnet_ready = 0; /* tell new callers to go away */ /* * disconnect from ipv4, ipv6, layer2 and sockopt. * Then grab, release and grab again the WLOCK so we make * sure the update is propagated and nobody will be in. */ (void)ipfw_attach_hooks(0 /* detach */); V_ip_fw_chk_ptr = NULL; V_ip_fw_ctl_ptr = NULL; IPFW_UH_WLOCK(chain); IPFW_UH_WUNLOCK(chain); IPFW_UH_WLOCK(chain); IPFW_WLOCK(chain); IPFW_WUNLOCK(chain); IPFW_WLOCK(chain); ipfw_dyn_uninit(0); /* run the callout_drain */ ipfw_destroy_tables(chain); reap = NULL; for (i = 0; i < chain->n_rules; i++) { rule = chain->map[i]; rule->x_next = reap; reap = rule; } if (chain->map) free(chain->map, M_IPFW); IPFW_WUNLOCK(chain); IPFW_UH_WUNLOCK(chain); if (reap != NULL) ipfw_reap_rules(reap); IPFW_LOCK_DESTROY(chain); ipfw_dyn_uninit(1); /* free the remaining parts */ return 0; } /* * Module event handler. * In general we have the choice of handling most of these events by the * event handler or by the (VNET_)SYS(UN)INIT handlers. I have chosen to * use the SYSINIT handlers as they are more capable of expressing the * flow of control during module and vnet operations, so this is just * a skeleton. Note there is no SYSINIT equivalent of the module * SHUTDOWN handler, but we don't have anything to do in that case anyhow. */ static int ipfw_modevent(module_t mod, int type, void *unused) { int err = 0; switch (type) { case MOD_LOAD: /* Called once at module load or * system boot if compiled in. */ break; case MOD_QUIESCE: /* Called before unload. May veto unloading. */ break; case MOD_UNLOAD: /* Called during unload. */ break; case MOD_SHUTDOWN: /* Called during system shutdown. */ break; default: err = EOPNOTSUPP; break; } return err; } static moduledata_t ipfwmod = { "ipfw", ipfw_modevent, 0 }; /* Define startup order. */ #define IPFW_SI_SUB_FIREWALL SI_SUB_PROTO_IFATTACHDOMAIN #define IPFW_MODEVENT_ORDER (SI_ORDER_ANY - 255) /* On boot slot in here. */ #define IPFW_MODULE_ORDER (IPFW_MODEVENT_ORDER + 1) /* A little later. */ #define IPFW_VNET_ORDER (IPFW_MODEVENT_ORDER + 2) /* Later still. */ DECLARE_MODULE(ipfw, ipfwmod, IPFW_SI_SUB_FIREWALL, IPFW_MODEVENT_ORDER); MODULE_VERSION(ipfw, 2); /* should declare some dependencies here */ /* * Starting up. Done in order after ipfwmod() has been called. * VNET_SYSINIT is also called for each existing vnet and each new vnet. */ SYSINIT(ipfw_init, IPFW_SI_SUB_FIREWALL, IPFW_MODULE_ORDER, ipfw_init, NULL); VNET_SYSINIT(vnet_ipfw_init, IPFW_SI_SUB_FIREWALL, IPFW_VNET_ORDER, vnet_ipfw_init, NULL); /* * Closing up shop. These are done in REVERSE ORDER, but still * after ipfwmod() has been called. Not called on reboot. * VNET_SYSUNINIT is also called for each exiting vnet as it exits. * or when the module is unloaded. */ SYSUNINIT(ipfw_destroy, IPFW_SI_SUB_FIREWALL, IPFW_MODULE_ORDER, ipfw_destroy, NULL); VNET_SYSUNINIT(vnet_ipfw_uninit, IPFW_SI_SUB_FIREWALL, IPFW_VNET_ORDER, vnet_ipfw_uninit, NULL); /* end of file */ ipfw3-2012/sys/netinet/ipfw/ip_dn_private.h000644 000423 000000 00000033223 12006744011 021151 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 2010 Luigi Rizzo, Riccardo Panicucci, Universita` di Pisa * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * internal dummynet APIs. * * $FreeBSD: head/sys/netinet/ipfw/ip_dn_private.h 204591 2010-03-02 17:40:48Z luigi $ */ #ifndef _IP_DN_PRIVATE_H #define _IP_DN_PRIVATE_H /* debugging support * use ND() to remove debugging, D() to print a line, * DX(level, ...) to print above a certain level * If you redefine D() you are expected to redefine all. */ #ifndef D #define ND(fmt, ...) do {} while (0) #define D1(fmt, ...) do {} while (0) #define D(fmt, ...) printf("%-10s " fmt "\n", \ __FUNCTION__, ## __VA_ARGS__) #define DX(lev, fmt, ...) do { \ if (dn_cfg.debug > lev) D(fmt, ## __VA_ARGS__); } while (0) #endif MALLOC_DECLARE(M_DUMMYNET); #ifndef __linux__ #define div64(a, b) ((int64_t)(a) / (int64_t)(b)) #endif #define DN_LOCK_INIT() do { \ mtx_init(&dn_cfg.uh_mtx, "dn_uh", NULL, MTX_DEF); \ mtx_init(&dn_cfg.bh_mtx, "dn_bh", NULL, MTX_DEF); \ } while (0) #define DN_LOCK_DESTROY() do { \ mtx_destroy(&dn_cfg.uh_mtx); \ mtx_destroy(&dn_cfg.bh_mtx); \ } while (0) #if 0 /* not used yet */ #define DN_UH_RLOCK() mtx_lock(&dn_cfg.uh_mtx) #define DN_UH_RUNLOCK() mtx_unlock(&dn_cfg.uh_mtx) #define DN_UH_WLOCK() mtx_lock(&dn_cfg.uh_mtx) #define DN_UH_WUNLOCK() mtx_unlock(&dn_cfg.uh_mtx) #define DN_UH_LOCK_ASSERT() mtx_assert(&dn_cfg.uh_mtx, MA_OWNED) #endif #define DN_BH_RLOCK() mtx_lock(&dn_cfg.uh_mtx) #define DN_BH_RUNLOCK() mtx_unlock(&dn_cfg.uh_mtx) #define DN_BH_WLOCK() mtx_lock(&dn_cfg.uh_mtx) #define DN_BH_WUNLOCK() mtx_unlock(&dn_cfg.uh_mtx) #define DN_BH_LOCK_ASSERT() mtx_assert(&dn_cfg.uh_mtx, MA_OWNED) SLIST_HEAD(dn_schk_head, dn_schk); SLIST_HEAD(dn_sch_inst_head, dn_sch_inst); SLIST_HEAD(dn_fsk_head, dn_fsk); SLIST_HEAD(dn_queue_head, dn_queue); SLIST_HEAD(dn_alg_head, dn_alg); struct mq { /* a basic queue of packets*/ struct mbuf *head, *tail; }; static inline void set_oid(struct dn_id *o, int type, int len) { o->type = type; o->len = len; o->subtype = 0; }; uint64_t readTSC (void); /* * see if tsc (ot other timer) is supported. * - FreeBSD has rdtsc macro for i386 and amd64 * - Linux has rdtscll and/or rdtsc (also for openWRT patched kernel source) * - Windows has KeQueryPerformanceCounter() function that use tsc or other * timer */ #if defined(rdtscll) || defined(rdtsc) || defined(_WIN32) #define HAVE_TSC #endif /* * configuration and global data for a dummynet instance * * When a configuration is modified from userland, 'id' is incremented * so we can use the value to check for stale pointers. */ struct dn_parms { uint32_t id; /* configuration version */ /* defaults (sysctl-accessible) */ int red_lookup_depth; int red_avg_pkt_size; int red_max_pkt_size; int hash_size; int max_hash_size; long byte_limit; /* max queue sizes */ long slot_limit; int io_fast; int debug; /* timekeeping */ struct timeval prev_t; /* last time dummynet_tick ran */ struct dn_heap evheap; /* scheduled events */ /* counters of objects -- used for reporting space */ int schk_count; int si_count; int fsk_count; int queue_count; /* ticks and other stuff */ uint64_t curr_time; /* in ticks */ /* * Variables to manage the time spent in the drain routines. * max_drain is max the fraction of a tick (0..100) to be used * for draining. * We also need some variables to store the average number of * timecounter ticks between calls to the periodic task, etc. */ int drain_ratio; uint64_t cycle_task_new; /* TSC when dummynet_task() starts */ uint64_t cycle_task_old; /* TSC when prev. dummynet_task() starts */ uint64_t cycle_task; uint64_t cycle_task_avg; /* Moving average of cicle_task */ /* flowsets and schedulers are in hash tables, with 'hash_size' * buckets. fshash is looked up at every packet arrival * so better be generous if we expect many entries. */ struct dn_ht *fshash; struct dn_ht *schedhash; /* list of flowsets without a scheduler -- use sch_chain */ struct dn_fsk_head fsu; /* list of unlinked flowsets */ struct dn_alg_head schedlist; /* list of algorithms */ /* Counter of idle objects -- used by drain routine * We scan when idle_queue (or idle_si) > expire_object. * The drain routine is called every 'expire' cycles (the counter * used is expire_cycle). * We can disable the expire routine by setting expire to 0. * An object is kept alive for at least object_idle_tick after it * becomes idle. During the scan, we count the number of objects * that are idle but not ready in 'idle_si_wait' and 'idle_queue_wait' */ int idle_queue; int idle_queue_wait; /* idle but not expired yet */ int idle_si; int idle_si_wait; /* idle but not expired yet */ uint32_t expire_object; /* threshold for expires */ uint32_t expire; /* how often to expire */ uint32_t expire_cycle; uint32_t object_idle_tick; /* lifetime of objs */ uint32_t expire_object_examined; /* Burst of object examined */ /* drain_fs and drain_sch point to the next bucket to scan when * draining. */ uint32_t drain_fs; uint32_t drain_sch; int init_done; /* if the upper half is busy doing something long, * can set the busy flag and we will enqueue packets in * a queue for later processing. */ int busy; struct mq pending; #ifdef _KERNEL /* * This file is normally used in the kernel, unless we do * some userland tests, in which case we do not need a mtx. * uh_mtx arbitrates between system calls and also * protects fshash, schedhash and fsunlinked. * These structures are readonly for the lower half. * bh_mtx protects all other structures which may be * modified upon packet arrivals */ #if defined( __linux__ ) || defined( _WIN32 ) spinlock_t uh_mtx; spinlock_t bh_mtx; #else struct mtx uh_mtx; struct mtx bh_mtx; #endif #endif /* _KERNEL */ }; /* * Delay line, contains all packets on output from a link. * Every scheduler instance has one. */ struct delay_line { struct dn_id oid; struct dn_sch_inst *si; struct mq mq; }; /* * The kernel side of a flowset. It is linked in a hash table * of flowsets, and in a list of children of their parent scheduler. * qht is either the queue or (if HAVE_MASK) a hash table queues. * Note that the mask to use is the (flow_mask|sched_mask), which * changes as we attach/detach schedulers. So we store it here. * * XXX If we want to add scheduler-specific parameters, we need to * put them in external storage because the scheduler may not be * available when the fsk is created. */ struct dn_fsk { /* kernel side of a flowset */ struct dn_fs fs; SLIST_ENTRY(dn_fsk) fsk_next; /* hash chain for fshash */ struct ipfw_flow_id fsk_mask; /* qht is a hash table of queues, or just a single queue * a bit in fs.flags tells us which one */ struct dn_ht *qht; struct dn_schk *sched; /* Sched we are linked to */ SLIST_ENTRY(dn_fsk) sch_chain; /* list of fsk attached to sched */ /* bucket index used by drain routine to drain queues for this * flowset */ int drain_bucket; /* Parameter realted to RED / GRED */ /* original values are in dn_fs*/ int w_q ; /* queue weight (scaled) */ int max_th ; /* maximum threshold for queue (scaled) */ int min_th ; /* minimum threshold for queue (scaled) */ int max_p ; /* maximum value for p_b (scaled) */ u_int c_1 ; /* max_p/(max_th-min_th) (scaled) */ u_int c_2 ; /* max_p*min_th/(max_th-min_th) (scaled) */ u_int c_3 ; /* for GRED, (1-max_p)/max_th (scaled) */ u_int c_4 ; /* for GRED, 1 - 2*max_p (scaled) */ u_int * w_q_lookup ; /* lookup table for computing (1-w_q)^t */ u_int lookup_depth ; /* depth of lookup table */ int lookup_step ; /* granularity inside the lookup table */ int lookup_weight ; /* equal to (1-w_q)^t / (1-w_q)^(t+1) */ int avg_pkt_size ; /* medium packet size */ int max_pkt_size ; /* max packet size */ }; /* * A queue is created as a child of a flowset unless it belongs to * a !MULTIQUEUE scheduler. It is normally in a hash table in the * flowset. fs always points to the parent flowset. * si normally points to the sch_inst, unless the flowset has been * detached from the scheduler -- in this case si == NULL and we * should not enqueue. */ struct dn_queue { struct dn_flow ni; /* oid, flow_id, stats */ struct mq mq; /* packets queue */ struct dn_sch_inst *_si; /* owner scheduler instance */ SLIST_ENTRY(dn_queue) q_next; /* hash chain list for qht */ struct dn_fsk *fs; /* parent flowset. */ /* RED parameters */ int avg; /* average queue length est. (scaled) */ int count; /* arrivals since last RED drop */ int random; /* random value (scaled) */ uint64_t q_time; /* start of queue idle time */ }; /* * The kernel side of a scheduler. Contains the userland config, * a link, pointer to extra config arguments from command line, * kernel flags, and a pointer to the scheduler methods. * It is stored in a hash table, and holds a list of all * flowsets and scheduler instances. * XXX sch must be at the beginning, see schk_hash(). */ struct dn_schk { struct dn_sch sch; struct dn_alg *fp; /* Pointer to scheduler functions */ struct dn_link link; /* The link, embedded */ struct dn_profile *profile; /* delay profile, if any */ struct dn_id *cfg; /* extra config arguments */ SLIST_ENTRY(dn_schk) schk_next; /* hash chain for schedhash */ struct dn_fsk_head fsk_list; /* all fsk linked to me */ struct dn_fsk *fs; /* Flowset for !MULTIQUEUE */ /* bucket index used by the drain routine to drain the scheduler * instance for this flowset. */ int drain_bucket; /* Hash table of all instances (through sch.sched_mask) * or single instance if no mask. Always valid. */ struct dn_ht *siht; }; /* * Scheduler instance. * Contains variables and all queues relative to a this instance. * This struct is created a runtime. */ struct dn_sch_inst { struct dn_flow ni; /* oid, flowid and stats */ SLIST_ENTRY(dn_sch_inst) si_next; /* hash chain for siht */ struct delay_line dline; struct dn_schk *sched; /* the template */ int kflags; /* DN_ACTIVE */ int64_t credit; /* bits I can transmit (more or less). */ uint64_t sched_time; /* time link was scheduled in ready_heap */ uint64_t idle_time; /* start of scheduler instance idle time */ /* q_count is the number of queues that this instance is using. * The counter is incremented or decremented when * a reference from the queue is created or deleted. * It is used to make sure that a scheduler instance can be safely * deleted by the drain routine. */ int q_count; }; /* kernel-side flags. Linux has DN_DELETE in fcntl.h */ enum { /* 1 and 2 are reserved for the SCAN flags */ DN_DESTROY = 0x0004, /* destroy */ DN_DELETE_FS = 0x0008, /* destroy flowset */ DN_DETACH = 0x0010, DN_ACTIVE = 0x0020, /* object is in evheap */ DN_F_DLINE = 0x0040, /* object is a delay line */ DN_DEL_SAFE = 0x0080, /* delete a queue only if no longer needed * by scheduler */ DN_QHT_IS_Q = 0x0100, /* in flowset, qht is a single queue */ }; extern struct dn_parms dn_cfg; //VNET_DECLARE(struct dn_parms, _base_dn_cfg); //#define dn_cfg VNET(_base_dn_cfg) int dummynet_io(struct mbuf **, int , struct ip_fw_args *); void dummynet_task(void *context, int pending); void dn_reschedule(void); struct dn_queue *ipdn_q_find(struct dn_fsk *, struct ipfw_flow_id *); struct dn_sch_inst *ipdn_si_find(struct dn_schk *, struct ipfw_flow_id *); /* * copy_range is a template for requests for ranges of pipes/queues/scheds. * The number of ranges is variable and can be derived by o.len. * As a default, we use a small number of entries so that the struct * fits easily on the stack and is sufficient for most common requests. */ #define DEFAULT_RANGES 5 struct copy_range { struct dn_id o; uint32_t r[ 2 * DEFAULT_RANGES ]; }; struct copy_args { char **start; char *end; int flags; int type; struct copy_range *extra; /* extra filtering */ }; struct sockopt; int ip_dummynet_compat(struct sockopt *sopt); int dummynet_get(struct sockopt *sopt, void **compat); int dn_c_copy_q (void *_ni, void *arg); int dn_c_copy_pipe(struct dn_schk *s, struct copy_args *a, int nq); int dn_c_copy_fs(struct dn_fsk *f, struct copy_args *a, int nq); int dn_compat_copy_queue(struct copy_args *a, void *_o); int dn_compat_copy_pipe(struct copy_args *a, void *_o); int copy_data_helper_compat(void *_o, void *_arg); int dn_compat_calc_size(void); int do_config(void *p, int l); /* function to drain idle object */ void dn_drain_scheduler(void); void dn_drain_queue(void); #endif /* _IP_DN_PRIVATE_H */ ipfw3-2012/sys/netinet/ipfw/ip_dummynet.c000644 000423 000000 00000173261 12010146035 020657 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 1998-2002,2010 Luigi Rizzo, Universita` di Pisa * Portions Copyright (c) 2000 Akamba Corp. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include __FBSDID("$FreeBSD: user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dummynet.c 203340 2010-02-01 12:06:37Z luigi $"); /* * Configuration and internal object management for dummynet. */ #include "opt_inet6.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* IFNAMSIZ, struct ifaddr, ifq head, lock.h mutex.h */ #include #include /* ip_output(), IP_FORWARDING */ #include #include #include #include #include #include /* which objects to copy */ #define DN_C_LINK 0x01 #define DN_C_SCH 0x02 #define DN_C_FLOW 0x04 #define DN_C_FS 0x08 #define DN_C_QUEUE 0x10 /* we use this argument in case of a schk_new */ struct schk_new_arg { struct dn_alg *fp; struct dn_sch *sch; }; /*---- callout hooks. ----*/ static struct callout dn_timeout; static struct task dn_task; static struct taskqueue *dn_tq = NULL; /* dummynet and ipfw_tick can't be static in windows */ void dummynet(void * arg) { (void)arg; /* UNUSED */ taskqueue_enqueue(dn_tq, &dn_task); } void dn_reschedule(void) { callout_reset_on(&dn_timeout, 1, dummynet, NULL, 0); } /*----- end of callout hooks -----*/ /* Return a scheduler descriptor given the type or name. */ static struct dn_alg * find_sched_type(int type, char *name) { struct dn_alg *d; SLIST_FOREACH(d, &dn_cfg.schedlist, next) { if (d->type == type || (name && !strcmp(d->name, name))) return d; } return NULL; /* not found */ } int ipdn_bound_var(int *v, int dflt, int lo, int hi, const char *msg) { int oldv = *v; const char *op = NULL; if (oldv < lo) { *v = dflt; op = "Bump"; } else if (oldv > hi) { *v = hi; op = "Clamp"; } else return *v; if (op && msg) printf("%s %s to %d (was %d)\n", op, msg, *v, oldv); return *v; } /*---- flow_id mask, hash and compare functions ---*/ /* * The flow_id includes the 5-tuple, the queue/pipe number * which we store in the extra area in host order, * and for ipv6 also the flow_id6. * XXX see if we want the tos byte (can store in 'flags') */ static struct ipfw_flow_id * flow_id_mask(struct ipfw_flow_id *mask, struct ipfw_flow_id *id) { int is_v6 = IS_IP6_FLOW_ID(id); id->dst_port &= mask->dst_port; id->src_port &= mask->src_port; id->proto &= mask->proto; id->extra &= mask->extra; if (is_v6) { APPLY_MASK(&id->dst_ip6, &mask->dst_ip6); APPLY_MASK(&id->src_ip6, &mask->src_ip6); id->flow_id6 &= mask->flow_id6; } else { id->dst_ip &= mask->dst_ip; id->src_ip &= mask->src_ip; } return id; } /* computes an OR of two masks, result in dst and also returned */ static struct ipfw_flow_id * flow_id_or(struct ipfw_flow_id *src, struct ipfw_flow_id *dst) { int is_v6 = IS_IP6_FLOW_ID(dst); dst->dst_port |= src->dst_port; dst->src_port |= src->src_port; dst->proto |= src->proto; dst->extra |= src->extra; if (is_v6) { #define OR_MASK(_d, _s) \ (_d)->__u6_addr.__u6_addr32[0] |= (_s)->__u6_addr.__u6_addr32[0]; \ (_d)->__u6_addr.__u6_addr32[1] |= (_s)->__u6_addr.__u6_addr32[1]; \ (_d)->__u6_addr.__u6_addr32[2] |= (_s)->__u6_addr.__u6_addr32[2]; \ (_d)->__u6_addr.__u6_addr32[3] |= (_s)->__u6_addr.__u6_addr32[3]; OR_MASK(&dst->dst_ip6, &src->dst_ip6); OR_MASK(&dst->src_ip6, &src->src_ip6); #undef OR_MASK dst->flow_id6 |= src->flow_id6; } else { dst->dst_ip |= src->dst_ip; dst->src_ip |= src->src_ip; } return dst; } static int nonzero_mask(struct ipfw_flow_id *m) { if (m->dst_port || m->src_port || m->proto || m->extra) return 1; if (IS_IP6_FLOW_ID(m)) { return m->dst_ip6.__u6_addr.__u6_addr32[0] || m->dst_ip6.__u6_addr.__u6_addr32[1] || m->dst_ip6.__u6_addr.__u6_addr32[2] || m->dst_ip6.__u6_addr.__u6_addr32[3] || m->src_ip6.__u6_addr.__u6_addr32[0] || m->src_ip6.__u6_addr.__u6_addr32[1] || m->src_ip6.__u6_addr.__u6_addr32[2] || m->src_ip6.__u6_addr.__u6_addr32[3] || m->flow_id6; } else { return m->dst_ip || m->src_ip; } } /* XXX we may want a better hash function */ static uint32_t flow_id_hash(struct ipfw_flow_id *id) { uint32_t i; if (IS_IP6_FLOW_ID(id)) { uint32_t *d = (uint32_t *)&id->dst_ip6; uint32_t *s = (uint32_t *)&id->src_ip6; i = (d[0] ) ^ (d[1]) ^ (d[2] ) ^ (d[3]) ^ (d[0] >> 15) ^ (d[1] >> 15) ^ (d[2] >> 15) ^ (d[3] >> 15) ^ (s[0] << 1) ^ (s[1] << 1) ^ (s[2] << 1) ^ (s[3] << 1) ^ (s[0] << 16) ^ (s[1] << 16) ^ (s[2] << 16) ^ (s[3] << 16) ^ (id->dst_port << 1) ^ (id->src_port) ^ (id->extra) ^ (id->proto ) ^ (id->flow_id6); } else { i = (id->dst_ip) ^ (id->dst_ip >> 15) ^ (id->src_ip << 1) ^ (id->src_ip >> 16) ^ (id->extra) ^ (id->dst_port << 1) ^ (id->src_port) ^ (id->proto); } return i; } /* Like bcmp, returns 0 if ids match, 1 otherwise. */ static int flow_id_cmp(struct ipfw_flow_id *id1, struct ipfw_flow_id *id2) { int is_v6 = IS_IP6_FLOW_ID(id1); if (!is_v6) { if (IS_IP6_FLOW_ID(id2)) return 1; /* different address families */ return (id1->dst_ip == id2->dst_ip && id1->src_ip == id2->src_ip && id1->dst_port == id2->dst_port && id1->src_port == id2->src_port && id1->proto == id2->proto && id1->extra == id2->extra) ? 0 : 1; } /* the ipv6 case */ return ( !bcmp(&id1->dst_ip6,&id2->dst_ip6, sizeof(id1->dst_ip6)) && !bcmp(&id1->src_ip6,&id2->src_ip6, sizeof(id1->src_ip6)) && id1->dst_port == id2->dst_port && id1->src_port == id2->src_port && id1->proto == id2->proto && id1->extra == id2->extra && id1->flow_id6 == id2->flow_id6) ? 0 : 1; } /*--------- end of flow-id mask, hash and compare ---------*/ /*--- support functions for the qht hashtable ---- * Entries are hashed by flow-id */ static uint32_t q_hash(uintptr_t key, int flags, void *arg) { /* compute the hash slot from the flow id */ struct ipfw_flow_id *id = (flags & DNHT_KEY_IS_OBJ) ? &((struct dn_queue *)key)->ni.fid : (struct ipfw_flow_id *)key; return flow_id_hash(id); } static int q_match(void *obj, uintptr_t key, int flags, void *arg) { struct dn_queue *o = (struct dn_queue *)obj; struct ipfw_flow_id *id2; if (flags & DNHT_KEY_IS_OBJ) { /* compare pointers */ id2 = &((struct dn_queue *)key)->ni.fid; } else { id2 = (struct ipfw_flow_id *)key; } return (0 == flow_id_cmp(&o->ni.fid, id2)); } /* * create a new queue instance for the given 'key'. */ static void * q_new(uintptr_t key, int flags, void *arg) { struct dn_queue *q, *template = arg; struct dn_fsk *fs = template->fs; int size = sizeof(*q) + fs->sched->fp->q_datalen; q = malloc(size, M_DUMMYNET, M_NOWAIT | M_ZERO); if (q == NULL) { D("no memory for new queue"); return NULL; } set_oid(&q->ni.oid, DN_QUEUE, size); if (fs->fs.flags & DN_QHT_HASH) q->ni.fid = *(struct ipfw_flow_id *)key; q->fs = fs; q->_si = ipdn_si_find(q->fs->sched, &(template->ni.fid)); if (q->_si == NULL) { D("no memory for new si"); free (q, M_DUMMYNET); return NULL; } q->_si->q_count++; if (fs->sched->fp->new_queue) fs->sched->fp->new_queue(q); dn_cfg.queue_count++; dn_cfg.idle_queue++; return q; } /* * Notify schedulers that a queue is going away. * If (flags & DN_DESTROY), also free the packets. * The version for callbacks is called q_delete_cb(). * Returns 1 if the queue is NOT deleted (usually when * the drain routine try to delete a queue that a scheduler * instance needs), 0 otherwise. * NOTE: flag DN_DEL_SAFE means that the queue should be * deleted only if the scheduler no longer needs it */ static int dn_delete_queue(struct dn_queue *q, int flags) { struct dn_fsk *fs = q->fs; // D("fs %p si %p\n", fs, q->_si); /* notify the parent scheduler that the queue is going away */ if (fs && fs->sched->fp->free_queue) if (fs->sched->fp->free_queue(q, flags & DN_DEL_SAFE) == 1) return 1; /* queue NOT deleted */ q->_si->q_count--; q->_si = NULL; if (flags & DN_DESTROY) { if (q->mq.head) dn_free_pkts(q->mq.head); else dn_cfg.idle_queue--; bzero(q, sizeof(*q)); // safety free(q, M_DUMMYNET); dn_cfg.queue_count--; } return 0; } static int q_delete_cb(void *q, void *arg) { int flags = (int)(uintptr_t)arg; dn_delete_queue(q, flags); return (flags & DN_DESTROY) ? DNHT_SCAN_DEL : 0; } /* * calls dn_delete_queue/q_delete_cb on all queues, * which notifies the parent scheduler and possibly drains packets. * flags & DN_DESTROY: drains queues and destroy qht; */ static void qht_delete(struct dn_fsk *fs, int flags) { ND("fs %d start flags %d qht %p", fs->fs.fs_nr, flags, fs->qht); if (!fs->qht) return; if (fs->fs.flags & DN_QHT_HASH) { dn_ht_scan(fs->qht, q_delete_cb, (void *)(uintptr_t)flags); if (flags & DN_DESTROY) { dn_ht_free(fs->qht, 0); fs->qht = NULL; } } else { dn_delete_queue((struct dn_queue *)(fs->qht), flags); if (flags & DN_DESTROY) fs->qht = NULL; } } /* * Find and possibly create the queue for a MULTIQUEUE scheduler. * We never call it for !MULTIQUEUE (the queue is in the sch_inst). */ struct dn_queue * ipdn_q_find(struct dn_fsk *fs, struct ipfw_flow_id *id) { struct dn_queue template; template.fs = fs; if (fs->fs.flags & DN_QHT_HASH) { struct ipfw_flow_id masked_id; if (fs->qht == NULL) { fs->qht = dn_ht_init(NULL, fs->fs.buckets, offsetof(struct dn_queue, q_next), q_hash, q_match, q_new); if (fs->qht == NULL) return NULL; } masked_id = *id; flow_id_mask(&fs->fsk_mask, &masked_id); return dn_ht_find(fs->qht, (uintptr_t)&masked_id, DNHT_INSERT, &template); } else { if (fs->qht == NULL) fs->qht = q_new(0, 0, &template); return (struct dn_queue *)fs->qht; } } /*--- end of queue hash table ---*/ /*--- support functions for the sch_inst hashtable ---- * * These are hashed by flow-id */ static uint32_t si_hash(uintptr_t key, int flags, void *arg) { /* compute the hash slot from the flow id */ struct ipfw_flow_id *id = (flags & DNHT_KEY_IS_OBJ) ? &((struct dn_sch_inst *)key)->ni.fid : (struct ipfw_flow_id *)key; return flow_id_hash(id); } static int si_match(void *obj, uintptr_t key, int flags, void *arg) { struct dn_sch_inst *o = obj; struct ipfw_flow_id *id2; id2 = (flags & DNHT_KEY_IS_OBJ) ? &((struct dn_sch_inst *)key)->ni.fid : (struct ipfw_flow_id *)key; return flow_id_cmp(&o->ni.fid, id2) == 0; } static int si_reset_credit(void *_si, void *arg); // XXX si_new use this /* * create a new instance for the given 'key' * Allocate memory for instance, delay line and scheduler private data. */ static void * si_new(uintptr_t key, int flags, void *arg) { struct dn_schk *s = arg; struct dn_sch_inst *si; int l = sizeof(*si) + s->fp->si_datalen; si = malloc(l, M_DUMMYNET, M_NOWAIT | M_ZERO); if (si == NULL) goto error; /* Set length only for the part passed up to userland. */ set_oid(&si->ni.oid, DN_SCH_I, sizeof(struct dn_flow)); set_oid(&(si->dline.oid), DN_DELAY_LINE, sizeof(struct delay_line)); /* mark si and dline as outside the event queue */ si->ni.oid.id = si->dline.oid.id = -1; si->sched = s; si->dline.si = si; if (s->fp->new_sched && s->fp->new_sched(si)) { D("new_sched error"); goto error; } if (s->sch.flags & DN_HAVE_MASK) si->ni.fid = *(struct ipfw_flow_id *)key; si_reset_credit(si, NULL); dn_cfg.si_count++; dn_cfg.idle_si++; return si; error: if (si) { bzero(si, sizeof(*si)); // safety free(si, M_DUMMYNET); } return NULL; } /* * Callback from siht to delete all scheduler instances. Remove * si and delay line from the system heap, destroy all queues. * We assume that all flowset have been notified and do not * point to us anymore. */ static int si_destroy(void *_si, void *arg) { struct dn_sch_inst *si = _si; struct dn_schk *s = si->sched; struct delay_line *dl = &si->dline; if (dl->oid.subtype) /* remove delay line from event heap */ heap_extract(&dn_cfg.evheap, dl); if (si->ni.length == 0) dn_cfg.idle_si--; dn_free_pkts(dl->mq.head); /* drain delay line */ if (si->kflags & DN_ACTIVE) /* remove si from event heap */ heap_extract(&dn_cfg.evheap, si); if (s->fp->free_sched) s->fp->free_sched(si); bzero(si, sizeof(*si)); /* safety */ free(si, M_DUMMYNET); dn_cfg.si_count--; return DNHT_SCAN_DEL; } /* * Find the scheduler instance for this packet. If we need to apply * a mask, do on a local copy of the flow_id to preserve the original. * Assume siht is always initialized if we have a mask. */ struct dn_sch_inst * ipdn_si_find(struct dn_schk *s, struct ipfw_flow_id *id) { if (s->sch.flags & DN_HAVE_MASK) { struct ipfw_flow_id id_t = *id; flow_id_mask(&s->sch.sched_mask, &id_t); return dn_ht_find(s->siht, (uintptr_t)&id_t, DNHT_INSERT, s); } if (!s->siht) s->siht = si_new(0, 0, s); return (struct dn_sch_inst *)s->siht; } /* callback to flush credit for the scheduler instance */ static int si_reset_credit(void *_si, void *arg) { struct dn_sch_inst *si = _si; struct dn_link *p = &si->sched->link; si->idle_time = dn_cfg.curr_time; si->credit = p->burst + (dn_cfg.io_fast ? p->bandwidth : 0); return 0; } static void schk_reset_credit(struct dn_schk *s) { if (s->sch.flags & DN_HAVE_MASK) dn_ht_scan(s->siht, si_reset_credit, NULL); else if (s->siht) si_reset_credit(s->siht, NULL); } /*---- end of sch_inst hashtable ---------------------*/ /*------------------------------------------------------- * flowset hash (fshash) support. Entries are hashed by fs_nr. * New allocations are put in the fsunlinked list, from which * they are removed when they point to a specific scheduler. */ static uint32_t fsk_hash(uintptr_t key, int flags, void *arg) { uint32_t i = !(flags & DNHT_KEY_IS_OBJ) ? key : ((struct dn_fsk *)key)->fs.fs_nr; return ( (i>>8)^(i>>4)^i ); } static int fsk_match(void *obj, uintptr_t key, int flags, void *arg) { struct dn_fsk *fs = obj; int i = !(flags & DNHT_KEY_IS_OBJ) ? key : ((struct dn_fsk *)key)->fs.fs_nr; return (fs->fs.fs_nr == i); } static void * fsk_new(uintptr_t key, int flags, void *arg) { struct dn_fsk *fs; fs = malloc(sizeof(*fs), M_DUMMYNET, M_NOWAIT | M_ZERO); if (fs) { set_oid(&fs->fs.oid, DN_FS, sizeof(fs->fs)); dn_cfg.fsk_count++; fs->drain_bucket = 0; SLIST_INSERT_HEAD(&dn_cfg.fsu, fs, sch_chain); } return fs; } /* * detach flowset from its current scheduler. Flags as follows: * DN_DETACH removes from the fsk_list * DN_DESTROY deletes individual queues * DN_DELETE_FS destroys the flowset (otherwise goes in unlinked). */ static void fsk_detach(struct dn_fsk *fs, int flags) { if (flags & DN_DELETE_FS) flags |= DN_DESTROY; ND("fs %d from sched %d flags %s %s %s", fs->fs.fs_nr, fs->fs.sched_nr, (flags & DN_DELETE_FS) ? "DEL_FS":"", (flags & DN_DESTROY) ? "DEL":"", (flags & DN_DETACH) ? "DET":""); if (flags & DN_DETACH) { /* detach from the list */ struct dn_fsk_head *h; h = fs->sched ? &fs->sched->fsk_list : &dn_cfg.fsu; SLIST_REMOVE(h, fs, dn_fsk, sch_chain); } /* Free the RED parameters, they will be recomputed on * subsequent attach if needed. */ if (fs->w_q_lookup) free(fs->w_q_lookup, M_DUMMYNET); fs->w_q_lookup = NULL; qht_delete(fs, flags); if (fs->sched && fs->sched->fp->free_fsk) fs->sched->fp->free_fsk(fs); fs->sched = NULL; if (flags & DN_DELETE_FS) { bzero(fs, sizeof(fs)); /* safety */ free(fs, M_DUMMYNET); dn_cfg.fsk_count--; } else { SLIST_INSERT_HEAD(&dn_cfg.fsu, fs, sch_chain); } } /* * Detach or destroy all flowsets in a list. * flags specifies what to do: * DN_DESTROY: flush all queues * DN_DELETE_FS: DN_DESTROY + destroy flowset * DN_DELETE_FS implies DN_DESTROY */ static void fsk_detach_list(struct dn_fsk_head *h, int flags) { struct dn_fsk *fs; int n = 0; /* only for stats */ ND("head %p flags %x", h, flags); while ((fs = SLIST_FIRST(h))) { SLIST_REMOVE_HEAD(h, sch_chain); n++; fsk_detach(fs, flags); } ND("done %d flowsets", n); } /* * called on 'queue X delete' -- removes the flowset from fshash, * deletes all queues for the flowset, and removes the flowset. */ static int delete_fs(int i, int locked) { struct dn_fsk *fs; int err = 0; if (!locked) DN_BH_WLOCK(); fs = dn_ht_find(dn_cfg.fshash, i, DNHT_REMOVE, NULL); if (dn_ht_entries(dn_cfg.fshash) == 0) { dn_ht_free(dn_cfg.fshash, 0); dn_cfg.fshash = NULL; } ND("fs %d found %p", i, fs); if (fs) { fsk_detach(fs, DN_DETACH | DN_DELETE_FS); err = 0; } else err = EINVAL; if (!locked) DN_BH_WUNLOCK(); return err; } /*----- end of flowset hashtable support -------------*/ /*------------------------------------------------------------ * Scheduler hash. When searching by index we pass sched_nr, * otherwise we pass struct dn_sch * which is the first field in * struct dn_schk so we can cast between the two. We use this trick * because in the create phase (but it should be fixed). */ static uint32_t schk_hash(uintptr_t key, int flags, void *_arg) { uint32_t i = !(flags & DNHT_KEY_IS_OBJ) ? key : ((struct dn_schk *)key)->sch.sched_nr; return ( (i>>8)^(i>>4)^i ); } static int schk_match(void *obj, uintptr_t key, int flags, void *_arg) { struct dn_schk *s = (struct dn_schk *)obj; int i = !(flags & DNHT_KEY_IS_OBJ) ? key : ((struct dn_schk *)key)->sch.sched_nr; return (s->sch.sched_nr == i); } /* * Create the entry and intialize with the sched hash if needed. * Leave s->fp unset so we can tell whether a dn_ht_find() returns * a new object or a previously existing one. */ static void * schk_new(uintptr_t key, int flags, void *arg) { struct schk_new_arg *a = arg; struct dn_schk *s; int l = sizeof(*s) +a->fp->schk_datalen; s = malloc(l, M_DUMMYNET, M_NOWAIT | M_ZERO); if (s == NULL) return NULL; set_oid(&s->link.oid, DN_LINK, sizeof(s->link)); s->sch = *a->sch; // copy initial values s->link.link_nr = s->sch.sched_nr; SLIST_INIT(&s->fsk_list); /* initialize the hash table or create the single instance */ s->fp = a->fp; /* si_new needs this */ s->drain_bucket = 0; if (s->sch.flags & DN_HAVE_MASK) { s->siht = dn_ht_init(NULL, s->sch.buckets, offsetof(struct dn_sch_inst, si_next), si_hash, si_match, si_new); if (s->siht == NULL) { free(s, M_DUMMYNET); return NULL; } } s->fp = NULL; /* mark as a new scheduler */ dn_cfg.schk_count++; return s; } /* * Callback for sched delete. Notify all attached flowsets to * detach from the scheduler, destroy the internal flowset, and * all instances. The scheduler goes away too. * arg is 0 (only detach flowsets and destroy instances) * DN_DESTROY (detach & delete queues, delete schk) * or DN_DELETE_FS (delete queues and flowsets, delete schk) */ static int schk_delete_cb(void *obj, void *arg) { struct dn_schk *s = obj; #if 0 int a = (int)arg; ND("sched %d arg %s%s", s->sch.sched_nr, a&DN_DESTROY ? "DEL ":"", a&DN_DELETE_FS ? "DEL_FS":""); #endif fsk_detach_list(&s->fsk_list, arg ? DN_DESTROY : 0); /* no more flowset pointing to us now */ if (s->sch.flags & DN_HAVE_MASK) { dn_ht_scan(s->siht, si_destroy, NULL); dn_ht_free(s->siht, 0); } else if (s->siht) si_destroy(s->siht, NULL); if (s->profile) { free(s->profile, M_DUMMYNET); s->profile = NULL; } s->siht = NULL; if (s->fp->destroy) s->fp->destroy(s); bzero(s, sizeof(*s)); // safety free(obj, M_DUMMYNET); dn_cfg.schk_count--; return DNHT_SCAN_DEL; } /* * called on a 'sched X delete' command. Deletes a single scheduler. * This is done by removing from the schedhash, unlinking all * flowsets and deleting their traffic. */ static int delete_schk(int i) { struct dn_schk *s; s = dn_ht_find(dn_cfg.schedhash, i, DNHT_REMOVE, NULL); if (dn_ht_entries(dn_cfg.schedhash) == 0) { dn_ht_free(dn_cfg.schedhash, 0); dn_cfg.schedhash = NULL; } ND("%d %p", i, s); if (!s) return EINVAL; delete_fs(i + DN_MAX_ID, 1); /* first delete internal fs */ /* then detach flowsets, delete traffic */ schk_delete_cb(s, (void*)(uintptr_t)DN_DESTROY); return 0; } /*--- end of schk hashtable support ---*/ static int copy_obj(char **start, char *end, void *_o, const char *msg, int i) { struct dn_id *o = _o; int have = end - *start; if (have < o->len || o->len == 0 || o->type == 0) { D("(WARN) type %d %s %d have %d need %d", o->type, msg, i, have, o->len); return 1; } ND("type %d %s %d len %d", o->type, msg, i, o->len); bcopy(_o, *start, o->len); if (o->type == DN_LINK) { /* Adjust burst parameter for link */ struct dn_link *l = (struct dn_link *)*start; l->burst = div64(l->burst, 8 * hz); } else if (o->type == DN_SCH) { /* Set id->id to the number of instances */ struct dn_schk *s = _o; struct dn_id *id = (struct dn_id *)(*start); id->id = (s->sch.flags & DN_HAVE_MASK) ? dn_ht_entries(s->siht) : (s->siht ? 1 : 0); } *start += o->len; return 0; } /* Specific function to copy a queue. * Copies only the user-visible part of a queue (which is in * a struct dn_flow), and sets len accordingly. */ static int copy_obj_q(char **start, char *end, void *_o, const char *msg, int i) { struct dn_id *o = _o; int have = end - *start; int len = sizeof(struct dn_flow); /* see above comment */ if (have < len || o->len == 0 || o->type != DN_QUEUE) { D("ERROR type %d %s %d have %d need %d", o->type, msg, i, have, len); return 1; } ND("type %d %s %d len %d", o->type, msg, i, len); bcopy(_o, *start, len); ((struct dn_id*)(*start))->len = len; *start += len; return 0; } static int copy_q_cb(void *obj, void *arg) { struct dn_queue *q = obj; struct copy_args *a = arg; struct dn_flow *ni = (struct dn_flow *)(*a->start); if (copy_obj_q(a->start, a->end, &q->ni, "queue", -1)) return DNHT_SCAN_END; ni->oid.type = DN_FLOW; /* override the DN_QUEUE */ ni->oid.id = si_hash((uintptr_t)&ni->fid, 0, NULL); return 0; } static int copy_q(struct copy_args *a, struct dn_fsk *fs, int flags) { if (!fs->qht) return 0; if (fs->fs.flags & DN_QHT_HASH) dn_ht_scan(fs->qht, copy_q_cb, a); else copy_q_cb(fs->qht, a); return 0; } /* * This routine only copies the initial part of a profile ? XXX * XXX marta: I think this routine is called to print a summary * of the pipe configuration and does not need to show the * profile samples list. */ static int copy_profile(struct copy_args *a, struct dn_profile *p) { int have = a->end - *a->start; /* XXX here we check for max length */ int profile_len = sizeof(struct dn_profile); if (p == NULL) return 0; if (have < profile_len) { D("error have %d need %d", have, profile_len); return 1; } bcopy(p, *a->start, profile_len); ((struct dn_id *)(*a->start))->len = profile_len; *a->start += profile_len; return 0; } static int copy_flowset(struct copy_args *a, struct dn_fsk *fs, int flags) { struct dn_fs *ufs = (struct dn_fs *)(*a->start); if (!fs) return 0; ND("flowset %d", fs->fs.fs_nr); if (copy_obj(a->start, a->end, &fs->fs, "flowset", fs->fs.fs_nr)) return DNHT_SCAN_END; ufs->oid.id = (fs->fs.flags & DN_QHT_HASH) ? dn_ht_entries(fs->qht) : (fs->qht ? 1 : 0); if (flags) { /* copy queues */ copy_q(a, fs, 0); } return 0; } static int copy_si_cb(void *obj, void *arg) { struct dn_sch_inst *si = obj; struct copy_args *a = arg; struct dn_flow *ni = (struct dn_flow *)(*a->start); if (copy_obj(a->start, a->end, &si->ni, "inst", si->sched->sch.sched_nr)) return DNHT_SCAN_END; ni->oid.type = DN_FLOW; /* override the DN_SCH_I */ ni->oid.id = si_hash((uintptr_t)si, DNHT_KEY_IS_OBJ, NULL); return 0; } static int copy_si(struct copy_args *a, struct dn_schk *s, int flags) { if (s->sch.flags & DN_HAVE_MASK) dn_ht_scan(s->siht, copy_si_cb, a); else if (s->siht) copy_si_cb(s->siht, a); return 0; } /* * compute a list of children of a scheduler and copy up */ static int copy_fsk_list(struct copy_args *a, struct dn_schk *s, int flags) { struct dn_fsk *fs; struct dn_id *o; uint32_t *p; int n = 0, space = sizeof(*o); SLIST_FOREACH(fs, &s->fsk_list, sch_chain) { if (fs->fs.fs_nr < DN_MAX_ID) n++; } space += n * sizeof(uint32_t); DX(3, "sched %d has %d flowsets", s->sch.sched_nr, n); if (a->end - *(a->start) < space) return DNHT_SCAN_END; o = (struct dn_id *)(*(a->start)); o->len = space; *a->start += o->len; o->type = DN_TEXT; p = (uint32_t *)(o+1); SLIST_FOREACH(fs, &s->fsk_list, sch_chain) if (fs->fs.fs_nr < DN_MAX_ID) *p++ = fs->fs.fs_nr; return 0; } static int copy_data_helper(void *_o, void *_arg) { struct copy_args *a = _arg; uint32_t *r = a->extra->r; /* start of first range */ uint32_t *lim; /* first invalid pointer */ int n; lim = (uint32_t *)((char *)(a->extra) + a->extra->o.len); if (a->type == DN_LINK || a->type == DN_SCH) { /* pipe|sched show, we receive a dn_schk */ struct dn_schk *s = _o; n = s->sch.sched_nr; if (a->type == DN_SCH && n >= DN_MAX_ID) return 0; /* not a scheduler */ if (a->type == DN_LINK && n <= DN_MAX_ID) return 0; /* not a pipe */ /* see if the object is within one of our ranges */ for (;r < lim; r += 2) { if (n < r[0] || n > r[1]) continue; /* Found a valid entry, copy and we are done */ if (a->flags & DN_C_LINK) { if (copy_obj(a->start, a->end, &s->link, "link", n)) return DNHT_SCAN_END; if (copy_profile(a, s->profile)) return DNHT_SCAN_END; if (copy_flowset(a, s->fs, 0)) return DNHT_SCAN_END; } if (a->flags & DN_C_SCH) { if (copy_obj(a->start, a->end, &s->sch, "sched", n)) return DNHT_SCAN_END; /* list all attached flowsets */ if (copy_fsk_list(a, s, 0)) return DNHT_SCAN_END; } if (a->flags & DN_C_FLOW) copy_si(a, s, 0); break; } } else if (a->type == DN_FS) { /* queue show, skip internal flowsets */ struct dn_fsk *fs = _o; n = fs->fs.fs_nr; if (n >= DN_MAX_ID) return 0; /* see if the object is within one of our ranges */ for (;r < lim; r += 2) { if (n < r[0] || n > r[1]) continue; if (copy_flowset(a, fs, 0)) return DNHT_SCAN_END; copy_q(a, fs, 0); break; /* we are done */ } } return 0; } static inline struct dn_schk * locate_scheduler(int i) { return dn_ht_find(dn_cfg.schedhash, i, 0, NULL); } /* * red parameters are in fixed point arithmetic. */ static int config_red(struct dn_fsk *fs) { int64_t s, idle, weight, w0; int t, i; fs->w_q = fs->fs.w_q; fs->max_p = fs->fs.max_p; D("called"); /* Doing stuff that was in userland */ i = fs->sched->link.bandwidth; s = (i <= 0) ? 0 : hz * dn_cfg.red_avg_pkt_size * 8 * SCALE(1) / i; idle = div64((s * 3) , fs->w_q); /* s, fs->w_q scaled; idle not scaled */ fs->lookup_step = div64(idle , dn_cfg.red_lookup_depth); /* fs->lookup_step not scaled, */ if (!fs->lookup_step) fs->lookup_step = 1; w0 = weight = SCALE(1) - fs->w_q; //fs->w_q scaled for (t = fs->lookup_step; t > 1; --t) weight = SCALE_MUL(weight, w0); fs->lookup_weight = (int)(weight); // scaled /* Now doing stuff that was in kerneland */ fs->min_th = SCALE(fs->fs.min_th); fs->max_th = SCALE(fs->fs.max_th); fs->c_1 = fs->max_p / (fs->fs.max_th - fs->fs.min_th); fs->c_2 = SCALE_MUL(fs->c_1, SCALE(fs->fs.min_th)); if (fs->fs.flags & DN_IS_GENTLE_RED) { fs->c_3 = (SCALE(1) - fs->max_p) / fs->fs.max_th; fs->c_4 = SCALE(1) - 2 * fs->max_p; } /* If the lookup table already exist, free and create it again. */ if (fs->w_q_lookup) { free(fs->w_q_lookup, M_DUMMYNET); fs->w_q_lookup = NULL; } if (dn_cfg.red_lookup_depth == 0) { printf("\ndummynet: net.inet.ip.dummynet.red_lookup_depth" "must be > 0\n"); fs->fs.flags &= ~DN_IS_RED; fs->fs.flags &= ~DN_IS_GENTLE_RED; return (EINVAL); } fs->lookup_depth = dn_cfg.red_lookup_depth; fs->w_q_lookup = (u_int *)malloc(fs->lookup_depth * sizeof(int), M_DUMMYNET, M_NOWAIT); if (fs->w_q_lookup == NULL) { printf("dummynet: sorry, cannot allocate red lookup table\n"); fs->fs.flags &= ~DN_IS_RED; fs->fs.flags &= ~DN_IS_GENTLE_RED; return(ENOSPC); } /* Fill the lookup table with (1 - w_q)^x */ fs->w_q_lookup[0] = SCALE(1) - fs->w_q; for (i = 1; i < fs->lookup_depth; i++) fs->w_q_lookup[i] = SCALE_MUL(fs->w_q_lookup[i - 1], fs->lookup_weight); if (dn_cfg.red_avg_pkt_size < 1) dn_cfg.red_avg_pkt_size = 512; fs->avg_pkt_size = dn_cfg.red_avg_pkt_size; if (dn_cfg.red_max_pkt_size < 1) dn_cfg.red_max_pkt_size = 1500; fs->max_pkt_size = dn_cfg.red_max_pkt_size; D("exit"); return 0; } /* Scan all flowset attached to this scheduler and update red */ static void update_red(struct dn_schk *s) { struct dn_fsk *fs; SLIST_FOREACH(fs, &s->fsk_list, sch_chain) { if (fs && (fs->fs.flags & DN_IS_RED)) config_red(fs); } } /* attach flowset to scheduler s, possibly requeue */ static void fsk_attach(struct dn_fsk *fs, struct dn_schk *s) { ND("remove fs %d from fsunlinked, link to sched %d", fs->fs.fs_nr, s->sch.sched_nr); SLIST_REMOVE(&dn_cfg.fsu, fs, dn_fsk, sch_chain); fs->sched = s; SLIST_INSERT_HEAD(&s->fsk_list, fs, sch_chain); if (s->fp->new_fsk) s->fp->new_fsk(fs); /* XXX compute fsk_mask */ fs->fsk_mask = fs->fs.flow_mask; if (fs->sched->sch.flags & DN_HAVE_MASK) flow_id_or(&fs->sched->sch.sched_mask, &fs->fsk_mask); if (fs->qht) { /* * we must drain qht according to the old * type, and reinsert according to the new one. * The requeue is complex -- in general we need to * reclassify every single packet. * For the time being, let's hope qht is never set * when we reach this point. */ D("XXX TODO requeue from fs %d to sch %d", fs->fs.fs_nr, s->sch.sched_nr); fs->qht = NULL; } /* set the new type for qht */ if (nonzero_mask(&fs->fsk_mask)) fs->fs.flags |= DN_QHT_HASH; else fs->fs.flags &= ~DN_QHT_HASH; /* XXX config_red() can fail... */ if (fs->fs.flags & DN_IS_RED) config_red(fs); } /* update all flowsets which may refer to this scheduler */ static void update_fs(struct dn_schk *s) { struct dn_fsk *fs, *tmp; SLIST_FOREACH_SAFE(fs, &dn_cfg.fsu, sch_chain, tmp) { if (s->sch.sched_nr != fs->fs.sched_nr) { D("fs %d for sch %d not %d still unlinked", fs->fs.fs_nr, fs->fs.sched_nr, s->sch.sched_nr); continue; } fsk_attach(fs, s); } } /* * Configuration -- to preserve backward compatibility we use * the following scheme (N is 65536) * NUMBER SCHED LINK FLOWSET * 1 .. N-1 (1)WFQ (2)WFQ (3)queue * N+1 .. 2N-1 (4)FIFO (5)FIFO (6)FIFO for sched 1..N-1 * 2N+1 .. 3N-1 -- -- (7)FIFO for sched N+1..2N-1 * * "pipe i config" configures #1, #2 and #3 * "sched i config" configures #1 and possibly #6 * "queue i config" configures #3 * #1 is configured with 'pipe i config' or 'sched i config' * #2 is configured with 'pipe i config', and created if not * existing with 'sched i config' * #3 is configured with 'queue i config' * #4 is automatically configured after #1, can only be FIFO * #5 is automatically configured after #2 * #6 is automatically created when #1 is !MULTIQUEUE, * and can be updated. * #7 is automatically configured after #2 */ /* * configure a link (and its FIFO instance) */ static int config_link(struct dn_link *p, struct dn_id *arg) { int i; if (p->oid.len != sizeof(*p)) { D("invalid pipe len %d", p->oid.len); return EINVAL; } i = p->link_nr; if (i <= 0 || i >= DN_MAX_ID) return EINVAL; /* * The config program passes parameters as follows: * bw = bits/second (0 means no limits), * delay = ms, must be translated into ticks. * qsize = slots/bytes * burst ??? */ p->delay = (p->delay * hz) / 1000; /* Scale burst size: bytes -> bits * hz */ p->burst *= 8 * hz; DN_BH_WLOCK(); /* do it twice, base link and FIFO link */ for (; i < 2*DN_MAX_ID; i += DN_MAX_ID) { struct dn_schk *s = locate_scheduler(i); if (s == NULL) { DN_BH_WUNLOCK(); D("sched %d not found", i); return EINVAL; } /* remove profile if exists */ if (s->profile) { free(s->profile, M_DUMMYNET); s->profile = NULL; } /* copy all parameters */ s->link.oid = p->oid; s->link.link_nr = i; s->link.delay = p->delay; if (s->link.bandwidth != p->bandwidth) { /* XXX bandwidth changes, need to update red params */ s->link.bandwidth = p->bandwidth; update_red(s); } s->link.burst = p->burst; schk_reset_credit(s); } dn_cfg.id++; DN_BH_WUNLOCK(); return 0; } /* * configure a flowset. Can be called from inside with locked=1, */ static struct dn_fsk * config_fs(struct dn_fs *nfs, struct dn_id *arg, int locked) { int i; struct dn_fsk *fs; if (nfs->oid.len != sizeof(*nfs)) { D("invalid flowset len %d", nfs->oid.len); return NULL; } i = nfs->fs_nr; if (i <= 0 || i >= 3*DN_MAX_ID) return NULL; ND("flowset %d", i); /* XXX other sanity checks */ if (nfs->flags & DN_QSIZE_BYTES) { ipdn_bound_var(&nfs->qsize, 16384, 1500, dn_cfg.byte_limit, NULL); // "queue byte size"); } else { ipdn_bound_var(&nfs->qsize, 50, 1, dn_cfg.slot_limit, NULL); // "queue slot size"); } if (nfs->flags & DN_HAVE_MASK) { /* make sure we have some buckets */ ipdn_bound_var((int *)&nfs->buckets, dn_cfg.hash_size, 1, dn_cfg.max_hash_size, "flowset buckets"); } else { nfs->buckets = 1; /* we only need 1 */ } if (!locked) DN_BH_WLOCK(); if (dn_cfg.fshash == NULL) dn_cfg.fshash = dn_ht_init(NULL, dn_cfg.hash_size, offsetof(struct dn_fsk, fsk_next), fsk_hash, fsk_match, fsk_new); do { /* exit with break when done */ struct dn_schk *s; int flags = nfs->sched_nr ? DNHT_INSERT : 0; int j; int oldc = dn_cfg.fsk_count; fs = dn_ht_find(dn_cfg.fshash, i, flags, NULL); if (fs == NULL) { D("missing sched for flowset %d", i); break; } /* grab some defaults from the existing one */ if (nfs->sched_nr == 0) /* reuse */ nfs->sched_nr = fs->fs.sched_nr; for (j = 0; j < sizeof(nfs->par)/sizeof(nfs->par[0]); j++) { if (nfs->par[j] == -1) /* reuse */ nfs->par[j] = fs->fs.par[j]; } if (bcmp(&fs->fs, nfs, sizeof(*nfs)) == 0) { ND("flowset %d unchanged", i); break; /* no change, nothing to do */ } if (oldc != dn_cfg.fsk_count) /* new item */ dn_cfg.id++; s = locate_scheduler(nfs->sched_nr); /* detach from old scheduler if needed, preserving * queues if we need to reattach. Then update the * configuration, and possibly attach to the new sched. */ DX(2, "fs %d changed sched %d@%p to %d@%p", fs->fs.fs_nr, fs->fs.sched_nr, fs->sched, nfs->sched_nr, s); if (fs->sched) { int flags = s ? DN_DETACH : (DN_DETACH | DN_DESTROY); flags |= DN_DESTROY; /* XXX temporary */ fsk_detach(fs, flags); } fs->fs = *nfs; /* copy configuration */ if (s != NULL) fsk_attach(fs, s); } while (0); if (!locked) DN_BH_WUNLOCK(); return fs; } /* * config/reconfig a scheduler and its FIFO variant. * For !MULTIQUEUE schedulers, also set up the flowset. * * On reconfigurations (detected because s->fp is set), * detach existing flowsets preserving traffic, preserve link, * and delete the old scheduler creating a new one. */ static int config_sched(struct dn_sch *_nsch, struct dn_id *arg) { struct dn_schk *s; struct schk_new_arg a; /* argument for schk_new */ int i; struct dn_link p; /* copy of oldlink */ struct dn_profile *pf = NULL; /* copy of old link profile */ /* Used to preserv mask parameter */ struct ipfw_flow_id new_mask; int new_buckets = 0; int new_flags = 0; int pipe_cmd; int err = ENOMEM; a.sch = _nsch; if (a.sch->oid.len != sizeof(*a.sch)) { D("bad sched len %d", a.sch->oid.len); return EINVAL; } i = a.sch->sched_nr; if (i <= 0 || i >= DN_MAX_ID) return EINVAL; /* make sure we have some buckets */ if (a.sch->flags & DN_HAVE_MASK) ipdn_bound_var((int *)&a.sch->buckets, dn_cfg.hash_size, 1, dn_cfg.max_hash_size, "sched buckets"); /* XXX other sanity checks */ bzero(&p, sizeof(p)); pipe_cmd = a.sch->flags & DN_PIPE_CMD; a.sch->flags &= ~DN_PIPE_CMD; //XXX do it even if is not set? if (pipe_cmd) { /* Copy mask parameter */ new_mask = a.sch->sched_mask; new_buckets = a.sch->buckets; new_flags = a.sch->flags; } DN_BH_WLOCK(); if (dn_cfg.schedhash == NULL) dn_cfg.schedhash = dn_ht_init(NULL, dn_cfg.hash_size, offsetof(struct dn_schk, schk_next), schk_hash, schk_match, schk_new); again: /* run twice, for wfq and fifo */ /* * lookup the type. If not supplied, use the previous one * or default to WF2Q+. Otherwise, return an error. */ dn_cfg.id++; a.fp = find_sched_type(a.sch->oid.subtype, a.sch->name); if (a.fp != NULL) { /* found. Lookup or create entry */ s = dn_ht_find(dn_cfg.schedhash, i, DNHT_INSERT, &a); } else if (a.sch->oid.subtype == 0 && !a.sch->name[0]) { /* No type. search existing s* or retry with WF2Q+ */ s = dn_ht_find(dn_cfg.schedhash, i, 0, &a); if (s != NULL) { a.fp = s->fp; /* Scheduler exists, skip to FIFO scheduler * if command was pipe config... */ if (pipe_cmd) goto next; } else { /* New scheduler, create a wf2q+ with no mask * if command was pipe config... */ if (pipe_cmd) { /* clear mask parameter */ bzero(&a.sch->sched_mask, sizeof(new_mask)); a.sch->buckets = 0; a.sch->flags &= ~DN_HAVE_MASK; } a.sch->oid.subtype = DN_SCHED_WF2QP; goto again; } } else { D("invalid scheduler type %d %s", a.sch->oid.subtype, a.sch->name); err = EINVAL; goto error; } /* normalize name and subtype */ a.sch->oid.subtype = a.fp->type; bzero(a.sch->name, sizeof(a.sch->name)); strlcpy(a.sch->name, a.fp->name, sizeof(a.sch->name)); if (s == NULL) { D("cannot allocate scheduler %d", i); goto error; } /* restore existing link if any */ if (p.link_nr) { s->link = p; if (!pf || pf->link_nr != p.link_nr) { /* no saved value */ s->profile = NULL; /* XXX maybe not needed */ } else { size_t pf_size = sizeof(struct dn_profile) + s->profile->samples_no * sizeof(int); s->profile = malloc(pf_size, M_DUMMYNET, M_NOWAIT | M_ZERO); if (s->profile == NULL) { D("cannot allocate profile"); goto error; //XXX } bcopy(pf, s->profile, pf_size); } } p.link_nr = 0; if (s->fp == NULL) { DX(2, "sched %d new type %s", i, a.fp->name); } else if (s->fp != a.fp || bcmp(a.sch, &s->sch, sizeof(*a.sch)) ) { /* already existing. */ DX(2, "sched %d type changed from %s to %s", i, s->fp->name, a.fp->name); DX(4, " type/sub %d/%d -> %d/%d", s->sch.oid.type, s->sch.oid.subtype, a.sch->oid.type, a.sch->oid.subtype); if (s->link.link_nr == 0) D("XXX WARNING link 0 for sched %d", i); p = s->link; /* preserve link */ if (s->profile) {/* preserve profile */ if (!pf) pf = malloc(sizeof(*pf), M_DUMMYNET, M_NOWAIT | M_ZERO); if (pf) /* XXX should issue a warning otherwise */ bcopy(s->profile, pf, sizeof(*pf)); } /* remove from the hash */ dn_ht_find(dn_cfg.schedhash, i, DNHT_REMOVE, NULL); /* Detach flowsets, preserve queues. */ // schk_delete_cb(s, NULL); // XXX temporarily, kill queues schk_delete_cb(s, (void *)DN_DESTROY); goto again; } else { DX(4, "sched %d unchanged type %s", i, a.fp->name); } /* complete initialization */ s->sch = *a.sch; s->fp = a.fp; s->cfg = arg; // XXX schk_reset_credit(s); /* create the internal flowset if needed, * trying to reuse existing ones if available */ if (!(s->fp->flags & DN_MULTIQUEUE) && !s->fs) { s->fs = dn_ht_find(dn_cfg.fshash, i, 0, NULL); if (!s->fs) { struct dn_fs fs; bzero(&fs, sizeof(fs)); set_oid(&fs.oid, DN_FS, sizeof(fs)); fs.fs_nr = i + DN_MAX_ID; fs.sched_nr = i; s->fs = config_fs(&fs, NULL, 1 /* locked */); } if (!s->fs) { schk_delete_cb(s, (void *)DN_DESTROY); D("error creating internal fs for %d", i); goto error; } } /* call init function after the flowset is created */ if (s->fp->config) s->fp->config(s); update_fs(s); next: if (i < DN_MAX_ID) { /* now configure the FIFO instance */ i += DN_MAX_ID; if (pipe_cmd) { /* Restore mask parameter for FIFO */ a.sch->sched_mask = new_mask; a.sch->buckets = new_buckets; a.sch->flags = new_flags; } else { /* sched config shouldn't modify the FIFO scheduler */ if (dn_ht_find(dn_cfg.schedhash, i, 0, &a) != NULL) { /* FIFO already exist, don't touch it */ err = 0; /* and this is not an error */ goto error; } } a.sch->sched_nr = i; a.sch->oid.subtype = DN_SCHED_FIFO; bzero(a.sch->name, sizeof(a.sch->name)); goto again; } err = 0; error: DN_BH_WUNLOCK(); if (pf) free(pf, M_DUMMYNET); return err; } /* * attach a profile to a link */ static int config_profile(struct dn_profile *pf, struct dn_id *arg) { struct dn_schk *s; int i, olen, err = 0; if (pf->oid.len < sizeof(*pf)) { D("short profile len %d", pf->oid.len); return EINVAL; } i = pf->link_nr; if (i <= 0 || i >= DN_MAX_ID) return EINVAL; /* XXX other sanity checks */ DN_BH_WLOCK(); for (; i < 2*DN_MAX_ID; i += DN_MAX_ID) { s = locate_scheduler(i); if (s == NULL) { err = EINVAL; break; } dn_cfg.id++; /* * If we had a profile and the new one does not fit, * or it is deleted, then we need to free memory. */ if (s->profile && (pf->samples_no == 0 || s->profile->oid.len < pf->oid.len)) { free(s->profile, M_DUMMYNET); s->profile = NULL; } if (pf->samples_no == 0) continue; /* * new profile, possibly allocate memory * and copy data. */ if (s->profile == NULL) s->profile = malloc(pf->oid.len, M_DUMMYNET, M_NOWAIT | M_ZERO); if (s->profile == NULL) { D("no memory for profile %d", i); err = ENOMEM; break; } /* preserve larger length XXX double check */ olen = s->profile->oid.len; if (olen < pf->oid.len) olen = pf->oid.len; bcopy(pf, s->profile, pf->oid.len); s->profile->oid.len = olen; } DN_BH_WUNLOCK(); return err; } /* * Delete all objects: */ static void dummynet_flush(void) { /* delete all schedulers and related links/queues/flowsets */ dn_ht_scan(dn_cfg.schedhash, schk_delete_cb, (void *)(uintptr_t)DN_DELETE_FS); /* delete all remaining (unlinked) flowsets */ DX(4, "still %d unlinked fs", dn_cfg.fsk_count); dn_ht_free(dn_cfg.fshash, DNHT_REMOVE); fsk_detach_list(&dn_cfg.fsu, DN_DELETE_FS); dn_ht_free(dn_cfg.schedhash, DNHT_REMOVE); /* Reinitialize system heap... */ heap_init(&dn_cfg.evheap, 16, offsetof(struct dn_id, id)); } /* * Main handler for configuration. We are guaranteed to be called * with an oid which is at least a dn_id. * - the first object is the command (config, delete, flush, ...) * - config_link must be issued after the corresponding config_sched * - parameters (DN_TXT) for an object must preceed the object * processed on a config_sched. */ int do_config(void *p, int l) { struct dn_id *next, *o; int err = 0, err2 = 0; struct dn_id *arg = NULL; uintptr_t *a; o = p; if (o->id != DN_API_VERSION) { D("invalid api version got %d need %d", o->id, DN_API_VERSION); return EINVAL; } for (; l >= sizeof(*o); o = next) { struct dn_id *prev = arg; if (o->len < sizeof(*o) || l < o->len) { D("bad len o->len %d len %d", o->len, l); err = EINVAL; break; } l -= o->len; next = (struct dn_id *)((char *)o + o->len); err = 0; switch (o->type) { default: D("cmd %d not implemented", o->type); break; #ifdef EMULATE_SYSCTL /* sysctl emulation. * if we recognize the command, jump to the correct * handler and return */ case DN_SYSCTL_SET: err = kesysctl_emu_set(p, l); return err; #endif case DN_CMD_CONFIG: /* simply a header */ break; case DN_CMD_DELETE: /* the argument is in the first uintptr_t after o */ a = (uintptr_t *)(o+1); if (o->len < sizeof(*o) + sizeof(*a)) { err = EINVAL; break; } switch (o->subtype) { case DN_LINK: /* delete base and derived schedulers */ DN_BH_WLOCK(); err = delete_schk(*a); err2 = delete_schk(*a + DN_MAX_ID); DN_BH_WUNLOCK(); if (!err) err = err2; break; default: D("invalid delete type %d", o->subtype); err = EINVAL; break; case DN_FS: err = (*a <1 || *a >= DN_MAX_ID) ? EINVAL : delete_fs(*a, 0) ; break; } break; case DN_CMD_FLUSH: DN_BH_WLOCK(); dummynet_flush(); DN_BH_WUNLOCK(); break; case DN_TEXT: /* store argument the next block */ prev = NULL; arg = o; break; case DN_LINK: err = config_link((struct dn_link *)o, arg); break; case DN_PROFILE: err = config_profile((struct dn_profile *)o, arg); break; case DN_SCH: err = config_sched((struct dn_sch *)o, arg); break; case DN_FS: err = (NULL==config_fs((struct dn_fs *)o, arg, 0)); break; } if (prev) arg = NULL; if (err != 0) break; } return err; } static int compute_space(struct dn_id *cmd, struct copy_args *a) { int x = 0, need = 0; int profile_size = sizeof(struct dn_profile); /* NOTE about compute space: * NP = dn_cfg.schk_count * NSI = dn_cfg.si_count * NF = dn_cfg.fsk_count * NQ = dn_cfg.queue_count * - ipfw pipe show * (NP/2)*(dn_link + dn_sch + dn_id + dn_fs) only half scheduler * link, scheduler template, flowset * integrated in scheduler and header * for flowset list * (NSI)*(dn_flow) all scheduler instance (includes * the queue instance) * - ipfw sched show * (NP/2)*(dn_link + dn_sch + dn_id + dn_fs) only half scheduler * link, scheduler template, flowset * integrated in scheduler and header * for flowset list * (NSI * dn_flow) all scheduler instances * (NF * sizeof(uint_32)) space for flowset list linked to scheduler * (NQ * dn_queue) all queue [XXXfor now not listed] * - ipfw queue show * (NF * dn_fs) all flowset * (NQ * dn_queue) all queues */ switch (cmd->subtype) { default: return -1; /* XXX where do LINK and SCH differ ? */ /* 'ipfw sched show' could list all queues associated to * a scheduler. This feature for now is disabled */ case DN_LINK: /* pipe show */ x = DN_C_LINK | DN_C_SCH | DN_C_FLOW; need += dn_cfg.schk_count * (sizeof(struct dn_fs) + profile_size) / 2; need += dn_cfg.fsk_count * sizeof(uint32_t); break; case DN_SCH: /* sched show */ need += dn_cfg.schk_count * (sizeof(struct dn_fs) + profile_size) / 2; need += dn_cfg.fsk_count * sizeof(uint32_t); x = DN_C_SCH | DN_C_LINK | DN_C_FLOW; break; case DN_FS: /* queue show */ x = DN_C_FS | DN_C_QUEUE; break; case DN_GET_COMPAT: /* compatibility mode */ need = dn_compat_calc_size(); break; } a->flags = x; if (x & DN_C_SCH) { need += dn_cfg.schk_count * sizeof(struct dn_sch) / 2; /* NOT also, each fs might be attached to a sched */ need += dn_cfg.schk_count * sizeof(struct dn_id) / 2; } if (x & DN_C_FS) need += dn_cfg.fsk_count * sizeof(struct dn_fs); if (x & DN_C_LINK) { need += dn_cfg.schk_count * sizeof(struct dn_link) / 2; } /* * When exporting a queue to userland, only pass up the * struct dn_flow, which is the only visible part. */ if (x & DN_C_QUEUE) need += dn_cfg.queue_count * sizeof(struct dn_flow); if (x & DN_C_FLOW) need += dn_cfg.si_count * (sizeof(struct dn_flow)); return need; } /* * If compat != NULL dummynet_get is called in compatibility mode. * *compat will be the pointer to the buffer to pass to ipfw */ int dummynet_get(struct sockopt *sopt, void **compat) { int have, i, need, error; char *start = NULL, *buf; size_t sopt_valsize; struct dn_id *cmd; struct copy_args a; struct copy_range r; int l = sizeof(struct dn_id); bzero(&a, sizeof(a)); bzero(&r, sizeof(r)); /* save and restore original sopt_valsize around copyin */ sopt_valsize = sopt->sopt_valsize; cmd = &r.o; if (!compat) { /* copy at least an oid, and possibly a full object */ error = sooptcopyin(sopt, cmd, sizeof(r), sizeof(*cmd)); sopt->sopt_valsize = sopt_valsize; if (error) goto done; l = cmd->len; #ifdef EMULATE_SYSCTL /* sysctl emulation. */ if (cmd->type == DN_SYSCTL_GET) return kesysctl_emu_get(sopt); #endif if (l > sizeof(r)) { /* request larger than default, allocate buffer */ cmd = malloc(l, M_DUMMYNET, M_WAIT); if (cmd == NULL) return ENOMEM; //XXX error = sooptcopyin(sopt, cmd, l, l); sopt->sopt_valsize = sopt_valsize; if (error) goto done; } } else { /* compatibility */ error = 0; cmd->type = DN_CMD_GET; cmd->len = sizeof(struct dn_id); cmd->subtype = DN_GET_COMPAT; // cmd->id = sopt_valsize; D("compatibility mode"); } a.extra = (struct copy_range *)cmd; if (cmd->len == sizeof(*cmd)) { /* no range, create a default */ uint32_t *rp = (uint32_t *)(cmd + 1); cmd->len += 2* sizeof(uint32_t); rp[0] = 1; rp[1] = DN_MAX_ID - 1; if (cmd->subtype == DN_LINK) { rp[0] += DN_MAX_ID; rp[1] += DN_MAX_ID; } } /* Count space (under lock) and allocate (outside lock). * Exit with lock held if we manage to get enough buffer. * Try a few times then give up. */ for (have = 0, i = 0; i < 10; i++) { DN_BH_WLOCK(); need = compute_space(cmd, &a); /* if there is a range, ignore value from compute_space() */ if (l > sizeof(*cmd)) need = sopt_valsize - sizeof(*cmd); if (need < 0) { DN_BH_WUNLOCK(); error = EINVAL; goto done; } need += sizeof(*cmd); cmd->id = need; if (have >= need) /* got space, hold the lock */ break; DN_BH_WUNLOCK(); if (start) free(start, M_DUMMYNET); start = NULL; if (need > sopt_valsize) break; have = need; start = malloc(have, M_DUMMYNET, M_WAITOK | M_ZERO); if (start == NULL) { error = ENOMEM; goto done; } } if (start == NULL) { if (compat) { *compat = NULL; error = 1; // XXX } else { error = sooptcopyout(sopt, cmd, sizeof(*cmd)); } /* no enough memory, release the lock and give up */ /* XXX marta: here we hold the lock */ goto done; } ND("have %d:%d sched %d, %d:%d links %d, %d:%d flowsets %d, " "%d:%d si %d, %d:%d queues %d", dn_cfg.schk_count, sizeof(struct dn_sch), DN_SCH, dn_cfg.schk_count, sizeof(struct dn_link), DN_LINK, dn_cfg.fsk_count, sizeof(struct dn_fs), DN_FS, dn_cfg.si_count, sizeof(struct dn_flow), DN_SCH_I, dn_cfg.queue_count, sizeof(struct dn_queue), DN_QUEUE); sopt->sopt_valsize = sopt_valsize; a.type = cmd->subtype; if (compat == NULL) { bcopy(cmd, start, sizeof(*cmd)); ((struct dn_id*)(start))->len = sizeof(struct dn_id); buf = start + sizeof(*cmd); } else buf = start; a.start = &buf; a.end = start + have; /* start copying other objects */ if (compat) { a.type = DN_COMPAT_PIPE; dn_ht_scan(dn_cfg.schedhash, copy_data_helper_compat, &a); a.type = DN_COMPAT_QUEUE; dn_ht_scan(dn_cfg.fshash, copy_data_helper_compat, &a); } else if (a.type == DN_FS) { dn_ht_scan(dn_cfg.fshash, copy_data_helper, &a); } else { dn_ht_scan(dn_cfg.schedhash, copy_data_helper, &a); } DN_BH_WUNLOCK(); if (compat) { *compat = start; sopt->sopt_valsize = buf - start; /* free() is done by ip_dummynet_compat() */ start = NULL; //XXX hack } else { error = sooptcopyout(sopt, start, buf - start); } done: if (cmd && cmd != &r.o) free(cmd, M_DUMMYNET); if (start) free(start, M_DUMMYNET); return error; } /* * Functions to drain idle objects -- see dummynet_task() for some notes */ /* Callback called on scheduler instance to delete it if idle */ static int drain_scheduler_cb(void *_si, void *_arg) { struct dn_sch_inst *si = _si; int *arg = _arg; int empty; if ( (*arg++) > dn_cfg.expire_object_examined) return DNHT_SCAN_END; if ((si->kflags & DN_ACTIVE) || si->dline.mq.head != NULL) return 0; /* * if the scheduler is multiqueue, q_count also reflects empty * queues that point to si, so we need to check si->q_count to * tell whether we can remove the instance. */ if (si->ni.length == 0) { /* si was marked as idle: * remove it or increment idle_si_wait counter */ empty = (si->sched->fp->flags & DN_MULTIQUEUE) ? (si->q_count == 0) : 1; if (empty && (si->idle_time < dn_cfg.curr_time - dn_cfg.object_idle_tick)) return si_destroy(si, NULL); else dn_cfg.idle_si_wait++; } return 0; } /* Callback called on scheduler to check if it has instances */ static int drain_scheduler_sch_cb(void *_s, void *_arg) { struct dn_schk *s = _s; int *arg = _arg; if (s->sch.flags & DN_HAVE_MASK) { dn_ht_scan_bucket(s->siht, &s->drain_bucket, drain_scheduler_cb, _arg); } else { if (s->siht) { if (drain_scheduler_cb(s->siht, _arg) == DNHT_SCAN_DEL) s->siht = NULL; } } return ( (*arg++) > dn_cfg.expire_object_examined) ? DNHT_SCAN_END : 0; } /* Called every tick, try to delete a 'bucket' of scheduler */ void dn_drain_scheduler(void) { int arg = 0; dn_ht_scan_bucket(dn_cfg.schedhash, (int *)&dn_cfg.drain_sch, drain_scheduler_sch_cb, &arg); } /* Callback called on queue to delete if it is idle */ static int drain_queue_cb(void *_q, void *_arg) { struct dn_queue *q = _q; int *arg = _arg; if ( (*arg++) > dn_cfg.expire_object_examined) return DNHT_SCAN_END; if (q->ni.length == 0) { if (q->q_time < dn_cfg.curr_time - dn_cfg.object_idle_tick) { if (dn_delete_queue(q, DN_DESTROY | DN_DEL_SAFE) == 0) return DNHT_SCAN_DEL; /* queue is deleted */ } else dn_cfg.idle_queue_wait++; } return 0; /* queue isn't deleted */ } /* Callback called on flowset used to check if it has queues */ static int drain_queue_fs_cb(void *_fs, void *_arg) { struct dn_fsk *fs = _fs; int *arg = _arg; if (fs->fs.flags & DN_QHT_HASH) { /* Flowset has a hash table for queues */ dn_ht_scan_bucket(fs->qht, &fs->drain_bucket, drain_queue_cb, _arg); } else { /* No hash table for this flowset, null the pointer * if the queue is deleted */ if (fs->qht) { if (drain_queue_cb(fs->qht, _arg) == DNHT_SCAN_DEL) fs->qht = NULL; } } return ( (*arg++) > dn_cfg.expire_object_examined) ? DNHT_SCAN_END : 0; } /* Called every tick, try to delete a 'bucket' of queue */ void dn_drain_queue(void) { int arg = 0; /* scan a bucket of flowset */ dn_ht_scan_bucket(dn_cfg.fshash, (int *)&dn_cfg.drain_fs, drain_queue_fs_cb, &arg); } /* * Handler for the various dummynet socket options */ static int ip_dn_ctl(struct sockopt *sopt) { void *p = NULL; int error, l; error = priv_check(sopt->sopt_td, PRIV_NETINET_DUMMYNET); if (error) return (error); /* Disallow sets in really-really secure mode. */ if (sopt->sopt_dir == SOPT_SET) { error = securelevel_ge(sopt->sopt_td->td_ucred, 3); if (error) return (error); } switch (sopt->sopt_name) { default : D("dummynet: unknown option %d", sopt->sopt_name); error = EINVAL; break; case IP_DUMMYNET_FLUSH: case IP_DUMMYNET_CONFIGURE: case IP_DUMMYNET_DEL: /* remove a pipe or queue */ case IP_DUMMYNET_GET: D("dummynet: compat option %d", sopt->sopt_name); error = ip_dummynet_compat(sopt); break; case IP_DUMMYNET3 : if (sopt->sopt_dir == SOPT_GET) { error = dummynet_get(sopt, NULL); break; } l = sopt->sopt_valsize; if (l < sizeof(struct dn_id) || l > 12000) { D("argument len %d invalid", l); break; } p = malloc(l, M_TEMP, M_WAITOK); // XXX can it fail ? error = sooptcopyin(sopt, p, l, l); if (error) break ; error = do_config(p, l); break; } if (p != NULL) free(p, M_TEMP); return error ; } static void ip_dn_init(void) { if (dn_cfg.init_done) return; printf("DUMMYNET %p with IPv6 initialized (100409)\n", curvnet); dn_cfg.init_done = 1; /* Set defaults here. MSVC does not accept initializers, * and this is also useful for vimages */ /* queue limits */ dn_cfg.slot_limit = 100; /* Foot shooting limit for queues. */ dn_cfg.byte_limit = 1024 * 1024; dn_cfg.expire = 1; /* RED parameters */ dn_cfg.red_lookup_depth = 256; /* default lookup table depth */ dn_cfg.red_avg_pkt_size = 512; /* default medium packet size */ dn_cfg.red_max_pkt_size = 1500; /* default max packet size */ /* hash tables */ dn_cfg.max_hash_size = 1024; /* max in the hash tables */ if (dn_cfg.hash_size == 0) /* XXX or <= 0 ? */ dn_cfg.hash_size = 64; /* default hash size */ /* hash tables for schedulers and flowsets are created * when the first scheduler/flowset is inserted. * This is done to allow to use the right hash_size value. * When the last object is deleted, the table is destroyed, * so a new hash_size value can be used. * XXX rehash is not supported for now */ dn_cfg.schedhash = NULL; dn_cfg.fshash = NULL; /* bucket index to drain object */ dn_cfg.drain_fs = 0; dn_cfg.drain_sch = 0; if (dn_cfg.expire_object == 0) dn_cfg.expire_object = 50; if (dn_cfg.object_idle_tick == 0) dn_cfg.object_idle_tick = 1000; if (dn_cfg.expire_object_examined == 0) dn_cfg.expire_object_examined = 10; if (dn_cfg.drain_ratio == 0) dn_cfg.drain_ratio = 1; // XXX what if we don't have a tsc ? #ifdef HAVE_TSC dn_cfg.cycle_task_new = dn_cfg.cycle_task_old = readTSC(); #endif heap_init(&dn_cfg.evheap, 16, offsetof(struct dn_id, id)); SLIST_INIT(&dn_cfg.fsu); SLIST_INIT(&dn_cfg.schedlist); DN_LOCK_INIT(); TASK_INIT(&dn_task, 0, dummynet_task, curvnet); dn_tq = taskqueue_create_fast("dummynet", M_NOWAIT, taskqueue_thread_enqueue, &dn_tq); taskqueue_start_threads(&dn_tq, 1, PI_NET, "dummynet"); callout_init(&dn_timeout, CALLOUT_MPSAFE); callout_reset_on(&dn_timeout, 1, dummynet, NULL, 0); /* Initialize curr_time adjustment mechanics. */ getmicrouptime(&dn_cfg.prev_t); } #ifdef KLD_MODULE static void ip_dn_destroy(int last) { callout_drain(&dn_timeout); DN_BH_WLOCK(); if (last) { ND("%s removing last instance\n"); ip_dn_ctl_ptr = NULL; ip_dn_io_ptr = NULL; } dummynet_flush(); DN_BH_WUNLOCK(); taskqueue_drain(dn_tq, &dn_task); taskqueue_free(dn_tq); dn_ht_free(dn_cfg.schedhash, 0); dn_ht_free(dn_cfg.fshash, 0); heap_free(&dn_cfg.evheap); DN_LOCK_DESTROY(); } #endif /* KLD_MODULE */ static int dummynet_modevent(module_t mod, int type, void *data) { if (type == MOD_LOAD) { if (ip_dn_io_ptr) { printf("DUMMYNET already loaded\n"); return EEXIST ; } ip_dn_init(); ip_dn_ctl_ptr = ip_dn_ctl; ip_dn_io_ptr = dummynet_io; return 0; } else if (type == MOD_UNLOAD) { #if !defined(KLD_MODULE) printf("dummynet statically compiled, cannot unload\n"); return EINVAL ; #else ip_dn_destroy(1 /* last */); return 0; #endif } else return EOPNOTSUPP; } /* modevent helpers for the modules */ static int load_dn_sched(struct dn_alg *d) { struct dn_alg *s; if (d == NULL) return 1; /* error */ ip_dn_init(); /* just in case, we need the lock */ /* Check that mandatory funcs exists */ if (d->enqueue == NULL || d->dequeue == NULL) { D("missing enqueue or dequeue for %s", d->name); return 1; } /* Search if scheduler already exists */ DN_BH_WLOCK(); SLIST_FOREACH(s, &dn_cfg.schedlist, next) { if (strcmp(s->name, d->name) == 0) { D("%s already loaded", d->name); break; /* scheduler already exists */ } } if (s == NULL) SLIST_INSERT_HEAD(&dn_cfg.schedlist, d, next); DN_BH_WUNLOCK(); D("dn_sched %s %sloaded", d->name, s ? "not ":""); return s ? 1 : 0; } static int unload_dn_sched(struct dn_alg *s) { struct dn_alg *tmp, *r; int err = EINVAL; ND("called for %s", s->name); DN_BH_WLOCK(); SLIST_FOREACH_SAFE(r, &dn_cfg.schedlist, next, tmp) { if (strcmp(s->name, r->name) != 0) continue; D("ref_count = %d", r->ref_count); err = (r->ref_count != 0) ? EBUSY : 0; if (err == 0) SLIST_REMOVE(&dn_cfg.schedlist, r, dn_alg, next); break; } DN_BH_WUNLOCK(); D("dn_sched %s %sunloaded", s->name, err ? "not ":""); return err; } int dn_sched_modevent(module_t mod, int cmd, void *arg) { struct dn_alg *sch = arg; if (cmd == MOD_LOAD) return load_dn_sched(sch); else if (cmd == MOD_UNLOAD) return unload_dn_sched(sch); else return EINVAL; } static moduledata_t dummynet_mod = { "dummynet", dummynet_modevent, NULL }; #define DN_SI_SUB SI_SUB_PROTO_IFATTACHDOMAIN #define DN_MODEV_ORD (SI_ORDER_ANY - 128) /* after ipfw */ DECLARE_MODULE(dummynet, dummynet_mod, DN_SI_SUB, DN_MODEV_ORD); MODULE_DEPEND(dummynet, ipfw, 2, 2, 2); MODULE_VERSION(dummynet, 3); /* * Starting up. Done in order after dummynet_modevent() has been called. * VNET_SYSINIT is also called for each existing vnet and each new vnet. */ //VNET_SYSINIT(vnet_dn_init, DN_SI_SUB, DN_MODEV_ORD+2, ip_dn_init, NULL); /* * Shutdown handlers up shop. These are done in REVERSE ORDER, but still * after dummynet_modevent() has been called. Not called on reboot. * VNET_SYSUNINIT is also called for each exiting vnet as it exits. * or when the module is unloaded. */ //VNET_SYSUNINIT(vnet_dn_uninit, DN_SI_SUB, DN_MODEV_ORD+2, ip_dn_destroy, NULL); /* end of file */ ipfw3-2012/sys/netinet/ipfw/ip_fw_lookup.c000644 000423 000000 00000020133 12006744011 021012 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 2009 Luigi Rizzo Universita` di Pisa * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include __FBSDID("$FreeBSD: user/luigi/ipfw3-head/sys/netinet/ipfw/ip_fw_table.c 200601 2009-12-16 10:48:40Z luigi $"); /* * Rule and pipe lookup support for ipfw. * ipfw and dummynet need to quickly find objects (rules, pipes) that may be dynamically created or destroyed. To address the problem, we label each new object with a unique 32-bit identifier whose low K bits are the index in a lookup table. All existing objects are referred by the lookup table, and identifiers are chosen so that for each slot there is at most one active object (whose identifier points to the slot). This is almost a hash table, except that we can pick the identifiers after looking at the table's occupation so we have a trivial hash function and are collision free. With this structure, operations are very fast and simple: - the table has N entries s[i] with two fields, 'id' and 'ptr', with N <= M = 2^k (M is an upper bound to the size of the table); - initially, all slots have s[i].id = i, and the pointers are used to build a freelist (tailq). - a slot is considered empty if ptr == NULL or s[0] <= ptr < s[N]. This is easy to detect and we can use ptr to build the freelist. - when a new object is created, we put it in the empty slot i at the head of the freelist, and set the id to s[i].id; - when an object is destroyed, we append its slot i to the end of the freelist, and set s[i].id += M (note M, not N). - on a lookup for id = X, we look at slot i = X & (M-1), and consider the lookup successful only if the slot is not empty and s[i].id == X; - wraps occur at most every F * 2^32/M operations, where F is the number of free slots. Because F is usually a reasonable fraction of M, we should not worry too much. - if the table fills up, we can extend it by increasing N - shrinking the table is more difficult as we might create collisions during the rehashing. * */ #include #ifdef _KERNEL #include #include #include #include #include #include MALLOC_DEFINE(M_IPFW_LUT, "ipfw_lookup", "IpFw lookup"); #define Malloc(n) malloc(n, M_IPFW_LUT, M_WAITOK) #define Calloc(n) calloc(n, M_IPFW_LUT, M_WAITOK | M_ZERO) #define Free(p) free(p, M_IPFW_LUT) #define log(x, arg...) #else /* !_KERNEL */ #include #include #include #include #define Malloc(n) malloc(n) #define Calloc(n) calloc(1, n) #define Free(p) free(p) #define log(x, arg...) fprintf(stderr, "%s: " x "\n", __FUNCTION__, ##arg) #endif /* !_KERNEL */ struct entry { uint32_t id; struct entry *ptr; }; struct lookup_table { int _size; int used; int mask; /* 2^k -1, used for hashing */ struct entry *f_head, *f_tail; /* freelist */ struct entry * s; /* slots, array of N entries */ }; static __inline int empty(struct lookup_table *head, const void *p) { const struct entry *ep = p; return (ep == NULL || (ep >= head->s && ep < &head->s[head->_size])); } /* * init or reinit a table */ struct lookup_table * ipfw_lut_init(struct lookup_table *head, int new_size, int mask) { int i; struct entry *s; /* the new slots */ struct entry *fh, *ft; /* the freelist */ if (head != NULL) { mask = head->mask; if (new_size <= head->_size) return head; if (new_size >= mask+1) { log("size larger than mask"); return NULL; } } else { log("old is null, initialize"); head = Calloc(sizeof(*head)); if (head == NULL) return NULL; if (new_size >= mask) mask = new_size; if (mask & (mask -1)) { for (i = 1; i < mask; i += i) ; log("mask %d not 2^k, round up to %d", mask, i); mask = i; } mask = head->mask = mask - 1; } s = Calloc(new_size * sizeof(*s)); if (s == NULL) return NULL; if (!head->s) { head->s = s; head->_size = 1; } fh = ft = NULL; /* remap the entries, adjust the freelist */ for (i = 0; i < new_size; i++) { s[i].id = (i >= head->_size) ? i : head->s[i].id; if (i < head->_size && !empty(head, head->s[i].ptr)) { s[i].ptr = head->s[i].ptr; continue; } if (fh == NULL) fh = &s[i]; else ft->ptr = &s[i]; ft = &s[i]; } head->f_head = fh; head->f_tail = ft; /* write lock on the structure, to protect the readers */ fh = head->s; head->s = s; head->_size = new_size; /* release write lock */ if (fh != s) Free(fh); log("done"); return head; } /* insert returns the id */ int ipfw_lut_insert(struct lookup_table *head, void *d) { struct entry *e; e = head->f_head; if (e == NULL) return -1; head->f_head = e->ptr; e->ptr = d; head->used++; return e->id; } /* delete, returns the original entry */ void * ipfw_lut_delete(struct lookup_table *head, int id) { int i = id & head->mask; void *result; struct entry *e; if (i >= head->_size) return NULL; e = &head->s[i]; if (e->id != id) return NULL; result = e->ptr; /* write lock to invalidate the entry to readers */ e->id += head->mask + 1; /* prepare for next insert */ e->ptr = NULL; /* release write lock */ if (head->f_head == NULL) head->f_head = e; else head->f_tail->ptr = e; head->f_tail = e; head->used--; return result; } void * ipfw_lut_lookup(struct lookup_table *head, int id) { int i = id & head->mask; struct entry *e; if (i >= head->_size) return NULL; e = &head->s[i]; return (e->id == id) ? e->ptr : NULL; } void ipfw_lut_dump(struct lookup_table *head) { int i; log("head %p size %d used %d freelist %d", head, head->_size, head->used, head->f_head ? head->f_head - head->s : -1); for (i = 0; i < head->_size; i++) { struct entry *e = &head->s[i]; char ee = empty(head, e->ptr) ? 'E' : ' '; log("%5d %5d %c %p", i, e->id, ee, ee == 'E' && e->ptr != NULL ? (void *)((struct entry *)e->ptr - head->s) : e->ptr); } } #ifndef _KERNEL void dump_p(struct lookup_table *p, int *map) { int i; for (i = 0; i < p->_size; i++) { int id = (int)ipfw_lut_lookup(p, map[i]); log("%3d: %3d: %c", map[i] % 64, i, id); } } int main(int argc, char *argv[]) { int i, j, l; #define S 1000 int map[S]; struct lookup_table *p; struct lookup_table *p1; const char *m = "nel mezzo del cammin di nostra vita mi ritrovai" " in una selva oscura e la diritta via era smarrita!"; fprintf(stderr, "testing lookup\n"); l = strlen(m); p = ipfw_lut_init(NULL, 120, 33); ipfw_lut_dump(p); for (i = 0; i < l; i++) { int x = m[i]; int id = ipfw_lut_insert(p, (void *)x); //ipfw_lut_dump(p); map[i] = id; for (j=0; j < 10; j++) { id = ipfw_lut_insert(p, (void *)'a'); // ipfw_lut_dump(p); ipfw_lut_delete(p, id); // ipfw_lut_dump(p); } // ipfw_lut_dump(p); } dump_p(p, map); p1 = ipfw_lut_init(p, 23, 0); if (!p1) return 1; dump_p(p1, map); p1 = ipfw_lut_init(p1, 120, 0); if (!p1) return 1; dump_p(p1, map); return 0; } #endif /* end of file */ ipfw3-2012/sys/net/pfil.h000644 000423 000000 00000007740 12006744011 015440 0ustar00luigiwheel000000 000000 /* $FreeBSD: src/sys/net/pfil.h,v 1.16 2007/06/08 12:43:25 gallatin Exp $ */ /* $NetBSD: pfil.h,v 1.22 2003/06/23 12:57:08 martin Exp $ */ /*- * Copyright (c) 1996 Matthew R. Green * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef _NET_PFIL_H_ #define _NET_PFIL_H_ #include #include #include #include #include #include struct mbuf; struct ifnet; struct inpcb; /* * The packet filter hooks are designed for anything to call them to * possibly intercept the packet. */ struct packet_filter_hook { TAILQ_ENTRY(packet_filter_hook) pfil_link; int (*pfil_func)(void *, struct mbuf **, struct ifnet *, int, struct inpcb *); void *pfil_arg; }; #define PFIL_IN 0x00000001 #define PFIL_OUT 0x00000002 #define PFIL_WAITOK 0x00000004 #define PFIL_ALL (PFIL_IN|PFIL_OUT) typedef TAILQ_HEAD(pfil_list, packet_filter_hook) pfil_list_t; #define PFIL_TYPE_AF 1 /* key is AF_* type */ #define PFIL_TYPE_IFNET 2 /* key is ifnet pointer */ struct pfil_head { pfil_list_t ph_in; pfil_list_t ph_out; int ph_type; int ph_nhooks; #if defined( __linux__ ) || defined( _WIN32 ) rwlock_t ph_mtx; #else struct rmlock ph_lock; #endif union { u_long phu_val; void *phu_ptr; } ph_un; #define ph_af ph_un.phu_val #define ph_ifnet ph_un.phu_ptr LIST_ENTRY(pfil_head) ph_list; }; int pfil_add_hook(int (*func)(void *, struct mbuf **, struct ifnet *, int, struct inpcb *), void *, int, struct pfil_head *); int pfil_remove_hook(int (*func)(void *, struct mbuf **, struct ifnet *, int, struct inpcb *), void *, int, struct pfil_head *); int pfil_run_hooks(struct pfil_head *, struct mbuf **, struct ifnet *, int, struct inpcb *inp); int pfil_head_register(struct pfil_head *); int pfil_head_unregister(struct pfil_head *); struct pfil_head *pfil_head_get(int, u_long); #define PFIL_HOOKED(p) ((p)->ph_nhooks > 0) #define PFIL_LOCK_INIT(p) \ rm_init_flags(&(p)->ph_lock, "PFil hook read/write mutex", RM_RECURSE) #define PFIL_LOCK_DESTROY(p) rm_destroy(&(p)->ph_lock) #define PFIL_RLOCK(p, t) rm_rlock(&(p)->ph_lock, (t)) #define PFIL_WLOCK(p) rm_wlock(&(p)->ph_lock) #define PFIL_RUNLOCK(p, t) rm_runlock(&(p)->ph_lock, (t)) #define PFIL_WUNLOCK(p) rm_wunlock(&(p)->ph_lock) #define PFIL_LIST_LOCK() mtx_lock(&pfil_global_lock) #define PFIL_LIST_UNLOCK() mtx_unlock(&pfil_global_lock) static __inline struct packet_filter_hook * pfil_hook_get(int dir, struct pfil_head *ph) { if (dir == PFIL_IN) return (TAILQ_FIRST(&ph->ph_in)); else if (dir == PFIL_OUT) return (TAILQ_FIRST(&ph->ph_out)); else return (NULL); } #endif /* _NET_PFIL_H_ */ ipfw3-2012/sys/net/if.h000644 000423 000000 00000000026 12006744011 015072 0ustar00luigiwheel000000 000000 #include ipfw3-2012/sys/net/radix.c000644 000423 000000 00000076435 12010150105 015605 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 1988, 1989, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)radix.c 8.5 (Berkeley) 5/19/95 * $FreeBSD: head/sys/net/radix.c 200354 2009-12-10 10:34:30Z luigi $ */ /* * Routines to build and maintain radix trees for routing lookups. */ #include #ifdef _KERNEL #include #include #include #include #include #include #include #include "opt_mpath.h" #ifdef RADIX_MPATH #include #endif #else /* !_KERNEL */ #include #include #include #define log(x, arg...) fprintf(stderr, ## arg) #define panic(x) fprintf(stderr, "PANIC: %s", x), exit(1) #define min(a, b) ((a) < (b) ? (a) : (b) ) #include #endif /* !_KERNEL */ static int rn_walktree_from(struct radix_node_head *h, void *a, void *m, walktree_f_t *f, void *w); static int rn_walktree(struct radix_node_head *, walktree_f_t *, void *); static struct radix_node *rn_insert(void *, struct radix_node_head *, int *, struct radix_node [2]), *rn_newpair(void *, int, struct radix_node[2]), *rn_search(void *, struct radix_node *), *rn_search_m(void *, struct radix_node *, void *); static int max_keylen; static struct radix_mask *rn_mkfreelist; static struct radix_node_head *mask_rnhead; /* * Work area -- the following point to 3 buffers of size max_keylen, * allocated in this order in a block of memory malloc'ed by rn_init. * rn_zeros, rn_ones are set in rn_init and used in readonly afterwards. * addmask_key is used in rn_addmask in rw mode and not thread-safe. */ static char *rn_zeros, *rn_ones, *addmask_key; #define MKGet(m) { \ if (rn_mkfreelist) { \ m = rn_mkfreelist; \ rn_mkfreelist = (m)->rm_mklist; \ } else \ R_Malloc(m, struct radix_mask *, sizeof (struct radix_mask)); } #define MKFree(m) { (m)->rm_mklist = rn_mkfreelist; rn_mkfreelist = (m);} #define rn_masktop (mask_rnhead->rnh_treetop) static int rn_lexobetter(void *m_arg, void *n_arg); static struct radix_mask * rn_new_radix_mask(struct radix_node *tt, struct radix_mask *next); static int rn_satisfies_leaf(char *trial, struct radix_node *leaf, int skip); /* * The data structure for the keys is a radix tree with one way * branching removed. The index rn_bit at an internal node n represents a bit * position to be tested. The tree is arranged so that all descendants * of a node n have keys whose bits all agree up to position rn_bit - 1. * (We say the index of n is rn_bit.) * * There is at least one descendant which has a one bit at position rn_bit, * and at least one with a zero there. * * A route is determined by a pair of key and mask. We require that the * bit-wise logical and of the key and mask to be the key. * We define the index of a route to associated with the mask to be * the first bit number in the mask where 0 occurs (with bit number 0 * representing the highest order bit). * * We say a mask is normal if every bit is 0, past the index of the mask. * If a node n has a descendant (k, m) with index(m) == index(n) == rn_bit, * and m is a normal mask, then the route applies to every descendant of n. * If the index(m) < rn_bit, this implies the trailing last few bits of k * before bit b are all 0, (and hence consequently true of every descendant * of n), so the route applies to all descendants of the node as well. * * Similar logic shows that a non-normal mask m such that * index(m) <= index(n) could potentially apply to many children of n. * Thus, for each non-host route, we attach its mask to a list at an internal * node as high in the tree as we can go. * * The present version of the code makes use of normal routes in short- * circuiting an explict mask and compare operation when testing whether * a key satisfies a normal route, and also in remembering the unique leaf * that governs a subtree. */ /* * Most of the functions in this code assume that the key/mask arguments * are sockaddr-like structures, where the first byte is an u_char * indicating the size of the entire structure. * * To make the assumption more explicit, we use the LEN() macro to access * this field. It is safe to pass an expression with side effects * to LEN() as the argument is evaluated only once. * We cast the result to int as this is the dominant usage. */ #define LEN(x) ( (int) (*(const u_char *)(x)) ) /* * XXX THIS NEEDS TO BE FIXED * In the code, pointers to keys and masks are passed as either * 'void *' (because callers use to pass pointers of various kinds), or * 'caddr_t' (which is fine for pointer arithmetics, but not very * clean when you dereference it to access data). Furthermore, caddr_t * is really 'char *', while the natural type to operate on keys and * masks would be 'u_char'. This mismatch require a lot of casts and * intermediate variables to adapt types that clutter the code. */ /* * Search a node in the tree matching the key. */ static struct radix_node * rn_search(v_arg, head) void *v_arg; struct radix_node *head; { register struct radix_node *x; register caddr_t v; for (x = head, v = v_arg; x->rn_bit >= 0;) { if (x->rn_bmask & v[x->rn_offset]) x = x->rn_right; else x = x->rn_left; } return (x); } /* * Same as above, but with an additional mask. * XXX note this function is used only once. */ static struct radix_node * rn_search_m(v_arg, head, m_arg) struct radix_node *head; void *v_arg, *m_arg; { register struct radix_node *x; register caddr_t v = v_arg, m = m_arg; for (x = head; x->rn_bit >= 0;) { if ((x->rn_bmask & m[x->rn_offset]) && (x->rn_bmask & v[x->rn_offset])) x = x->rn_right; else x = x->rn_left; } return x; } int rn_refines(m_arg, n_arg) void *m_arg, *n_arg; { register caddr_t m = m_arg, n = n_arg; register caddr_t lim, lim2 = lim = n + LEN(n); int longer = LEN(n++) - LEN(m++); int masks_are_equal = 1; if (longer > 0) lim -= longer; while (n < lim) { if (*n & ~(*m)) return 0; if (*n++ != *m++) masks_are_equal = 0; } while (n < lim2) if (*n++) return 0; if (masks_are_equal && (longer < 0)) for (lim2 = m - longer; m < lim2; ) if (*m++) return 1; return (!masks_are_equal); } struct radix_node * rn_lookup(v_arg, m_arg, head) void *v_arg, *m_arg; struct radix_node_head *head; { register struct radix_node *x; caddr_t netmask = 0; if (m_arg) { x = rn_addmask(m_arg, 1, head->rnh_treetop->rn_offset); if (x == 0) return (0); netmask = x->rn_key; } x = rn_match(v_arg, head); if (x && netmask) { while (x && x->rn_mask != netmask) x = x->rn_dupedkey; } return x; } static int rn_satisfies_leaf(trial, leaf, skip) char *trial; register struct radix_node *leaf; int skip; { register char *cp = trial, *cp2 = leaf->rn_key, *cp3 = leaf->rn_mask; char *cplim; int length = min(LEN(cp), LEN(cp2)); if (cp3 == NULL) cp3 = rn_ones; else length = min(length, LEN(cp3)); cplim = cp + length; cp3 += skip; cp2 += skip; for (cp += skip; cp < cplim; cp++, cp2++, cp3++) if ((*cp ^ *cp2) & *cp3) return 0; return 1; } struct radix_node * rn_match(v_arg, head) void *v_arg; struct radix_node_head *head; { caddr_t v = v_arg; register struct radix_node *t = head->rnh_treetop, *x; register caddr_t cp = v, cp2; caddr_t cplim; struct radix_node *saved_t, *top = t; int off = t->rn_offset, vlen = LEN(cp), matched_off; register int test, b, rn_bit; /* * Open code rn_search(v, top) to avoid overhead of extra * subroutine call. */ for (; t->rn_bit >= 0; ) { if (t->rn_bmask & cp[t->rn_offset]) t = t->rn_right; else t = t->rn_left; } /* * See if we match exactly as a host destination * or at least learn how many bits match, for normal mask finesse. * * It doesn't hurt us to limit how many bytes to check * to the length of the mask, since if it matches we had a genuine * match and the leaf we have is the most specific one anyway; * if it didn't match with a shorter length it would fail * with a long one. This wins big for class B&C netmasks which * are probably the most common case... */ if (t->rn_mask) vlen = *(u_char *)t->rn_mask; cp += off; cp2 = t->rn_key + off; cplim = v + vlen; for (; cp < cplim; cp++, cp2++) if (*cp != *cp2) goto on1; /* * This extra grot is in case we are explicitly asked * to look up the default. Ugh! * * Never return the root node itself, it seems to cause a * lot of confusion. */ if (t->rn_flags & RNF_ROOT) t = t->rn_dupedkey; return t; on1: test = (*cp ^ *cp2) & 0xff; /* find first bit that differs */ for (b = 7; (test >>= 1) > 0;) b--; matched_off = cp - v; b += matched_off << 3; rn_bit = -1 - b; /* * If there is a host route in a duped-key chain, it will be first. */ if ((saved_t = t)->rn_mask == 0) t = t->rn_dupedkey; for (; t; t = t->rn_dupedkey) /* * Even if we don't match exactly as a host, * we may match if the leaf we wound up at is * a route to a net. */ if (t->rn_flags & RNF_NORMAL) { if (rn_bit <= t->rn_bit) return t; } else if (rn_satisfies_leaf(v, t, matched_off)) return t; t = saved_t; /* start searching up the tree */ do { register struct radix_mask *m; t = t->rn_parent; m = t->rn_mklist; /* * If non-contiguous masks ever become important * we can restore the masking and open coding of * the search and satisfaction test and put the * calculation of "off" back before the "do". */ while (m) { if (m->rm_flags & RNF_NORMAL) { if (rn_bit <= m->rm_bit) return (m->rm_leaf); } else { off = min(t->rn_offset, matched_off); x = rn_search_m(v, t, m->rm_mask); while (x && x->rn_mask != m->rm_mask) x = x->rn_dupedkey; if (x && rn_satisfies_leaf(v, x, off)) return x; } m = m->rm_mklist; } } while (t != top); return 0; } #ifdef RN_DEBUG int rn_nodenum; struct radix_node *rn_clist; int rn_saveinfo; int rn_debug = 1; #endif /* * Whenever we add a new leaf to the tree, we also add a parent node, * so we allocate them as an array of two elements: the first one must be * the leaf (see RNTORT() in route.c), the second one is the parent. * This routine initializes the relevant fields of the nodes, so that * the leaf is the left child of the parent node, and both nodes have * (almost) all all fields filled as appropriate. * (XXX some fields are left unset, see the '#if 0' section). * The function returns a pointer to the parent node. */ static struct radix_node * rn_newpair(v, b, nodes) void *v; int b; struct radix_node nodes[2]; { register struct radix_node *tt = nodes, *t = tt + 1; t->rn_bit = b; t->rn_bmask = 0x80 >> (b & 7); t->rn_left = tt; t->rn_offset = b >> 3; #if 0 /* XXX perhaps we should fill these fields as well. */ t->rn_parent = t->rn_right = NULL; tt->rn_mask = NULL; tt->rn_dupedkey = NULL; tt->rn_bmask = 0; #endif tt->rn_bit = -1; tt->rn_key = (caddr_t)v; tt->rn_parent = t; tt->rn_flags = t->rn_flags = RNF_ACTIVE; tt->rn_mklist = t->rn_mklist = 0; #ifdef RN_DEBUG tt->rn_info = rn_nodenum++; t->rn_info = rn_nodenum++; tt->rn_twin = t; tt->rn_ybro = rn_clist; rn_clist = tt; #endif return t; } static struct radix_node * rn_insert(v_arg, head, dupentry, nodes) void *v_arg; struct radix_node_head *head; int *dupentry; struct radix_node nodes[2]; { caddr_t v = v_arg; struct radix_node *top = head->rnh_treetop; int head_off = top->rn_offset, vlen = LEN(v); register struct radix_node *t = rn_search(v_arg, top); register caddr_t cp = v + head_off; register int b; struct radix_node *tt; /* * Find first bit at which v and t->rn_key differ */ { register caddr_t cp2 = t->rn_key + head_off; register int cmp_res; caddr_t cplim = v + vlen; while (cp < cplim) if (*cp2++ != *cp++) goto on1; *dupentry = 1; return t; on1: *dupentry = 0; cmp_res = (cp[-1] ^ cp2[-1]) & 0xff; for (b = (cp - v) << 3; cmp_res; b--) cmp_res >>= 1; } { register struct radix_node *p, *x = top; cp = v; do { p = x; if (cp[x->rn_offset] & x->rn_bmask) x = x->rn_right; else x = x->rn_left; } while (b > (unsigned) x->rn_bit); /* x->rn_bit < b && x->rn_bit >= 0 */ #ifdef RN_DEBUG if (rn_debug) log(LOG_DEBUG, "rn_insert: Going In:\n"), traverse(p); #endif t = rn_newpair(v_arg, b, nodes); tt = t->rn_left; if ((cp[p->rn_offset] & p->rn_bmask) == 0) p->rn_left = t; else p->rn_right = t; x->rn_parent = t; t->rn_parent = p; /* frees x, p as temp vars below */ if ((cp[t->rn_offset] & t->rn_bmask) == 0) { t->rn_right = x; } else { t->rn_right = tt; t->rn_left = x; } #ifdef RN_DEBUG if (rn_debug) log(LOG_DEBUG, "rn_insert: Coming Out:\n"), traverse(p); #endif } return (tt); } struct radix_node * rn_addmask(n_arg, search, skip) int search, skip; void *n_arg; { caddr_t netmask = (caddr_t)n_arg; register struct radix_node *x; register caddr_t cp, cplim; register int b = 0, mlen, j; int maskduplicated, m0, isnormal; struct radix_node *saved_x; static int last_zeroed = 0; if ((mlen = LEN(netmask)) > max_keylen) mlen = max_keylen; if (skip == 0) skip = 1; if (mlen <= skip) return (mask_rnhead->rnh_nodes); if (skip > 1) bcopy(rn_ones + 1, addmask_key + 1, skip - 1); if ((m0 = mlen) > skip) bcopy(netmask + skip, addmask_key + skip, mlen - skip); /* * Trim trailing zeroes. */ for (cp = addmask_key + mlen; (cp > addmask_key) && cp[-1] == 0;) cp--; mlen = cp - addmask_key; if (mlen <= skip) { if (m0 >= last_zeroed) last_zeroed = mlen; return (mask_rnhead->rnh_nodes); } if (m0 < last_zeroed) bzero(addmask_key + m0, last_zeroed - m0); *addmask_key = last_zeroed = mlen; x = rn_search(addmask_key, rn_masktop); if (bcmp(addmask_key, x->rn_key, mlen) != 0) x = 0; if (x || search) return (x); R_Zalloc(x, struct radix_node *, max_keylen + 2 * sizeof (*x)); if ((saved_x = x) == 0) return (0); netmask = cp = (caddr_t)(x + 2); bcopy(addmask_key, cp, mlen); x = rn_insert(cp, mask_rnhead, &maskduplicated, x); if (maskduplicated) { log(LOG_ERR, "rn_addmask: mask impossibly already in tree"); Free(saved_x); return (x); } /* * Calculate index of mask, and check for normalcy. * First find the first byte with a 0 bit, then if there are * more bits left (remember we already trimmed the trailing 0's), * the pattern must be one of those in normal_chars[], or we have * a non-contiguous mask. */ cplim = netmask + mlen; isnormal = 1; for (cp = netmask + skip; (cp < cplim) && *(u_char *)cp == 0xff;) cp++; if (cp != cplim) { static char normal_chars[] = { 0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff}; for (j = 0x80; (j & *cp) != 0; j >>= 1) b++; if (*cp != normal_chars[b] || cp != (cplim - 1)) isnormal = 0; } b += (cp - netmask) << 3; x->rn_bit = -1 - b; if (isnormal) x->rn_flags |= RNF_NORMAL; return (x); } static int /* XXX: arbitrary ordering for non-contiguous masks */ rn_lexobetter(m_arg, n_arg) void *m_arg, *n_arg; { register u_char *mp = m_arg, *np = n_arg, *lim; if (LEN(mp) > LEN(np)) return 1; /* not really, but need to check longer one first */ if (LEN(mp) == LEN(np)) for (lim = mp + LEN(mp); mp < lim;) if (*mp++ > *np++) return 1; return 0; } static struct radix_mask * rn_new_radix_mask(tt, next) register struct radix_node *tt; register struct radix_mask *next; { register struct radix_mask *m; MKGet(m); if (m == 0) { log(LOG_ERR, "Mask for route not entered\n"); return (0); } bzero(m, sizeof *m); m->rm_bit = tt->rn_bit; m->rm_flags = tt->rn_flags; if (tt->rn_flags & RNF_NORMAL) m->rm_leaf = tt; else m->rm_mask = tt->rn_mask; m->rm_mklist = next; tt->rn_mklist = m; return m; } struct radix_node * rn_addroute(v_arg, n_arg, head, treenodes) void *v_arg, *n_arg; struct radix_node_head *head; struct radix_node treenodes[2]; { caddr_t v = (caddr_t)v_arg, netmask = (caddr_t)n_arg; register struct radix_node *t, *x = 0, *tt; struct radix_node *saved_tt, *top = head->rnh_treetop; short b = 0, b_leaf = 0; int keyduplicated; caddr_t mmask; struct radix_mask *m, **mp; /* * In dealing with non-contiguous masks, there may be * many different routes which have the same mask. * We will find it useful to have a unique pointer to * the mask to speed avoiding duplicate references at * nodes and possibly save time in calculating indices. */ if (netmask) { if ((x = rn_addmask(netmask, 0, top->rn_offset)) == 0) return (0); b_leaf = x->rn_bit; b = -1 - x->rn_bit; netmask = x->rn_key; } /* * Deal with duplicated keys: attach node to previous instance */ saved_tt = tt = rn_insert(v, head, &keyduplicated, treenodes); if (keyduplicated) { for (t = tt; tt; t = tt, tt = tt->rn_dupedkey) { #ifdef RADIX_MPATH /* permit multipath, if enabled for the family */ if (rn_mpath_capable(head) && netmask == tt->rn_mask) { /* * go down to the end of multipaths, so that * new entry goes into the end of rn_dupedkey * chain. */ do { t = tt; tt = tt->rn_dupedkey; } while (tt && t->rn_mask == tt->rn_mask); break; } #endif if (tt->rn_mask == netmask) return (0); if (netmask == 0 || (tt->rn_mask && ((b_leaf < tt->rn_bit) /* index(netmask) > node */ || rn_refines(netmask, tt->rn_mask) || rn_lexobetter(netmask, tt->rn_mask)))) break; } /* * If the mask is not duplicated, we wouldn't * find it among possible duplicate key entries * anyway, so the above test doesn't hurt. * * We sort the masks for a duplicated key the same way as * in a masklist -- most specific to least specific. * This may require the unfortunate nuisance of relocating * the head of the list. * * We also reverse, or doubly link the list through the * parent pointer. */ if (tt == saved_tt) { struct radix_node *xx = x; /* link in at head of list */ (tt = treenodes)->rn_dupedkey = t; tt->rn_flags = t->rn_flags; tt->rn_parent = x = t->rn_parent; t->rn_parent = tt; /* parent */ if (x->rn_left == t) x->rn_left = tt; else x->rn_right = tt; saved_tt = tt; x = xx; } else { (tt = treenodes)->rn_dupedkey = t->rn_dupedkey; t->rn_dupedkey = tt; tt->rn_parent = t; /* parent */ if (tt->rn_dupedkey) /* parent */ tt->rn_dupedkey->rn_parent = tt; /* parent */ } #ifdef RN_DEBUG t=tt+1; tt->rn_info = rn_nodenum++; t->rn_info = rn_nodenum++; tt->rn_twin = t; tt->rn_ybro = rn_clist; rn_clist = tt; #endif tt->rn_key = (caddr_t) v; tt->rn_bit = -1; tt->rn_flags = RNF_ACTIVE; } /* * Put mask in tree. */ if (netmask) { tt->rn_mask = netmask; tt->rn_bit = x->rn_bit; tt->rn_flags |= x->rn_flags & RNF_NORMAL; } t = saved_tt->rn_parent; if (keyduplicated) goto on2; b_leaf = -1 - t->rn_bit; if (t->rn_right == saved_tt) x = t->rn_left; else x = t->rn_right; /* Promote general routes from below */ if (x->rn_bit < 0) { for (mp = &t->rn_mklist; x; x = x->rn_dupedkey) if (x->rn_mask && (x->rn_bit >= b_leaf) && x->rn_mklist == 0) { *mp = m = rn_new_radix_mask(x, 0); if (m) mp = &m->rm_mklist; } } else if (x->rn_mklist) { /* * Skip over masks whose index is > that of new node */ for (mp = &x->rn_mklist; (m = *mp); mp = &m->rm_mklist) if (m->rm_bit >= b_leaf) break; t->rn_mklist = m; *mp = 0; } on2: /* Add new route to highest possible ancestor's list */ if ((netmask == 0) || (b > t->rn_bit )) return tt; /* can't lift at all */ b_leaf = tt->rn_bit; do { x = t; t = t->rn_parent; } while (b <= t->rn_bit && x != top); /* * Search through routes associated with node to * insert new route according to index. * Need same criteria as when sorting dupedkeys to avoid * double loop on deletion. */ for (mp = &x->rn_mklist; (m = *mp); mp = &m->rm_mklist) { if (m->rm_bit < b_leaf) continue; if (m->rm_bit > b_leaf) break; if (m->rm_flags & RNF_NORMAL) { mmask = m->rm_leaf->rn_mask; if (tt->rn_flags & RNF_NORMAL) { #if !defined(RADIX_MPATH) log(LOG_ERR, "Non-unique normal route, mask not entered\n"); #endif return tt; } } else mmask = m->rm_mask; if (mmask == netmask) { m->rm_refs++; tt->rn_mklist = m; return tt; } if (rn_refines(netmask, mmask) || rn_lexobetter(netmask, mmask)) break; } *mp = rn_new_radix_mask(tt, *mp); return tt; } struct radix_node * rn_delete(v_arg, netmask_arg, head) void *v_arg, *netmask_arg; struct radix_node_head *head; { register struct radix_node *t, *p, *x, *tt; struct radix_mask *m, *saved_m, **mp; struct radix_node *dupedkey, *saved_tt, *top; caddr_t v, netmask; int b, head_off, vlen; v = v_arg; netmask = netmask_arg; x = head->rnh_treetop; tt = rn_search(v, x); head_off = x->rn_offset; vlen = LEN(v); saved_tt = tt; top = x; if (tt == 0 || bcmp(v + head_off, tt->rn_key + head_off, vlen - head_off)) return (0); /* * Delete our route from mask lists. */ if (netmask) { if ((x = rn_addmask(netmask, 1, head_off)) == 0) return (0); netmask = x->rn_key; while (tt->rn_mask != netmask) if ((tt = tt->rn_dupedkey) == 0) return (0); } if (tt->rn_mask == 0 || (saved_m = m = tt->rn_mklist) == 0) goto on1; if (tt->rn_flags & RNF_NORMAL) { if (m->rm_leaf != tt || m->rm_refs > 0) { log(LOG_ERR, "rn_delete: inconsistent annotation\n"); return 0; /* dangling ref could cause disaster */ } } else { if (m->rm_mask != tt->rn_mask) { log(LOG_ERR, "rn_delete: inconsistent annotation\n"); goto on1; } if (--m->rm_refs >= 0) goto on1; } b = -1 - tt->rn_bit; t = saved_tt->rn_parent; if (b > t->rn_bit) goto on1; /* Wasn't lifted at all */ do { x = t; t = t->rn_parent; } while (b <= t->rn_bit && x != top); for (mp = &x->rn_mklist; (m = *mp); mp = &m->rm_mklist) if (m == saved_m) { *mp = m->rm_mklist; MKFree(m); break; } if (m == 0) { log(LOG_ERR, "rn_delete: couldn't find our annotation\n"); if (tt->rn_flags & RNF_NORMAL) return (0); /* Dangling ref to us */ } on1: /* * Eliminate us from tree */ if (tt->rn_flags & RNF_ROOT) return (0); #ifdef RN_DEBUG /* Get us out of the creation list */ for (t = rn_clist; t && t->rn_ybro != tt; t = t->rn_ybro) {} if (t) t->rn_ybro = tt->rn_ybro; #endif t = tt->rn_parent; dupedkey = saved_tt->rn_dupedkey; if (dupedkey) { /* * Here, tt is the deletion target and * saved_tt is the head of the dupekey chain. */ if (tt == saved_tt) { /* remove from head of chain */ x = dupedkey; x->rn_parent = t; if (t->rn_left == tt) t->rn_left = x; else t->rn_right = x; } else { /* find node in front of tt on the chain */ for (x = p = saved_tt; p && p->rn_dupedkey != tt;) p = p->rn_dupedkey; if (p) { p->rn_dupedkey = tt->rn_dupedkey; if (tt->rn_dupedkey) /* parent */ tt->rn_dupedkey->rn_parent = p; /* parent */ } else log(LOG_ERR, "rn_delete: couldn't find us\n"); } t = tt + 1; if (t->rn_flags & RNF_ACTIVE) { #ifndef RN_DEBUG *++x = *t; p = t->rn_parent; #else b = t->rn_info; *++x = *t; t->rn_info = b; p = t->rn_parent; #endif if (p->rn_left == t) p->rn_left = x; else p->rn_right = x; x->rn_left->rn_parent = x; x->rn_right->rn_parent = x; } goto out; } if (t->rn_left == tt) x = t->rn_right; else x = t->rn_left; p = t->rn_parent; if (p->rn_right == t) p->rn_right = x; else p->rn_left = x; x->rn_parent = p; /* * Demote routes attached to us. */ if (t->rn_mklist) { if (x->rn_bit >= 0) { for (mp = &x->rn_mklist; (m = *mp);) mp = &m->rm_mklist; *mp = t->rn_mklist; } else { /* If there are any key,mask pairs in a sibling duped-key chain, some subset will appear sorted in the same order attached to our mklist */ for (m = t->rn_mklist; m && x; x = x->rn_dupedkey) if (m == x->rn_mklist) { struct radix_mask *mm = m->rm_mklist; x->rn_mklist = 0; if (--(m->rm_refs) < 0) MKFree(m); m = mm; } if (m) log(LOG_ERR, "rn_delete: Orphaned Mask %p at %p\n", m, x); } } /* * We may be holding an active internal node in the tree. */ x = tt + 1; if (t != x) { #ifndef RN_DEBUG *t = *x; #else b = t->rn_info; *t = *x; t->rn_info = b; #endif t->rn_left->rn_parent = t; t->rn_right->rn_parent = t; p = x->rn_parent; if (p->rn_left == x) p->rn_left = t; else p->rn_right = t; } out: tt->rn_flags &= ~RNF_ACTIVE; tt[1].rn_flags &= ~RNF_ACTIVE; return (tt); } /* * This is the same as rn_walktree() except for the parameters and the * exit. */ static int rn_walktree_from(h, a, m, f, w) struct radix_node_head *h; void *a, *m; walktree_f_t *f; void *w; { int error; struct radix_node *base, *next; u_char *xa = (u_char *)a; u_char *xm = (u_char *)m; register struct radix_node *rn, *last = 0 /* shut up gcc */; int stopping = 0; int lastb; /* * rn_search_m is sort-of-open-coded here. We cannot use the * function because we need to keep track of the last node seen. */ /* printf("about to search\n"); */ for (rn = h->rnh_treetop; rn->rn_bit >= 0; ) { last = rn; /* printf("rn_bit %d, rn_bmask %x, xm[rn_offset] %x\n", rn->rn_bit, rn->rn_bmask, xm[rn->rn_offset]); */ if (!(rn->rn_bmask & xm[rn->rn_offset])) { break; } if (rn->rn_bmask & xa[rn->rn_offset]) { rn = rn->rn_right; } else { rn = rn->rn_left; } } /* printf("done searching\n"); */ /* * Two cases: either we stepped off the end of our mask, * in which case last == rn, or we reached a leaf, in which * case we want to start from the last node we looked at. * Either way, last is the node we want to start from. */ rn = last; lastb = rn->rn_bit; /* printf("rn %p, lastb %d\n", rn, lastb);*/ /* * This gets complicated because we may delete the node * while applying the function f to it, so we need to calculate * the successor node in advance. */ while (rn->rn_bit >= 0) rn = rn->rn_left; while (!stopping) { /* printf("node %p (%d)\n", rn, rn->rn_bit); */ base = rn; /* If at right child go back up, otherwise, go right */ while (rn->rn_parent->rn_right == rn && !(rn->rn_flags & RNF_ROOT)) { rn = rn->rn_parent; /* if went up beyond last, stop */ if (rn->rn_bit <= lastb) { stopping = 1; /* printf("up too far\n"); */ /* * XXX we should jump to the 'Process leaves' * part, because the values of 'rn' and 'next' * we compute will not be used. Not a big deal * because this loop will terminate, but it is * inefficient and hard to understand! */ } } /* * At the top of the tree, no need to traverse the right * half, prevent the traversal of the entire tree in the * case of default route. */ if (rn->rn_parent->rn_flags & RNF_ROOT) stopping = 1; /* Find the next *leaf* since next node might vanish, too */ for (rn = rn->rn_parent->rn_right; rn->rn_bit >= 0;) rn = rn->rn_left; next = rn; /* Process leaves */ while ((rn = base) != 0) { base = rn->rn_dupedkey; /* printf("leaf %p\n", rn); */ if (!(rn->rn_flags & RNF_ROOT) && (error = (*f)(rn, w))) return (error); } rn = next; if (rn->rn_flags & RNF_ROOT) { /* printf("root, stopping"); */ stopping = 1; } } return 0; } static int rn_walktree(h, f, w) struct radix_node_head *h; walktree_f_t *f; void *w; { int error; struct radix_node *base, *next; register struct radix_node *rn = h->rnh_treetop; /* * This gets complicated because we may delete the node * while applying the function f to it, so we need to calculate * the successor node in advance. */ /* First time through node, go left */ while (rn->rn_bit >= 0) rn = rn->rn_left; for (;;) { base = rn; /* If at right child go back up, otherwise, go right */ while (rn->rn_parent->rn_right == rn && (rn->rn_flags & RNF_ROOT) == 0) rn = rn->rn_parent; /* Find the next *leaf* since next node might vanish, too */ for (rn = rn->rn_parent->rn_right; rn->rn_bit >= 0;) rn = rn->rn_left; next = rn; /* Process leaves */ while ((rn = base)) { base = rn->rn_dupedkey; if (!(rn->rn_flags & RNF_ROOT) && (error = (*f)(rn, w))) return (error); } rn = next; if (rn->rn_flags & RNF_ROOT) return (0); } /* NOTREACHED */ } /* * Allocate and initialize an empty tree. This has 3 nodes, which are * part of the radix_node_head (in the order ) and are * marked RNF_ROOT so they cannot be freed. * The leaves have all-zero and all-one keys, with significant * bits starting at 'off'. * Return 1 on success, 0 on error. */ int rn_inithead(head, off) void **head; int off; { register struct radix_node_head *rnh; register struct radix_node *t, *tt, *ttt; if (*head) return (1); R_Zalloc(rnh, struct radix_node_head *, sizeof (*rnh)); if (rnh == 0) return (0); #ifdef _KERNEL RADIX_NODE_HEAD_LOCK_INIT(rnh); #endif *head = rnh; t = rn_newpair(rn_zeros, off, rnh->rnh_nodes); ttt = rnh->rnh_nodes + 2; t->rn_right = ttt; t->rn_parent = t; tt = t->rn_left; /* ... which in turn is rnh->rnh_nodes */ tt->rn_flags = t->rn_flags = RNF_ROOT | RNF_ACTIVE; tt->rn_bit = -1 - off; *ttt = *tt; ttt->rn_key = rn_ones; rnh->rnh_addaddr = rn_addroute; rnh->rnh_deladdr = rn_delete; rnh->rnh_matchaddr = rn_match; rnh->rnh_lookup = rn_lookup; rnh->rnh_walktree = rn_walktree; rnh->rnh_walktree_from = rn_walktree_from; rnh->rnh_treetop = t; return (1); } int rn_detachhead(void **head) { struct radix_node_head *rnh; KASSERT((head != NULL && *head != NULL), ("%s: head already freed", __func__)); rnh = *head; /* Free nodes. */ Free(rnh); *head = NULL; return (1); } void rn_init(int maxk) { char *cp, *cplim; max_keylen = maxk; if (max_keylen == 0) { log(LOG_ERR, "rn_init: radix functions require max_keylen be set\n"); return; } R_Malloc(rn_zeros, char *, 3 * max_keylen); if (rn_zeros == NULL) panic("rn_init"); bzero(rn_zeros, 3 * max_keylen); rn_ones = cp = rn_zeros + max_keylen; addmask_key = cplim = rn_ones + max_keylen; while (cp < cplim) *cp++ = -1; if (rn_inithead((void **)(void *)&mask_rnhead, 0) == 0) panic("rn_init 2"); } ipfw3-2012/sys/net/radix.h000644 000423 000000 00000015541 12010150105 015601 0ustar00luigiwheel000000 000000 /*- * Copyright (c) 1988, 1989, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)radix.h 8.2 (Berkeley) 10/31/94 * $FreeBSD: head/sys/net/radix.h 185747 2008-12-07 21:15:43Z kmacy $ */ #ifndef _RADIX_H_ #define _RADIX_H_ #ifdef _KERNEL #include #include #include #endif #ifdef MALLOC_DECLARE MALLOC_DECLARE(M_RTABLE); #endif /* * Radix search tree node layout. */ struct radix_node { struct radix_mask *rn_mklist; /* list of masks contained in subtree */ struct radix_node *rn_parent; /* parent */ short rn_bit; /* bit offset; -1-index(netmask) */ char rn_bmask; /* node: mask for bit test*/ u_char rn_flags; /* enumerated next */ #define RNF_NORMAL 1 /* leaf contains normal route */ #define RNF_ROOT 2 /* leaf is root leaf for tree */ #define RNF_ACTIVE 4 /* This node is alive (for rtfree) */ union { struct { /* leaf only data: */ caddr_t rn_Key; /* object of search */ caddr_t rn_Mask; /* netmask, if present */ struct radix_node *rn_Dupedkey; } rn_leaf; struct { /* node only data: */ int rn_Off; /* where to start compare */ struct radix_node *rn_L;/* progeny */ struct radix_node *rn_R;/* progeny */ } rn_node; } rn_u; #ifdef RN_DEBUG int rn_info; struct radix_node *rn_twin; struct radix_node *rn_ybro; #endif }; #define rn_dupedkey rn_u.rn_leaf.rn_Dupedkey #define rn_key rn_u.rn_leaf.rn_Key #define rn_mask rn_u.rn_leaf.rn_Mask #define rn_offset rn_u.rn_node.rn_Off #define rn_left rn_u.rn_node.rn_L #define rn_right rn_u.rn_node.rn_R /* * Annotations to tree concerning potential routes applying to subtrees. */ struct radix_mask { short rm_bit; /* bit offset; -1-index(netmask) */ char rm_unused; /* cf. rn_bmask */ u_char rm_flags; /* cf. rn_flags */ struct radix_mask *rm_mklist; /* more masks to try */ union { caddr_t rmu_mask; /* the mask */ struct radix_node *rmu_leaf; /* for normal routes */ } rm_rmu; int rm_refs; /* # of references to this struct */ }; #define rm_mask rm_rmu.rmu_mask #define rm_leaf rm_rmu.rmu_leaf /* extra field would make 32 bytes */ typedef int walktree_f_t(struct radix_node *, void *); struct radix_node_head { struct radix_node *rnh_treetop; u_int rnh_gen; /* generation counter */ int rnh_multipath; /* multipath capable ? */ int rnh_addrsize; /* permit, but not require fixed keys */ int rnh_pktsize; /* permit, but not require fixed keys */ struct radix_node *(*rnh_addaddr) /* add based on sockaddr */ (void *v, void *mask, struct radix_node_head *head, struct radix_node nodes[]); struct radix_node *(*rnh_addpkt) /* add based on packet hdr */ (void *v, void *mask, struct radix_node_head *head, struct radix_node nodes[]); struct radix_node *(*rnh_deladdr) /* remove based on sockaddr */ (void *v, void *mask, struct radix_node_head *head); struct radix_node *(*rnh_delpkt) /* remove based on packet hdr */ (void *v, void *mask, struct radix_node_head *head); struct radix_node *(*rnh_matchaddr) /* locate based on sockaddr */ (void *v, struct radix_node_head *head); struct radix_node *(*rnh_lookup) /* locate based on sockaddr */ (void *v, void *mask, struct radix_node_head *head); struct radix_node *(*rnh_matchpkt) /* locate based on packet hdr */ (void *v, struct radix_node_head *head); int (*rnh_walktree) /* traverse tree */ (struct radix_node_head *head, walktree_f_t *f, void *w); int (*rnh_walktree_from) /* traverse tree below a */ (struct radix_node_head *head, void *a, void *m, walktree_f_t *f, void *w); void (*rnh_close) /* do something when the last ref drops */ (struct radix_node *rn, struct radix_node_head *head); struct radix_node rnh_nodes[3]; /* empty tree for common case */ #ifdef _KERNEL #if defined( __linux__ ) || defined( _WIN32 ) spinlock_t rnh_lock; #else struct rwlock rnh_lock; /* locks entire radix tree */ #endif /* !__linux__ */ #endif }; #ifndef _KERNEL #define R_Malloc(p, t, n) (p = (t) malloc((unsigned int)(n))) #define R_Zalloc(p, t, n) (p = (t) calloc(1,(unsigned int)(n))) #define Free(p) free((char *)p); #else #define R_Malloc(p, t, n) (p = (t) malloc((unsigned long)(n), M_RTABLE, M_NOWAIT)) #define R_Zalloc(p, t, n) (p = (t) malloc((unsigned long)(n), M_RTABLE, M_NOWAIT | M_ZERO)) #define Free(p) free((caddr_t)p, M_RTABLE); #define RADIX_NODE_HEAD_LOCK_INIT(rnh) \ rw_init_flags(&(rnh)->rnh_lock, "radix node head", 0) #define RADIX_NODE_HEAD_LOCK(rnh) rw_wlock(&(rnh)->rnh_lock) #define RADIX_NODE_HEAD_UNLOCK(rnh) rw_wunlock(&(rnh)->rnh_lock) #define RADIX_NODE_HEAD_RLOCK(rnh) rw_rlock(&(rnh)->rnh_lock) #define RADIX_NODE_HEAD_RUNLOCK(rnh) rw_runlock(&(rnh)->rnh_lock) #define RADIX_NODE_HEAD_LOCK_TRY_UPGRADE(rnh) rw_try_upgrade(&(rnh)->rnh_lock) #define RADIX_NODE_HEAD_DESTROY(rnh) rw_destroy(&(rnh)->rnh_lock) #define RADIX_NODE_HEAD_LOCK_ASSERT(rnh) rw_assert(&(rnh)->rnh_lock, RA_LOCKED) #define RADIX_NODE_HEAD_WLOCK_ASSERT(rnh) rw_assert(&(rnh)->rnh_lock, RA_WLOCKED) #endif /* _KERNEL */ void rn_init(int); int rn_inithead(void **, int); int rn_detachhead(void **); int rn_refines(void *, void *); struct radix_node *rn_addmask(void *, int, int), *rn_addroute (void *, void *, struct radix_node_head *, struct radix_node [2]), *rn_delete(void *, void *, struct radix_node_head *), *rn_lookup (void *v_arg, void *m_arg, struct radix_node_head *head), *rn_match(void *, struct radix_node_head *); #endif /* _RADIX_H_ */