diff options
author | cvs2svn Import User <samba-bugs@samba.org> | 2002-10-01 01:06:38 +0000 |
---|---|---|
committer | cvs2svn Import User <samba-bugs@samba.org> | 2002-10-01 01:06:38 +0000 |
commit | 6007a592b2c842c640f164d3b5132d05b5be82a7 (patch) | |
tree | 99654ceb117602b69c268ccd1d987ae0f9b674cb | |
parent | 512110f3386f43c262a31111a1280fd724cbee20 (diff) | |
parent | 5de642fc6c476f7631b8caaebd1eda5c4d50df57 (diff) | |
download | samba-6007a592b2c842c640f164d3b5132d05b5be82a7.tar.gz samba-6007a592b2c842c640f164d3b5132d05b5be82a7.tar.bz2 samba-6007a592b2c842c640f164d3b5132d05b5be82a7.zip |
This commit was manufactured by cvs2svn to create branch 'SAMBA_3_0'.(This used to be commit eb5ce70e2f0e3ebf6bab168108b410174e42818b)
-rw-r--r-- | docs/Samba-Developers-Guide.pdf | 2228 | ||||
-rw-r--r-- | docs/docbook/devdoc/printing.sgml | 393 | ||||
-rw-r--r-- | docs/docbook/devdoc/wins.sgml | 79 | ||||
-rw-r--r-- | docs/htmldocs/Samba-Developers-Guide.html | 8355 | ||||
-rw-r--r-- | docs/textdocs/CUPS-PrintingInfo.txt | 589 | ||||
-rw-r--r-- | examples/VFS/README.OtherModules | 39 | ||||
-rw-r--r-- | source3/libads/ads_ldap.c | 145 | ||||
-rw-r--r-- | source3/libads/ldap_utils.c | 96 | ||||
-rwxr-xr-x | source3/script/creategroup | 27 |
9 files changed, 11951 insertions, 0 deletions
diff --git a/docs/Samba-Developers-Guide.pdf b/docs/Samba-Developers-Guide.pdf new file mode 100644 index 0000000000..0f2c716a6d --- /dev/null +++ b/docs/Samba-Developers-Guide.pdf @@ -0,0 +1,2228 @@ +%PDF-1.3 +%âãÏÓ +1 0 obj<</Producer(htmldoc 1.8.22 Copyright 1997-2002 Easy Software Products, All Rights Reserved.)/CreationDate(D:20020930200402+0500)/Title(SAMBA Developers Guide)/Creator(Modular DocBook HTML Stylesheet Version 1.76b+)>>endobj +2 0 obj<</Type/Encoding/Differences[ 32/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma/minus/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 128/Euro 130/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE 145/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe 159/Ydieresis/space/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]>>endobj +3 0 obj<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding 2 0 R>>endobj +4 0 obj<</Type/Font/Subtype/Type1/BaseFont/Courier-Oblique/Encoding 2 0 R>>endobj +5 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-Roman/Encoding 2 0 R>>endobj +6 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-Bold/Encoding 2 0 R>>endobj +7 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-Italic/Encoding 2 0 R>>endobj +8 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-BoldItalic/Encoding 2 0 R>>endobj +9 0 obj<</Type/Font/Subtype/Type1/BaseFont/Helvetica/Encoding 2 0 R>>endobj +10 0 obj<</Type/Font/Subtype/Type1/BaseFont/Helvetica-Bold/Encoding 2 0 R>>endobj +11 0 obj<</Type/Font/Subtype/Type1/BaseFont/Symbol>>endobj +12 0 obj<</Subtype/Link/Rect[72.0 684.0 197.9 697.0]/Border[0 0 0]/Dest[467 0 R/XYZ 0 734 0]>>endobj +13 0 obj<</Subtype/Link/Rect[108.0 670.8 174.9 683.8]/Border[0 0 0]/Dest[467 0 R/XYZ 0 696 0]>>endobj +14 0 obj<</Subtype/Link/Rect[72.0 644.4 112.9 657.4]/Border[0 0 0]/Dest[467 0 R/XYZ 0 734 0]>>endobj +15 0 obj<</Subtype/Link/Rect[72.0 618.0 356.5 631.0]/Border[0 0 0]/Dest[475 0 R/XYZ 0 734 0]>>endobj +16 0 obj<</Subtype/Link/Rect[108.0 604.8 154.4 617.8]/Border[0 0 0]/Dest[475 0 R/XYZ 0 672 0]>>endobj +17 0 obj<</Subtype/Link/Rect[108.0 591.6 218.3 604.6]/Border[0 0 0]/Dest[475 0 R/XYZ 0 201 0]>>endobj +18 0 obj<</Subtype/Link/Rect[108.0 578.4 181.0 591.4]/Border[0 0 0]/Dest[477 0 R/XYZ 0 705 0]>>endobj +19 0 obj<</Subtype/Link/Rect[72.0 552.0 167.0 565.0]/Border[0 0 0]/Dest[479 0 R/XYZ 0 734 0]>>endobj +20 0 obj<</Subtype/Link/Rect[108.0 538.8 162.4 551.8]/Border[0 0 0]/Dest[479 0 R/XYZ 0 696 0]>>endobj +21 0 obj<</Subtype/Link/Rect[108.0 525.6 225.3 538.6]/Border[0 0 0]/Dest[479 0 R/XYZ 0 529 0]>>endobj +22 0 obj<</Subtype/Link/Rect[108.0 512.4 179.8 525.4]/Border[0 0 0]/Dest[479 0 R/XYZ 0 335 0]>>endobj +23 0 obj<</Subtype/Link/Rect[108.0 499.2 181.0 512.2]/Border[0 0 0]/Dest[481 0 R/XYZ 0 734 0]>>endobj +24 0 obj<</Subtype/Link/Rect[108.0 486.0 167.0 499.0]/Border[0 0 0]/Dest[481 0 R/XYZ 0 434 0]>>endobj +25 0 obj<</Subtype/Link/Rect[72.0 459.6 200.0 472.6]/Border[0 0 0]/Dest[483 0 R/XYZ 0 734 0]>>endobj +26 0 obj<</Subtype/Link/Rect[108.0 446.4 195.4 459.4]/Border[0 0 0]/Dest[483 0 R/XYZ 0 696 0]>>endobj +27 0 obj<</Subtype/Link/Rect[108.0 433.2 204.5 446.2]/Border[0 0 0]/Dest[485 0 R/XYZ 0 718 0]>>endobj +28 0 obj<</Subtype/Link/Rect[108.0 420.0 228.4 433.0]/Border[0 0 0]/Dest[487 0 R/XYZ 0 718 0]>>endobj +29 0 obj<</Subtype/Link/Rect[108.0 406.8 225.9 419.8]/Border[0 0 0]/Dest[487 0 R/XYZ 0 493 0]>>endobj +30 0 obj<</Subtype/Link/Rect[108.0 393.6 174.9 406.6]/Border[0 0 0]/Dest[489 0 R/XYZ 0 734 0]>>endobj +31 0 obj<</Subtype/Link/Rect[126.0 380.4 166.3 393.4]/Border[0 0 0]/Dest[489 0 R/XYZ 0 700 0]>>endobj +32 0 obj<</Subtype/Link/Rect[126.0 367.2 164.5 380.2]/Border[0 0 0]/Dest[489 0 R/XYZ 0 602 0]>>endobj +33 0 obj<</Subtype/Link/Rect[126.0 354.0 217.0 367.0]/Border[0 0 0]/Dest[489 0 R/XYZ 0 491 0]>>endobj +34 0 obj<</Subtype/Link/Rect[72.0 327.6 164.0 340.6]/Border[0 0 0]/Dest[491 0 R/XYZ 0 734 0]>>endobj +35 0 obj<</Subtype/Link/Rect[72.0 301.2 149.9 314.2]/Border[0 0 0]/Dest[495 0 R/XYZ 0 734 0]>>endobj +36 0 obj<</Subtype/Link/Rect[108.0 288.0 194.4 301.0]/Border[0 0 0]/Dest[495 0 R/XYZ 0 696 0]>>endobj +37 0 obj<</Subtype/Link/Rect[108.0 274.8 189.9 287.8]/Border[0 0 0]/Dest[495 0 R/XYZ 0 568 0]>>endobj +38 0 obj<</Subtype/Link/Rect[108.0 261.6 205.4 274.6]/Border[0 0 0]/Dest[497 0 R/XYZ 0 705 0]>>endobj +39 0 obj<</Subtype/Link/Rect[126.0 248.4 196.0 261.4]/Border[0 0 0]/Dest[497 0 R/XYZ 0 630 0]>>endobj +40 0 obj<</Subtype/Link/Rect[126.0 235.2 194.7 248.2]/Border[0 0 0]/Dest[497 0 R/XYZ 0 571 0]>>endobj +41 0 obj<</Subtype/Link/Rect[126.0 222.0 218.3 235.0]/Border[0 0 0]/Dest[497 0 R/XYZ 0 513 0]>>endobj +42 0 obj<</Subtype/Link/Rect[126.0 208.8 194.7 221.8]/Border[0 0 0]/Dest[497 0 R/XYZ 0 455 0]>>endobj +43 0 obj<</Subtype/Link/Rect[126.0 195.6 192.3 208.6]/Border[0 0 0]/Dest[497 0 R/XYZ 0 383 0]>>endobj +44 0 obj<</Subtype/Link/Rect[126.0 182.4 200.9 195.4]/Border[0 0 0]/Dest[497 0 R/XYZ 0 325 0]>>endobj +45 0 obj<</Subtype/Link/Rect[126.0 169.2 198.4 182.2]/Border[0 0 0]/Dest[497 0 R/XYZ 0 266 0]>>endobj +46 0 obj<</Subtype/Link/Rect[126.0 156.0 217.0 169.0]/Border[0 0 0]/Dest[497 0 R/XYZ 0 208 0]>>endobj +47 0 obj<</Subtype/Link/Rect[126.0 142.8 214.6 155.8]/Border[0 0 0]/Dest[497 0 R/XYZ 0 149 0]>>endobj +48 0 obj<</Subtype/Link/Rect[126.0 129.6 223.2 142.6]/Border[0 0 0]/Dest[499 0 R/XYZ 0 734 0]>>endobj +49 0 obj<</Subtype/Link/Rect[126.0 116.4 220.7 129.4]/Border[0 0 0]/Dest[499 0 R/XYZ 0 675 0]>>endobj +50 0 obj<</Subtype/Link/Rect[126.0 103.2 202.1 116.2]/Border[0 0 0]/Dest[499 0 R/XYZ 0 617 0]>>endobj +51 0 obj<</Subtype/Link/Rect[126.0 90.0 199.6 103.0]/Border[0 0 0]/Dest[499 0 R/XYZ 0 558 0]>>endobj +52 0 obj<</Subtype/Link/Rect[126.0 76.8 224.4 89.8]/Border[0 0 0]/Dest[499 0 R/XYZ 0 500 0]>>endobj +53 0 obj<</Subtype/Link/Rect[126.0 63.6 221.9 76.6]/Border[0 0 0]/Dest[499 0 R/XYZ 0 428 0]>>endobj +54 0 obj[12 0 R +13 0 R +14 0 R +15 0 R +16 0 R +17 0 R +18 0 R +19 0 R +20 0 R +21 0 R +22 0 R +23 0 R +24 0 R +25 0 R +26 0 R +27 0 R +28 0 R +29 0 R +30 0 R +31 0 R +32 0 R +33 0 R +34 0 R +35 0 R +36 0 R +37 0 R +38 0 R +39 0 R +40 0 R +41 0 R +42 0 R +43 0 R +44 0 R +45 0 R +46 0 R +47 0 R +48 0 R +49 0 R +50 0 R +51 0 R +52 0 R +53 0 R]endobj +55 0 obj<</Subtype/Link/Rect[72.0 684.0 149.9 697.0]/Border[0 0 0]/Dest[495 0 R/XYZ 0 734 0]>>endobj +56 0 obj<</Subtype/Link/Rect[108.0 670.8 225.6 683.8]/Border[0 0 0]/Dest[499 0 R/XYZ 0 370 0]>>endobj +57 0 obj<</Subtype/Link/Rect[126.0 657.6 174.9 670.6]/Border[0 0 0]/Dest[499 0 R/XYZ 0 217 0]>>endobj +58 0 obj<</Subtype/Link/Rect[126.0 644.4 182.5 657.4]/Border[0 0 0]/Dest[501 0 R/XYZ 0 428 0]>>endobj +59 0 obj<</Subtype/Link/Rect[108.0 631.2 198.4 644.2]/Border[0 0 0]/Dest[503 0 R/XYZ 0 734 0]>>endobj +60 0 obj<</Subtype/Link/Rect[72.0 604.8 153.0 617.8]/Border[0 0 0]/Dest[505 0 R/XYZ 0 734 0]>>endobj +61 0 obj<</Subtype/Link/Rect[108.0 591.6 182.2 604.6]/Border[0 0 0]/Dest[505 0 R/XYZ 0 696 0]>>endobj +62 0 obj<</Subtype/Link/Rect[126.0 578.4 232.9 591.4]/Border[0 0 0]/Dest[505 0 R/XYZ 0 423 0]>>endobj +63 0 obj<</Subtype/Link/Rect[126.0 565.2 262.0 578.2]/Border[0 0 0]/Dest[505 0 R/XYZ 0 259 0]>>endobj +64 0 obj<</Subtype/Link/Rect[126.0 552.0 239.1 565.0]/Border[0 0 0]/Dest[507 0 R/XYZ 0 652 0]>>endobj +65 0 obj<</Subtype/Link/Rect[108.0 538.8 138.6 551.8]/Border[0 0 0]/Dest[507 0 R/XYZ 0 223 0]>>endobj +66 0 obj<</Subtype/Link/Rect[126.0 525.6 195.7 538.6]/Border[0 0 0]/Dest[509 0 R/XYZ 0 652 0]>>endobj +67 0 obj<</Subtype/Link/Rect[72.0 499.2 193.6 512.2]/Border[0 0 0]/Dest[511 0 R/XYZ 0 734 0]>>endobj +68 0 obj<</Subtype/Link/Rect[108.0 486.0 162.4 499.0]/Border[0 0 0]/Dest[511 0 R/XYZ 0 696 0]>>endobj +69 0 obj<</Subtype/Link/Rect[108.0 472.8 156.9 485.8]/Border[0 0 0]/Dest[511 0 R/XYZ 0 595 0]>>endobj +70 0 obj<</Subtype/Link/Rect[108.0 459.6 176.1 472.6]/Border[0 0 0]/Dest[511 0 R/XYZ 0 216 0]>>endobj +71 0 obj<</Subtype/Link/Rect[108.0 446.4 154.4 459.4]/Border[0 0 0]/Dest[513 0 R/XYZ 0 692 0]>>endobj +72 0 obj<</Subtype/Link/Rect[108.0 433.2 144.7 446.2]/Border[0 0 0]/Dest[513 0 R/XYZ 0 458 0]>>endobj +73 0 obj<</Subtype/Link/Rect[108.0 420.0 164.5 433.0]/Border[0 0 0]/Dest[513 0 R/XYZ 0 145 0]>>endobj +74 0 obj<</Subtype/Link/Rect[108.0 406.8 175.5 419.8]/Border[0 0 0]/Dest[515 0 R/XYZ 0 665 0]>>endobj +75 0 obj<</Subtype/Link/Rect[108.0 393.6 167.0 406.6]/Border[0 0 0]/Dest[515 0 R/XYZ 0 537 0]>>endobj +76 0 obj<</Subtype/Link/Rect[108.0 380.4 200.0 393.4]/Border[0 0 0]/Dest[515 0 R/XYZ 0 277 0]>>endobj +77 0 obj<</Subtype/Link/Rect[72.0 354.0 200.6 367.0]/Border[0 0 0]/Dest[519 0 R/XYZ 0 734 0]>>endobj +78 0 obj<</Subtype/Link/Rect[72.0 327.6 160.0 340.6]/Border[0 0 0]/Dest[523 0 R/XYZ 0 734 0]>>endobj +79 0 obj<</Subtype/Link/Rect[108.0 314.4 162.4 327.4]/Border[0 0 0]/Dest[523 0 R/XYZ 0 696 0]>>endobj +80 0 obj<</Subtype/Link/Rect[126.0 301.2 160.8 314.2]/Border[0 0 0]/Dest[525 0 R/XYZ 0 626 0]>>endobj +81 0 obj<</Subtype/Link/Rect[126.0 288.0 157.8 301.0]/Border[0 0 0]/Dest[525 0 R/XYZ 0 516 0]>>endobj +82 0 obj<</Subtype/Link/Rect[108.0 274.8 199.7 287.8]/Border[0 0 0]/Dest[525 0 R/XYZ 0 394 0]>>endobj +83 0 obj<</Subtype/Link/Rect[126.0 261.6 151.7 274.6]/Border[0 0 0]/Dest[525 0 R/XYZ 0 360 0]>>endobj +84 0 obj<</Subtype/Link/Rect[126.0 248.4 187.1 261.4]/Border[0 0 0]/Dest[527 0 R/XYZ 0 718 0]>>endobj +85 0 obj<</Subtype/Link/Rect[126.0 235.2 170.6 248.2]/Border[0 0 0]/Dest[527 0 R/XYZ 0 235 0]>>endobj +86 0 obj<</Subtype/Link/Rect[108.0 222.0 264.4 235.0]/Border[0 0 0]/Dest[547 0 R/XYZ 0 428 0]>>endobj +87 0 obj<</Subtype/Link/Rect[126.0 208.8 189.3 221.8]/Border[0 0 0]/Dest[547 0 R/XYZ 0 366 0]>>endobj +88 0 obj<</Subtype/Link/Rect[126.0 195.6 157.8 208.6]/Border[0 0 0]/Dest[549 0 R/XYZ 0 564 0]>>endobj +89 0 obj<</Subtype/Link/Rect[126.0 182.4 143.7 195.4]/Border[0 0 0]/Dest[557 0 R/XYZ 0 518 0]>>endobj +90 0 obj<</Subtype/Link/Rect[126.0 169.2 222.0 182.2]/Border[0 0 0]/Dest[557 0 R/XYZ 0 394 0]>>endobj +91 0 obj<</Subtype/Link/Rect[126.0 156.0 258.9 169.0]/Border[0 0 0]/Dest[559 0 R/XYZ 0 522 0]>>endobj +92 0 obj<</Subtype/Link/Rect[126.0 142.8 204.2 155.8]/Border[0 0 0]/Dest[561 0 R/XYZ 0 734 0]>>endobj +93 0 obj<</Subtype/Link/Rect[126.0 129.6 229.0 142.6]/Border[0 0 0]/Dest[561 0 R/XYZ 0 433 0]>>endobj +94 0 obj<</Subtype/Link/Rect[126.0 116.4 276.0 129.4]/Border[0 0 0]/Dest[563 0 R/XYZ 0 734 0]>>endobj +95 0 obj<</Subtype/Link/Rect[126.0 103.2 203.6 116.2]/Border[0 0 0]/Dest[563 0 R/XYZ 0 501 0]>>endobj +96 0 obj<</Subtype/Link/Rect[126.0 90.0 174.6 103.0]/Border[0 0 0]/Dest[563 0 R/XYZ 0 217 0]>>endobj +97 0 obj<</Subtype/Link/Rect[126.0 76.8 210.3 89.8]/Border[0 0 0]/Dest[565 0 R/XYZ 0 639 0]>>endobj +98 0 obj<</Subtype/Link/Rect[126.0 63.6 217.0 76.6]/Border[0 0 0]/Dest[565 0 R/XYZ 0 154 0]>>endobj +99 0 obj[55 0 R +56 0 R +57 0 R +58 0 R +59 0 R +60 0 R +61 0 R +62 0 R +63 0 R +64 0 R +65 0 R +66 0 R +67 0 R +68 0 R +69 0 R +70 0 R +71 0 R +72 0 R +73 0 R +74 0 R +75 0 R +76 0 R +77 0 R +78 0 R +79 0 R +80 0 R +81 0 R +82 0 R +83 0 R +84 0 R +85 0 R +86 0 R +87 0 R +88 0 R +89 0 R +90 0 R +91 0 R +92 0 R +93 0 R +94 0 R +95 0 R +96 0 R +97 0 R +98 0 R]endobj +100 0 obj<</Subtype/Link/Rect[72.0 684.0 160.0 697.0]/Border[0 0 0]/Dest[523 0 R/XYZ 0 734 0]>>endobj +101 0 obj<</Subtype/Link/Rect[108.0 670.8 282.1 683.8]/Border[0 0 0]/Dest[567 0 R/XYZ 0 281 0]>>endobj +102 0 obj<</Subtype/Link/Rect[126.0 657.6 232.3 670.6]/Border[0 0 0]/Dest[569 0 R/XYZ 0 533 0]>>endobj +103 0 obj<</Subtype/Link/Rect[126.0 644.4 214.0 657.4]/Border[0 0 0]/Dest[569 0 R/XYZ 0 141 0]>>endobj +104 0 obj<</Subtype/Link/Rect[126.0 631.2 240.0 644.2]/Border[0 0 0]/Dest[571 0 R/XYZ 0 424 0]>>endobj +105 0 obj<</Subtype/Link/Rect[126.0 618.0 204.8 631.0]/Border[0 0 0]/Dest[573 0 R/XYZ 0 734 0]>>endobj +106 0 obj<</Subtype/Link/Rect[126.0 604.8 206.7 617.8]/Border[0 0 0]/Dest[573 0 R/XYZ 0 291 0]>>endobj +107 0 obj<</Subtype/Link/Rect[108.0 591.6 250.4 604.6]/Border[0 0 0]/Dest[575 0 R/XYZ 0 705 0]>>endobj +108 0 obj<</Subtype/Link/Rect[126.0 578.4 193.2 591.4]/Border[0 0 0]/Dest[575 0 R/XYZ 0 630 0]>>endobj +109 0 obj<</Subtype/Link/Rect[126.0 565.2 181.3 578.2]/Border[0 0 0]/Dest[577 0 R/XYZ 0 734 0]>>endobj +110 0 obj<</Subtype/Link/Rect[108.0 552.0 248.2 565.0]/Border[0 0 0]/Dest[579 0 R/XYZ 0 705 0]>>endobj +111 0 obj<</Subtype/Link/Rect[126.0 538.8 198.7 551.8]/Border[0 0 0]/Dest[579 0 R/XYZ 0 577 0]>>endobj +112 0 obj<</Subtype/Link/Rect[126.0 525.6 213.1 538.6]/Border[0 0 0]/Dest[581 0 R/XYZ 0 734 0]>>endobj +113 0 obj<</Subtype/Link/Rect[108.0 512.4 327.7 525.4]/Border[0 0 0]/Dest[581 0 R/XYZ 0 433 0]>>endobj +114 0 obj<</Subtype/Link/Rect[126.0 499.2 175.5 512.2]/Border[0 0 0]/Dest[581 0 R/XYZ 0 400 0]>>endobj +115 0 obj<</Subtype/Link/Rect[126.0 486.0 163.3 499.0]/Border[0 0 0]/Dest[583 0 R/XYZ 0 734 0]>>endobj +116 0 obj<</Subtype/Link/Rect[126.0 472.8 173.7 485.8]/Border[0 0 0]/Dest[583 0 R/XYZ 0 385 0]>>endobj +117 0 obj<</Subtype/Link/Rect[108.0 459.6 174.6 472.6]/Border[0 0 0]/Dest[583 0 R/XYZ 0 128 0]>>endobj +118 0 obj<</Subtype/Link/Rect[126.0 446.4 208.3 459.4]/Border[0 0 0]/Dest[585 0 R/XYZ 0 633 0]>>endobj +119 0 obj<</Subtype/Link/Rect[126.0 433.2 211.3 446.2]/Border[0 0 0]/Dest[587 0 R/XYZ 0 665 0]>>endobj +120 0 obj<</Subtype/Link/Rect[72.0 406.8 191.8 419.8]/Border[0 0 0]/Dest[591 0 R/XYZ 0 734 0]>>endobj +121 0 obj<</Subtype/Link/Rect[108.0 393.6 145.3 406.6]/Border[0 0 0]/Dest[591 0 R/XYZ 0 696 0]>>endobj +122 0 obj<</Subtype/Link/Rect[108.0 380.4 282.4 393.4]/Border[0 0 0]/Dest[591 0 R/XYZ 0 621 0]>>endobj +123 0 obj<</Subtype/Link/Rect[108.0 367.2 191.9 380.2]/Border[0 0 0]/Dest[591 0 R/XYZ 0 361 0]>>endobj +124 0 obj<</Subtype/Link/Rect[108.0 354.0 333.5 367.0]/Border[0 0 0]/Dest[595 0 R/XYZ 0 692 0]>>endobj +125 0 obj<</Subtype/Link/Rect[108.0 340.8 284.6 353.8]/Border[0 0 0]/Dest[595 0 R/XYZ 0 630 0]>>endobj +126 0 obj<</Subtype/Link/Rect[72.0 314.4 182.0 327.4]/Border[0 0 0]/Dest[601 0 R/XYZ 0 734 0]>>endobj +127 0 obj<</Subtype/Link/Rect[108.0 301.2 175.5 314.2]/Border[0 0 0]/Dest[601 0 R/XYZ 0 696 0]>>endobj +128 0 obj[100 0 R +101 0 R +102 0 R +103 0 R +104 0 R +105 0 R +106 0 R +107 0 R +108 0 R +109 0 R +110 0 R +111 0 R +112 0 R +113 0 R +114 0 R +115 0 R +116 0 R +117 0 R +118 0 R +119 0 R +120 0 R +121 0 R +122 0 R +123 0 R +124 0 R +125 0 R +126 0 R +127 0 R]endobj +129 0 obj<</S/URI/URI(http://devel.samba.org/)>>endobj +130 0 obj<</Subtype/Link/Rect[139.5 617.8 243.7 630.8]/Border[0 0 0]/A 129 0 R>>endobj +131 0 obj<</S/URI/URI(mailto:jelmer@samba.org)>>endobj +132 0 obj<</Subtype/Link/Rect[347.9 617.8 434.4 630.8]/Border[0 0 0]/A 131 0 R>>endobj +133 0 obj<</S/URI/URI(http://www.fsf.org/licenses/gpl.txt)>>endobj +134 0 obj<</Subtype/Link/Rect[72.0 565.0 223.3 578.0]/Border[0 0 0]/A 133 0 R>>endobj +135 0 obj<</Subtype/Link/Rect[72.0 525.4 340.6 538.4]/Border[0 0 0]/Dest[475 0 R/XYZ 0 734 0]>>endobj +136 0 obj<</Subtype/Link/Rect[108.0 512.2 152.0 525.2]/Border[0 0 0]/Dest[475 0 R/XYZ 0 672 0]>>endobj +137 0 obj<</Subtype/Link/Rect[108.0 499.0 211.6 512.0]/Border[0 0 0]/Dest[475 0 R/XYZ 0 201 0]>>endobj +138 0 obj<</Subtype/Link/Rect[108.0 485.8 176.8 498.8]/Border[0 0 0]/Dest[477 0 R/XYZ 0 705 0]>>endobj +139 0 obj<</Subtype/Link/Rect[72.0 472.6 159.7 485.6]/Border[0 0 0]/Dest[479 0 R/XYZ 0 734 0]>>endobj +140 0 obj<</Subtype/Link/Rect[108.0 459.4 163.0 472.4]/Border[0 0 0]/Dest[479 0 R/XYZ 0 696 0]>>endobj +141 0 obj<</Subtype/Link/Rect[108.0 446.2 226.6 459.2]/Border[0 0 0]/Dest[479 0 R/XYZ 0 529 0]>>endobj +142 0 obj<</Subtype/Link/Rect[108.0 433.0 179.8 446.0]/Border[0 0 0]/Dest[479 0 R/XYZ 0 335 0]>>endobj +143 0 obj<</Subtype/Link/Rect[108.0 419.8 181.0 432.8]/Border[0 0 0]/Dest[481 0 R/XYZ 0 734 0]>>endobj +144 0 obj<</Subtype/Link/Rect[108.0 406.6 166.4 419.6]/Border[0 0 0]/Dest[481 0 R/XYZ 0 434 0]>>endobj +145 0 obj<</Subtype/Link/Rect[72.0 393.4 192.1 406.4]/Border[0 0 0]/Dest[483 0 R/XYZ 0 734 0]>>endobj +146 0 obj<</Subtype/Link/Rect[108.0 380.2 192.9 393.2]/Border[0 0 0]/Dest[483 0 R/XYZ 0 696 0]>>endobj +147 0 obj<</Subtype/Link/Rect[108.0 367.0 203.9 380.0]/Border[0 0 0]/Dest[485 0 R/XYZ 0 718 0]>>endobj +148 0 obj<</Subtype/Link/Rect[108.0 353.8 226.5 366.8]/Border[0 0 0]/Dest[487 0 R/XYZ 0 718 0]>>endobj +149 0 obj<</Subtype/Link/Rect[108.0 340.6 222.9 353.6]/Border[0 0 0]/Dest[487 0 R/XYZ 0 493 0]>>endobj +150 0 obj<</Subtype/Link/Rect[108.0 327.4 174.3 340.4]/Border[0 0 0]/Dest[489 0 R/XYZ 0 734 0]>>endobj +151 0 obj<</Subtype/Link/Rect[144.0 314.2 183.7 327.2]/Border[0 0 0]/Dest[489 0 R/XYZ 0 700 0]>>endobj +152 0 obj<</Subtype/Link/Rect[144.0 301.0 183.1 314.0]/Border[0 0 0]/Dest[489 0 R/XYZ 0 602 0]>>endobj +153 0 obj<</Subtype/Link/Rect[144.0 287.8 234.4 300.8]/Border[0 0 0]/Dest[489 0 R/XYZ 0 491 0]>>endobj +154 0 obj<</Subtype/Link/Rect[72.0 274.6 159.7 287.6]/Border[0 0 0]/Dest[491 0 R/XYZ 0 734 0]>>endobj +155 0 obj<</Subtype/Link/Rect[72.0 261.4 144.4 274.4]/Border[0 0 0]/Dest[495 0 R/XYZ 0 734 0]>>endobj +156 0 obj<</Subtype/Link/Rect[108.0 248.2 197.5 261.2]/Border[0 0 0]/Dest[495 0 R/XYZ 0 696 0]>>endobj +157 0 obj<</Subtype/Link/Rect[108.0 235.0 188.1 248.0]/Border[0 0 0]/Dest[495 0 R/XYZ 0 568 0]>>endobj +158 0 obj<</Subtype/Link/Rect[108.0 221.8 206.7 234.8]/Border[0 0 0]/Dest[497 0 R/XYZ 0 705 0]>>endobj +159 0 obj<</Subtype/Link/Rect[144.0 208.6 210.3 221.6]/Border[0 0 0]/Dest[497 0 R/XYZ 0 630 0]>>endobj +160 0 obj<</Subtype/Link/Rect[144.0 195.4 209.7 208.4]/Border[0 0 0]/Dest[497 0 R/XYZ 0 571 0]>>endobj +161 0 obj<</Subtype/Link/Rect[144.0 182.2 232.0 195.2]/Border[0 0 0]/Dest[497 0 R/XYZ 0 513 0]>>endobj +162 0 obj<</Subtype/Link/Rect[144.0 169.0 208.5 182.0]/Border[0 0 0]/Dest[497 0 R/XYZ 0 455 0]>>endobj +163 0 obj<</Subtype/Link/Rect[144.0 155.8 206.6 168.8]/Border[0 0 0]/Dest[497 0 R/XYZ 0 383 0]>>endobj +164 0 obj<</Subtype/Link/Rect[144.0 142.6 214.0 155.6]/Border[0 0 0]/Dest[497 0 R/XYZ 0 325 0]>>endobj +165 0 obj<</Subtype/Link/Rect[144.0 129.4 212.1 142.4]/Border[0 0 0]/Dest[497 0 R/XYZ 0 266 0]>>endobj +166 0 obj<</Subtype/Link/Rect[144.0 116.2 230.2 129.2]/Border[0 0 0]/Dest[497 0 R/XYZ 0 208 0]>>endobj +167 0 obj<</Subtype/Link/Rect[144.0 103.0 228.3 116.0]/Border[0 0 0]/Dest[497 0 R/XYZ 0 149 0]>>endobj +168 0 obj<</Subtype/Link/Rect[144.0 89.8 235.7 102.8]/Border[0 0 0]/Dest[499 0 R/XYZ 0 734 0]>>endobj +169 0 obj<</Subtype/Link/Rect[144.0 76.6 233.8 89.6]/Border[0 0 0]/Dest[499 0 R/XYZ 0 675 0]>>endobj +170 0 obj<</Subtype/Link/Rect[144.0 63.4 215.2 76.4]/Border[0 0 0]/Dest[499 0 R/XYZ 0 617 0]>>endobj +171 0 obj[130 0 R +132 0 R +134 0 R +135 0 R +136 0 R +137 0 R +138 0 R +139 0 R +140 0 R +141 0 R +142 0 R +143 0 R +144 0 R +145 0 R +146 0 R +147 0 R +148 0 R +149 0 R +150 0 R +151 0 R +152 0 R +153 0 R +154 0 R +155 0 R +156 0 R +157 0 R +158 0 R +159 0 R +160 0 R +161 0 R +162 0 R +163 0 R +164 0 R +165 0 R +166 0 R +167 0 R +168 0 R +169 0 R +170 0 R]endobj +172 0 obj<</Subtype/Link/Rect[144.0 721.0 213.4 734.0]/Border[0 0 0]/Dest[499 0 R/XYZ 0 558 0]>>endobj +173 0 obj<</Subtype/Link/Rect[144.0 707.8 236.9 720.8]/Border[0 0 0]/Dest[499 0 R/XYZ 0 500 0]>>endobj +174 0 obj<</Subtype/Link/Rect[144.0 694.6 235.0 707.6]/Border[0 0 0]/Dest[499 0 R/XYZ 0 428 0]>>endobj +175 0 obj<</Subtype/Link/Rect[108.0 681.4 223.8 694.4]/Border[0 0 0]/Dest[499 0 R/XYZ 0 370 0]>>endobj +176 0 obj<</Subtype/Link/Rect[144.0 668.2 195.3 681.2]/Border[0 0 0]/Dest[499 0 R/XYZ 0 217 0]>>endobj +177 0 obj<</Subtype/Link/Rect[144.0 655.0 200.5 668.0]/Border[0 0 0]/Dest[501 0 R/XYZ 0 428 0]>>endobj +178 0 obj<</Subtype/Link/Rect[108.0 641.8 201.5 654.8]/Border[0 0 0]/Dest[503 0 R/XYZ 0 734 0]>>endobj +179 0 obj<</Subtype/Link/Rect[72.0 628.6 147.5 641.6]/Border[0 0 0]/Dest[505 0 R/XYZ 0 734 0]>>endobj +180 0 obj<</Subtype/Link/Rect[108.0 615.4 180.4 628.4]/Border[0 0 0]/Dest[505 0 R/XYZ 0 696 0]>>endobj +181 0 obj<</Subtype/Link/Rect[144.0 602.2 250.3 615.2]/Border[0 0 0]/Dest[505 0 R/XYZ 0 423 0]>>endobj +182 0 obj<</Subtype/Link/Rect[144.0 589.0 280.0 602.0]/Border[0 0 0]/Dest[505 0 R/XYZ 0 259 0]>>endobj +183 0 obj<</Subtype/Link/Rect[144.0 575.8 257.1 588.8]/Border[0 0 0]/Dest[507 0 R/XYZ 0 652 0]>>endobj +184 0 obj<</Subtype/Link/Rect[108.0 562.6 137.3 575.6]/Border[0 0 0]/Dest[507 0 R/XYZ 0 223 0]>>endobj +185 0 obj<</Subtype/Link/Rect[144.0 549.4 213.7 562.4]/Border[0 0 0]/Dest[509 0 R/XYZ 0 652 0]>>endobj +186 0 obj<</Subtype/Link/Rect[72.0 536.2 185.0 549.2]/Border[0 0 0]/Dest[511 0 R/XYZ 0 734 0]>>endobj +187 0 obj<</Subtype/Link/Rect[108.0 523.0 163.0 536.0]/Border[0 0 0]/Dest[511 0 R/XYZ 0 696 0]>>endobj +188 0 obj<</Subtype/Link/Rect[108.0 509.8 157.5 522.8]/Border[0 0 0]/Dest[511 0 R/XYZ 0 595 0]>>endobj +189 0 obj<</Subtype/Link/Rect[108.0 496.6 176.8 509.6]/Border[0 0 0]/Dest[511 0 R/XYZ 0 216 0]>>endobj +190 0 obj<</Subtype/Link/Rect[108.0 483.4 155.7 496.4]/Border[0 0 0]/Dest[513 0 R/XYZ 0 692 0]>>endobj +191 0 obj<</Subtype/Link/Rect[108.0 470.2 143.4 483.2]/Border[0 0 0]/Dest[513 0 R/XYZ 0 458 0]>>endobj +192 0 obj<</Subtype/Link/Rect[108.0 457.0 163.3 470.0]/Border[0 0 0]/Dest[513 0 R/XYZ 0 145 0]>>endobj +193 0 obj<</Subtype/Link/Rect[108.0 443.8 176.8 456.8]/Border[0 0 0]/Dest[515 0 R/XYZ 0 665 0]>>endobj +194 0 obj<</Subtype/Link/Rect[108.0 430.6 168.2 443.6]/Border[0 0 0]/Dest[515 0 R/XYZ 0 537 0]>>endobj +195 0 obj<</Subtype/Link/Rect[108.0 417.4 199.4 430.4]/Border[0 0 0]/Dest[515 0 R/XYZ 0 277 0]>>endobj +196 0 obj<</Subtype/Link/Rect[72.0 404.2 193.9 417.2]/Border[0 0 0]/Dest[519 0 R/XYZ 0 734 0]>>endobj +197 0 obj<</Subtype/Link/Rect[72.0 391.0 153.8 404.0]/Border[0 0 0]/Dest[523 0 R/XYZ 0 734 0]>>endobj +198 0 obj<</Subtype/Link/Rect[108.0 377.8 163.0 390.8]/Border[0 0 0]/Dest[523 0 R/XYZ 0 696 0]>>endobj +199 0 obj<</Subtype/Link/Rect[144.0 364.6 178.8 377.6]/Border[0 0 0]/Dest[525 0 R/XYZ 0 626 0]>>endobj +200 0 obj<</Subtype/Link/Rect[144.0 351.4 176.4 364.4]/Border[0 0 0]/Dest[525 0 R/XYZ 0 516 0]>>endobj +201 0 obj<</Subtype/Link/Rect[108.0 338.2 200.3 351.2]/Border[0 0 0]/Dest[525 0 R/XYZ 0 394 0]>>endobj +202 0 obj<</Subtype/Link/Rect[144.0 325.0 169.1 338.0]/Border[0 0 0]/Dest[525 0 R/XYZ 0 360 0]>>endobj +203 0 obj<</Subtype/Link/Rect[144.0 311.8 205.7 324.8]/Border[0 0 0]/Dest[527 0 R/XYZ 0 718 0]>>endobj +204 0 obj<</Subtype/Link/Rect[144.0 298.6 189.2 311.6]/Border[0 0 0]/Dest[527 0 R/XYZ 0 235 0]>>endobj +205 0 obj<</Subtype/Link/Rect[108.0 285.4 264.4 298.4]/Border[0 0 0]/Dest[547 0 R/XYZ 0 428 0]>>endobj +206 0 obj<</Subtype/Link/Rect[144.0 272.2 206.6 285.2]/Border[0 0 0]/Dest[547 0 R/XYZ 0 366 0]>>endobj +207 0 obj<</Subtype/Link/Rect[144.0 259.0 177.0 272.0]/Border[0 0 0]/Dest[549 0 R/XYZ 0 564 0]>>endobj +208 0 obj<</Subtype/Link/Rect[144.0 245.8 161.7 258.8]/Border[0 0 0]/Dest[557 0 R/XYZ 0 518 0]>>endobj +209 0 obj<</Subtype/Link/Rect[144.0 232.6 236.9 245.6]/Border[0 0 0]/Dest[557 0 R/XYZ 0 394 0]>>endobj +210 0 obj<</Subtype/Link/Rect[144.0 219.4 274.5 232.4]/Border[0 0 0]/Dest[559 0 R/XYZ 0 522 0]>>endobj +211 0 obj<</Subtype/Link/Rect[144.0 206.2 219.8 219.2]/Border[0 0 0]/Dest[561 0 R/XYZ 0 734 0]>>endobj +212 0 obj<</Subtype/Link/Rect[144.0 193.0 243.9 206.0]/Border[0 0 0]/Dest[561 0 R/XYZ 0 433 0]>>endobj +213 0 obj<</Subtype/Link/Rect[144.0 179.8 292.2 192.8]/Border[0 0 0]/Dest[563 0 R/XYZ 0 734 0]>>endobj +214 0 obj<</Subtype/Link/Rect[144.0 166.6 219.2 179.6]/Border[0 0 0]/Dest[563 0 R/XYZ 0 501 0]>>endobj +215 0 obj<</Subtype/Link/Rect[144.0 153.4 190.1 166.4]/Border[0 0 0]/Dest[563 0 R/XYZ 0 217 0]>>endobj +216 0 obj<</Subtype/Link/Rect[144.0 140.2 223.4 153.2]/Border[0 0 0]/Dest[565 0 R/XYZ 0 639 0]>>endobj +217 0 obj<</Subtype/Link/Rect[144.0 127.0 230.8 140.0]/Border[0 0 0]/Dest[565 0 R/XYZ 0 154 0]>>endobj +218 0 obj<</Subtype/Link/Rect[108.0 113.8 281.6 126.8]/Border[0 0 0]/Dest[567 0 R/XYZ 0 281 0]>>endobj +219 0 obj<</Subtype/Link/Rect[144.0 100.6 247.9 113.6]/Border[0 0 0]/Dest[569 0 R/XYZ 0 533 0]>>endobj +220 0 obj<</Subtype/Link/Rect[144.0 87.4 228.9 100.4]/Border[0 0 0]/Dest[569 0 R/XYZ 0 141 0]>>endobj +221 0 obj<</Subtype/Link/Rect[144.0 74.2 256.1 87.2]/Border[0 0 0]/Dest[571 0 R/XYZ 0 424 0]>>endobj +222 0 obj<</Subtype/Link/Rect[144.0 61.0 217.3 74.0]/Border[0 0 0]/Dest[573 0 R/XYZ 0 734 0]>>endobj +223 0 obj[172 0 R +173 0 R +174 0 R +175 0 R +176 0 R +177 0 R +178 0 R +179 0 R +180 0 R +181 0 R +182 0 R +183 0 R +184 0 R +185 0 R +186 0 R +187 0 R +188 0 R +189 0 R +190 0 R +191 0 R +192 0 R +193 0 R +194 0 R +195 0 R +196 0 R +197 0 R +198 0 R +199 0 R +200 0 R +201 0 R +202 0 R +203 0 R +204 0 R +205 0 R +206 0 R +207 0 R +208 0 R +209 0 R +210 0 R +211 0 R +212 0 R +213 0 R +214 0 R +215 0 R +216 0 R +217 0 R +218 0 R +219 0 R +220 0 R +221 0 R +222 0 R]endobj +224 0 obj<</Subtype/Link/Rect[144.0 721.0 218.0 734.0]/Border[0 0 0]/Dest[573 0 R/XYZ 0 291 0]>>endobj +225 0 obj<</Subtype/Link/Rect[108.0 707.8 242.5 720.8]/Border[0 0 0]/Dest[575 0 R/XYZ 0 705 0]>>endobj +226 0 obj<</Subtype/Link/Rect[144.0 694.6 211.8 707.6]/Border[0 0 0]/Dest[575 0 R/XYZ 0 630 0]>>endobj +227 0 obj<</Subtype/Link/Rect[144.0 681.4 196.2 694.4]/Border[0 0 0]/Dest[577 0 R/XYZ 0 734 0]>>endobj +228 0 obj<</Subtype/Link/Rect[108.0 668.2 245.2 681.2]/Border[0 0 0]/Dest[579 0 R/XYZ 0 705 0]>>endobj +229 0 obj<</Subtype/Link/Rect[144.0 655.0 216.1 668.0]/Border[0 0 0]/Dest[579 0 R/XYZ 0 577 0]>>endobj +230 0 obj<</Subtype/Link/Rect[144.0 641.8 229.8 654.8]/Border[0 0 0]/Dest[581 0 R/XYZ 0 734 0]>>endobj +231 0 obj<</Subtype/Link/Rect[108.0 628.6 326.5 641.6]/Border[0 0 0]/Dest[581 0 R/XYZ 0 433 0]>>endobj +232 0 obj<</Subtype/Link/Rect[144.0 615.4 192.9 628.4]/Border[0 0 0]/Dest[581 0 R/XYZ 0 400 0]>>endobj +233 0 obj<</Subtype/Link/Rect[144.0 602.2 182.5 615.2]/Border[0 0 0]/Dest[583 0 R/XYZ 0 734 0]>>endobj +234 0 obj<</Subtype/Link/Rect[144.0 589.0 190.4 602.0]/Border[0 0 0]/Dest[583 0 R/XYZ 0 385 0]>>endobj +235 0 obj<</Subtype/Link/Rect[108.0 575.8 174.0 588.8]/Border[0 0 0]/Dest[583 0 R/XYZ 0 128 0]>>endobj +236 0 obj<</Subtype/Link/Rect[144.0 562.6 224.4 575.6]/Border[0 0 0]/Dest[585 0 R/XYZ 0 633 0]>>endobj +237 0 obj<</Subtype/Link/Rect[144.0 549.4 226.9 562.4]/Border[0 0 0]/Dest[587 0 R/XYZ 0 665 0]>>endobj +238 0 obj<</Subtype/Link/Rect[72.0 536.2 183.8 549.2]/Border[0 0 0]/Dest[591 0 R/XYZ 0 734 0]>>endobj +239 0 obj<</Subtype/Link/Rect[108.0 523.0 145.3 536.0]/Border[0 0 0]/Dest[591 0 R/XYZ 0 696 0]>>endobj +240 0 obj<</Subtype/Link/Rect[108.0 509.8 283.7 522.8]/Border[0 0 0]/Dest[591 0 R/XYZ 0 621 0]>>endobj +241 0 obj<</Subtype/Link/Rect[108.0 496.6 192.2 509.6]/Border[0 0 0]/Dest[591 0 R/XYZ 0 361 0]>>endobj +242 0 obj<</Subtype/Link/Rect[108.0 483.4 336.0 496.4]/Border[0 0 0]/Dest[595 0 R/XYZ 0 692 0]>>endobj +243 0 obj<</Subtype/Link/Rect[108.0 470.2 281.6 483.2]/Border[0 0 0]/Dest[595 0 R/XYZ 0 630 0]>>endobj +244 0 obj<</Subtype/Link/Rect[72.0 457.0 172.8 470.0]/Border[0 0 0]/Dest[601 0 R/XYZ 0 734 0]>>endobj +245 0 obj<</Subtype/Link/Rect[108.0 443.8 174.3 456.8]/Border[0 0 0]/Dest[601 0 R/XYZ 0 696 0]>>endobj +246 0 obj[224 0 R +225 0 R +226 0 R +227 0 R +228 0 R +229 0 R +230 0 R +231 0 R +232 0 R +233 0 R +234 0 R +235 0 R +236 0 R +237 0 R +238 0 R +239 0 R +240 0 R +241 0 R +242 0 R +243 0 R +244 0 R +245 0 R]endobj +247 0 obj<</S/URI/URI(http://lxr.linux.no/source/Documentation/CodingStyle)>>endobj +248 0 obj<</Subtype/Link/Rect[72.0 499.0 310.3 512.0]/Border[0 0 0]/A 247 0 R>>endobj +249 0 obj<</S/URI/URI(http://www.fsf.org/prep/standards_toc.html)>>endobj +250 0 obj<</Subtype/Link/Rect[72.0 472.6 263.0 485.6]/Border[0 0 0]/A 249 0 R>>endobj +251 0 obj[248 0 R +250 0 R]endobj +252 0 obj<</S/URI/URI(http://mailhost.cb1.com/~lkcl/cifsntdomain.txt)>>endobj +253 0 obj<</Subtype/Link/Rect[226.0 637.0 433.6 650.0]/Border[0 0 0]/A 252 0 R>>endobj +254 0 obj<</S/URI/URI(http://ntbugtraq.rc.on.ca/SCRIPTS/WA.EXE?A2=ind9708;L=ntbugtraq;O=A;P=2935)>>endobj +255 0 obj<</Subtype/Link/Rect[72.0 386.2 451.3 399.2]/Border[0 0 0]/A 254 0 R>>endobj +256 0 obj<</S/URI/URI(http://mailhost.cb1.com/~lkcl/crypt.html)>>endobj +257 0 obj<</Subtype/Link/Rect[72.0 359.8 250.6 372.8]/Border[0 0 0]/A 256 0 R>>endobj +258 0 obj<</S/URI/URI(mailto:linus@incolumitas.se)>>endobj +259 0 obj<</Subtype/Link/Rect[244.7 333.4 317.4 346.4]/Border[0 0 0]/A 258 0 R>>endobj +260 0 obj<</S/URI/URI(http://samba.org/cgi-bin/mfs/01/digest/1997/97aug/0391.html)>>endobj +261 0 obj<</Subtype/Link/Rect[72.0 307.0 346.5 320.0]/Border[0 0 0]/A 260 0 R>>endobj +262 0 obj<</S/URI/URI(http://mailhost.cb1.com/~lkcl/crypt.txt)>>endobj +263 0 obj<</Subtype/Link/Rect[72.0 280.6 242.0 293.6]/Border[0 0 0]/A 262 0 R>>endobj +264 0 obj[253 0 R +255 0 R +257 0 R +259 0 R +261 0 R +263 0 R]endobj +265 0 obj<</Dests 266 0 R>>endobj +266 0 obj<</Kids[267 0 R]>>endobj +267 0 obj<</Limits[(aen1007)(wins)]/Names[(aen1007)268 0 R(aen1018)269 0 R(aen103)270 0 R(aen1039)271 0 R(aen1052)272 0 R(aen1099)273 0 R(aen1126)274 0 R(aen1137)275 0 R(aen1176)276 0 R(aen1207)277 0 R(aen128)278 0 R(aen1364)279 0 R(aen1387)280 0 R(aen1398)281 0 R(aen1444)282 0 R(aen151)283 0 R(aen1570)284 0 R(aen1573)285 0 R(aen1587)286 0 R(aen159)287 0 R(aen1648)288 0 R(aen1687)289 0 R(aen1692)290 0 R(aen1703)291 0 R(aen1743)292 0 R(aen1754)293 0 R(aen179)294 0 R(aen1798)295 0 R(aen181)296 0 R(aen1818)297 0 R(aen184)298 0 R(aen1841)299 0 R(aen1853)300 0 R(aen188)301 0 R(aen1897)302 0 R(aen1938)303 0 R(aen1942)304 0 R(aen1961)305 0 R(aen1972)306 0 R(aen1976)307 0 R(aen1987)308 0 R(aen2000)309 0 R(aen2002)310 0 R(aen2005)311 0 R(aen2024)312 0 R(aen2026)313 0 R(aen2029)314 0 R(aen2053)315 0 R(aen2055)316 0 R(aen2062)317 0 R(aen2070)318 0 R(aen2074)319 0 R(aen2101)320 0 R(aen2129)321 0 R(aen2133)322 0 R(aen2164)323 0 R(aen2192)324 0 R(aen2231)325 0 R(aen2239)326 0 R(aen2258)327 0 R(aen2266)328 0 R(aen2274)329 0 R(aen2293)330 0 R(aen2305)331 0 R(aen2315)332 0 R(aen2326)333 0 R(aen2334)334 0 R(aen2338)335 0 R(aen2345)336 0 R(aen2358)337 0 R(aen2362)338 0 R(aen2369)339 0 R(aen2381)340 0 R(aen2385)341 0 R(aen2389)342 0 R(aen24)343 0 R(aen2424)344 0 R(aen2459)345 0 R(aen2467)346 0 R(aen2518)347 0 R(aen2549)348 0 R(aen2561)349 0 R(aen2567)350 0 R(aen2602)351 0 R(aen2622)352 0 R(aen2626)353 0 R(aen2637)354 0 R(aen2653)355 0 R(aen2655)356 0 R(aen2698)357 0 R(aen2708)358 0 R(aen2715)359 0 R(aen2723)360 0 R(aen2725)361 0 R(aen2760)362 0 R(aen2811)363 0 R(aen2814)364 0 R(aen2828)365 0 R(aen284)366 0 R(aen2846)367 0 R(aen288)368 0 R(aen2895)369 0 R(aen2898)370 0 R(aen2924)371 0 R(aen2958)372 0 R(aen2961)373 0 R(aen3032)374 0 R(aen317)375 0 R(aen320)376 0 R(aen323)377 0 R(aen326)378 0 R(aen329)379 0 R(aen332)380 0 R(aen335)381 0 R(aen338)382 0 R(aen341)383 0 R(aen344)384 0 R(aen347)385 0 R(aen35)386 0 R(aen350)387 0 R(aen353)388 0 R(aen356)389 0 R(aen359)390 0 R(aen362)391 0 R(aen365)392 0 R(aen371)393 0 R(aen39)394 0 R(aen4)395 0 R(aen406)396 0 R(aen420)397 0 R(aen451)398 0 R(aen472)399 0 R(aen484)400 0 R(aen495)401 0 R(aen515)402 0 R(aen530)403 0 R(aen54)404 0 R(aen540)405 0 R(aen544)406 0 R(aen552)407 0 R(aen557)408 0 R(aen563)409 0 R(aen570)410 0 R(aen574)411 0 R(aen578)412 0 R(aen583)413 0 R(aen65)414 0 R(aen651)415 0 R(aen687)416 0 R(aen694)417 0 R(aen70)418 0 R(aen701)419 0 R(aen703)420 0 R(aen716)421 0 R(aen718)422 0 R(aen738)423 0 R(aen774)424 0 R(aen776)425 0 R(aen779)426 0 R(aen782)427 0 R(aen785)428 0 R(aen788)429 0 R(aen8)430 0 R(aen813)431 0 R(aen816)432 0 R(aen831)433 0 R(aen842)434 0 R(aen849)435 0 R(aen86)436 0 R(aen860)437 0 R(aen883)438 0 R(aen910)439 0 R(aen917)440 0 R(aen92)441 0 R(aen940)442 0 R(aen959)443 0 R(aen986)444 0 R(architecture)445 0 R(codingsuggestions)446 0 R(debug)447 0 R(internals)448 0 R(netbios)449 0 R(ntdomain)450 0 R(parsing)451 0 R(printing)452 0 R(samba-developer-documentation)453 0 R(samba-developers-guide.html)454 0 R(tracing)455 0 R(unix-smb)456 0 R(wins)457 0 R]>>endobj +268 0 obj<</D[535 0 R/XYZ 0 734 0]>>endobj +269 0 obj<</D[535 0 R/XYZ 0 639 0]>>endobj +270 0 obj<</D[483 0 R/XYZ 0 696 0]>>endobj +271 0 obj<</D[535 0 R/XYZ 0 439 0]>>endobj +272 0 obj<</D[535 0 R/XYZ 0 292 0]>>endobj +273 0 obj<</D[537 0 R/XYZ 0 626 0]>>endobj +274 0 obj<</D[537 0 R/XYZ 0 343 0]>>endobj +275 0 obj<</D[537 0 R/XYZ 0 248 0]>>endobj +276 0 obj<</D[539 0 R/XYZ 0 639 0]>>endobj +277 0 obj<</D[539 0 R/XYZ 0 413 0]>>endobj +278 0 obj<</D[485 0 R/XYZ 0 718 0]>>endobj +279 0 obj<</D[543 0 R/XYZ 0 679 0]>>endobj +280 0 obj<</D[543 0 R/XYZ 0 438 0]>>endobj +281 0 obj<</D[543 0 R/XYZ 0 344 0]>>endobj +282 0 obj<</D[545 0 R/XYZ 0 639 0]>>endobj +283 0 obj<</D[487 0 R/XYZ 0 718 0]>>endobj +284 0 obj<</D[547 0 R/XYZ 0 428 0]>>endobj +285 0 obj<</D[547 0 R/XYZ 0 366 0]>>endobj +286 0 obj<</D[549 0 R/XYZ 0 564 0]>>endobj +287 0 obj<</D[487 0 R/XYZ 0 493 0]>>endobj +288 0 obj<</D[553 0 R/XYZ 0 734 0]>>endobj +289 0 obj<</D[553 0 R/XYZ 0 467 0]>>endobj +290 0 obj<</D[553 0 R/XYZ 0 375 0]>>endobj +291 0 obj<</D[553 0 R/XYZ 0 281 0]>>endobj +292 0 obj<</D[555 0 R/XYZ 0 626 0]>>endobj +293 0 obj<</D[555 0 R/XYZ 0 531 0]>>endobj +294 0 obj<</D[489 0 R/XYZ 0 734 0]>>endobj +295 0 obj<</D[555 0 R/XYZ 0 199 0]>>endobj +296 0 obj<</D[489 0 R/XYZ 0 700 0]>>endobj +297 0 obj<</D[557 0 R/XYZ 0 692 0]>>endobj +298 0 obj<</D[489 0 R/XYZ 0 602 0]>>endobj +299 0 obj<</D[557 0 R/XYZ 0 518 0]>>endobj +300 0 obj<</D[557 0 R/XYZ 0 394 0]>>endobj +301 0 obj<</D[489 0 R/XYZ 0 491 0]>>endobj +302 0 obj<</D[559 0 R/XYZ 0 522 0]>>endobj +303 0 obj<</D[561 0 R/XYZ 0 734 0]>>endobj +304 0 obj<</D[561 0 R/XYZ 0 675 0]>>endobj +305 0 obj<</D[561 0 R/XYZ 0 528 0]>>endobj +306 0 obj<</D[561 0 R/XYZ 0 433 0]>>endobj +307 0 obj<</D[561 0 R/XYZ 0 375 0]>>endobj +308 0 obj<</D[561 0 R/XYZ 0 281 0]>>endobj +309 0 obj<</D[563 0 R/XYZ 0 734 0]>>endobj +310 0 obj<</D[563 0 R/XYZ 0 704 0]>>endobj +311 0 obj<</D[563 0 R/XYZ 0 649 0]>>endobj +312 0 obj<</D[563 0 R/XYZ 0 501 0]>>endobj +313 0 obj<</D[563 0 R/XYZ 0 471 0]>>endobj +314 0 obj<</D[563 0 R/XYZ 0 417 0]>>endobj +315 0 obj<</D[563 0 R/XYZ 0 217 0]>>endobj +316 0 obj<</D[563 0 R/XYZ 0 187 0]>>endobj +317 0 obj<</D[565 0 R/XYZ 0 734 0]>>endobj +318 0 obj<</D[565 0 R/XYZ 0 639 0]>>endobj +319 0 obj<</D[565 0 R/XYZ 0 581 0]>>endobj +320 0 obj<</D[565 0 R/XYZ 0 381 0]>>endobj +321 0 obj<</D[565 0 R/XYZ 0 154 0]>>endobj +322 0 obj<</D[567 0 R/XYZ 0 734 0]>>endobj +323 0 obj<</D[567 0 R/XYZ 0 507 0]>>endobj +324 0 obj<</D[567 0 R/XYZ 0 281 0]>>endobj +325 0 obj<</D[569 0 R/XYZ 0 533 0]>>endobj +326 0 obj<</D[569 0 R/XYZ 0 383 0]>>endobj +327 0 obj<</D[569 0 R/XYZ 0 235 0]>>endobj +328 0 obj<</D[569 0 R/XYZ 0 141 0]>>endobj +329 0 obj<</D[571 0 R/XYZ 0 692 0]>>endobj +330 0 obj<</D[571 0 R/XYZ 0 545 0]>>endobj +331 0 obj<</D[571 0 R/XYZ 0 424 0]>>endobj +332 0 obj<</D[571 0 R/XYZ 0 247 0]>>endobj +333 0 obj<</D[571 0 R/XYZ 0 152 0]>>endobj +334 0 obj<</D[573 0 R/XYZ 0 734 0]>>endobj +335 0 obj<</D[573 0 R/XYZ 0 675 0]>>endobj +336 0 obj<</D[573 0 R/XYZ 0 607 0]>>endobj +337 0 obj<</D[573 0 R/XYZ 0 291 0]>>endobj +338 0 obj<</D[573 0 R/XYZ 0 220 0]>>endobj +339 0 obj<</D[573 0 R/XYZ 0 152 0]>>endobj +340 0 obj<</D[575 0 R/XYZ 0 705 0]>>endobj +341 0 obj<</D[575 0 R/XYZ 0 630 0]>>endobj +342 0 obj<</D[575 0 R/XYZ 0 571 0]>>endobj +343 0 obj<</D[475 0 R/XYZ 0 672 0]>>endobj +344 0 obj<</D[575 0 R/XYZ 0 319 0]>>endobj +345 0 obj<</D[577 0 R/XYZ 0 734 0]>>endobj +346 0 obj<</D[577 0 R/XYZ 0 622 0]>>endobj +347 0 obj<</D[577 0 R/XYZ 0 264 0]>>endobj +348 0 obj<</D[579 0 R/XYZ 0 705 0]>>endobj +349 0 obj<</D[579 0 R/XYZ 0 577 0]>>endobj +350 0 obj<</D[579 0 R/XYZ 0 492 0]>>endobj +351 0 obj<</D[579 0 R/XYZ 0 239 0]>>endobj +352 0 obj<</D[581 0 R/XYZ 0 734 0]>>endobj +353 0 obj<</D[581 0 R/XYZ 0 675 0]>>endobj +354 0 obj<</D[581 0 R/XYZ 0 581 0]>>endobj +355 0 obj<</D[581 0 R/XYZ 0 433 0]>>endobj +356 0 obj<</D[581 0 R/XYZ 0 400 0]>>endobj +357 0 obj<</D[583 0 R/XYZ 0 734 0]>>endobj +358 0 obj<</D[583 0 R/XYZ 0 385 0]>>endobj +359 0 obj<</D[583 0 R/XYZ 0 128 0]>>endobj +360 0 obj<</D[585 0 R/XYZ 0 633 0]>>endobj +361 0 obj<</D[585 0 R/XYZ 0 603 0]>>endobj +362 0 obj<</D[585 0 R/XYZ 0 351 0]>>endobj +363 0 obj<</D[587 0 R/XYZ 0 665 0]>>endobj +364 0 obj<</D[587 0 R/XYZ 0 594 0]>>endobj +365 0 obj<</D[587 0 R/XYZ 0 407 0]>>endobj +366 0 obj<</D[495 0 R/XYZ 0 696 0]>>endobj +367 0 obj<</D[587 0 R/XYZ 0 141 0]>>endobj +368 0 obj<</D[495 0 R/XYZ 0 568 0]>>endobj +369 0 obj<</D[591 0 R/XYZ 0 696 0]>>endobj +370 0 obj<</D[591 0 R/XYZ 0 621 0]>>endobj +371 0 obj<</D[591 0 R/XYZ 0 361 0]>>endobj +372 0 obj<</D[595 0 R/XYZ 0 692 0]>>endobj +373 0 obj<</D[595 0 R/XYZ 0 630 0]>>endobj +374 0 obj<</D[601 0 R/XYZ 0 696 0]>>endobj +375 0 obj<</D[497 0 R/XYZ 0 705 0]>>endobj +376 0 obj<</D[497 0 R/XYZ 0 630 0]>>endobj +377 0 obj<</D[497 0 R/XYZ 0 571 0]>>endobj +378 0 obj<</D[497 0 R/XYZ 0 513 0]>>endobj +379 0 obj<</D[497 0 R/XYZ 0 455 0]>>endobj +380 0 obj<</D[497 0 R/XYZ 0 383 0]>>endobj +381 0 obj<</D[497 0 R/XYZ 0 325 0]>>endobj +382 0 obj<</D[497 0 R/XYZ 0 266 0]>>endobj +383 0 obj<</D[497 0 R/XYZ 0 208 0]>>endobj +384 0 obj<</D[497 0 R/XYZ 0 149 0]>>endobj +385 0 obj<</D[499 0 R/XYZ 0 734 0]>>endobj +386 0 obj<</D[475 0 R/XYZ 0 201 0]>>endobj +387 0 obj<</D[499 0 R/XYZ 0 675 0]>>endobj +388 0 obj<</D[499 0 R/XYZ 0 617 0]>>endobj +389 0 obj<</D[499 0 R/XYZ 0 558 0]>>endobj +390 0 obj<</D[499 0 R/XYZ 0 500 0]>>endobj +391 0 obj<</D[499 0 R/XYZ 0 428 0]>>endobj +392 0 obj<</D[499 0 R/XYZ 0 370 0]>>endobj +393 0 obj<</D[499 0 R/XYZ 0 217 0]>>endobj +394 0 obj<</D[477 0 R/XYZ 0 705 0]>>endobj +395 0 obj<</D[467 0 R/XYZ 0 696 0]>>endobj +396 0 obj<</D[501 0 R/XYZ 0 428 0]>>endobj +397 0 obj<</D[503 0 R/XYZ 0 734 0]>>endobj +398 0 obj<</D[505 0 R/XYZ 0 696 0]>>endobj +399 0 obj<</D[505 0 R/XYZ 0 423 0]>>endobj +400 0 obj<</D[505 0 R/XYZ 0 259 0]>>endobj +401 0 obj<</D[507 0 R/XYZ 0 652 0]>>endobj +402 0 obj<</D[507 0 R/XYZ 0 223 0]>>endobj +403 0 obj<</D[509 0 R/XYZ 0 652 0]>>endobj +404 0 obj<</D[479 0 R/XYZ 0 696 0]>>endobj +405 0 obj<</D[511 0 R/XYZ 0 696 0]>>endobj +406 0 obj<</D[511 0 R/XYZ 0 595 0]>>endobj +407 0 obj<</D[511 0 R/XYZ 0 216 0]>>endobj +408 0 obj<</D[513 0 R/XYZ 0 692 0]>>endobj +409 0 obj<</D[513 0 R/XYZ 0 458 0]>>endobj +410 0 obj<</D[513 0 R/XYZ 0 145 0]>>endobj +411 0 obj<</D[515 0 R/XYZ 0 665 0]>>endobj +412 0 obj<</D[515 0 R/XYZ 0 537 0]>>endobj +413 0 obj<</D[515 0 R/XYZ 0 277 0]>>endobj +414 0 obj<</D[479 0 R/XYZ 0 529 0]>>endobj +415 0 obj<</D[523 0 R/XYZ 0 696 0]>>endobj +416 0 obj<</D[525 0 R/XYZ 0 626 0]>>endobj +417 0 obj<</D[525 0 R/XYZ 0 516 0]>>endobj +418 0 obj<</D[479 0 R/XYZ 0 335 0]>>endobj +419 0 obj<</D[525 0 R/XYZ 0 394 0]>>endobj +420 0 obj<</D[525 0 R/XYZ 0 360 0]>>endobj +421 0 obj<</D[527 0 R/XYZ 0 718 0]>>endobj +422 0 obj<</D[527 0 R/XYZ 0 688 0]>>endobj +423 0 obj<</D[527 0 R/XYZ 0 515 0]>>endobj +424 0 obj<</D[527 0 R/XYZ 0 235 0]>>endobj +425 0 obj<</D[527 0 R/XYZ 0 205 0]>>endobj +426 0 obj<</D[527 0 R/XYZ 0 151 0]>>endobj +427 0 obj<</D[529 0 R/XYZ 0 734 0]>>endobj +428 0 obj<</D[529 0 R/XYZ 0 665 0]>>endobj +429 0 obj<</D[529 0 R/XYZ 0 611 0]>>endobj +430 0 obj<</D[469 0 R/XYZ 0 734 0]>>endobj +431 0 obj<</D[529 0 R/XYZ 0 411 0]>>endobj +432 0 obj<</D[529 0 R/XYZ 0 356 0]>>endobj +433 0 obj<</D[529 0 R/XYZ 0 235 0]>>endobj +434 0 obj<</D[529 0 R/XYZ 0 141 0]>>endobj +435 0 obj<</D[531 0 R/XYZ 0 734 0]>>endobj +436 0 obj<</D[481 0 R/XYZ 0 734 0]>>endobj +437 0 obj<</D[531 0 R/XYZ 0 639 0]>>endobj +438 0 obj<</D[531 0 R/XYZ 0 465 0]>>endobj +439 0 obj<</D[531 0 R/XYZ 0 265 0]>>endobj +440 0 obj<</D[531 0 R/XYZ 0 197 0]>>endobj +441 0 obj<</D[481 0 R/XYZ 0 434 0]>>endobj +442 0 obj<</D[533 0 R/XYZ 0 665 0]>>endobj +443 0 obj<</D[533 0 R/XYZ 0 518 0]>>endobj +444 0 obj<</D[533 0 R/XYZ 0 279 0]>>endobj +445 0 obj<</D[479 0 R/XYZ 0 734 0]>>endobj +446 0 obj<</D[491 0 R/XYZ 0 734 0]>>endobj +447 0 obj<</D[483 0 R/XYZ 0 734 0]>>endobj +448 0 obj<</D[495 0 R/XYZ 0 734 0]>>endobj +449 0 obj<</D[475 0 R/XYZ 0 734 0]>>endobj +450 0 obj<</D[523 0 R/XYZ 0 734 0]>>endobj +451 0 obj<</D[505 0 R/XYZ 0 734 0]>>endobj +452 0 obj<</D[591 0 R/XYZ 0 734 0]>>endobj +453 0 obj<</D[467 0 R/XYZ 0 734 0]>>endobj +454 0 obj<</D[467 0 R/XYZ 0 734 0]>>endobj +455 0 obj<</D[519 0 R/XYZ 0 734 0]>>endobj +456 0 obj<</D[511 0 R/XYZ 0 734 0]>>endobj +457 0 obj<</D[601 0 R/XYZ 0 734 0]>>endobj +458 0 obj<</Type/Pages/Count 72/Kids[459 0 R +461 0 R +463 0 R +465 0 R +467 0 R +469 0 R +471 0 R +473 0 R +475 0 R +477 0 R +479 0 R +481 0 R +483 0 R +485 0 R +487 0 R +489 0 R +491 0 R +493 0 R +495 0 R +497 0 R +499 0 R +501 0 R +503 0 R +505 0 R +507 0 R +509 0 R +511 0 R +513 0 R +515 0 R +517 0 R +519 0 R +521 0 R +523 0 R +525 0 R +527 0 R +529 0 R +531 0 R +533 0 R +535 0 R +537 0 R +539 0 R +541 0 R +543 0 R +545 0 R +547 0 R +549 0 R +551 0 R +553 0 R +555 0 R +557 0 R +559 0 R +561 0 R +563 0 R +565 0 R +567 0 R +569 0 R +571 0 R +573 0 R +575 0 R +577 0 R +579 0 R +581 0 R +583 0 R +585 0 R +587 0 R +589 0 R +591 0 R +593 0 R +595 0 R +597 0 R +599 0 R +601 0 R +]>>endobj +459 0 obj<</Type/Page/Parent 458 0 R/Contents 460 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +460 0 obj<</Filter/FlateDecode/Length 93 >>stream +x+ä2T0 +endobj +461 0 obj<</Type/Page/Parent 458 0 R/Contents 462 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F5 6 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>/Annots 54 0 R>>endobj +462 0 obj<</Filter/FlateDecode/Length 2062 >>stream +xÕZÛnÔH}ÏWø$ƸÝn_s!, lf–'$4'™Õ\Ø¿§ªoå +¡¬ÀË$7Y﹃ûVqôLÙpôꜞʀ\µœ)Ӣ蕉aD¤ÄäN™jÁZÑBspKC’ÔrIƒbÅÂæ0`s"D†˜pc45ÓìF“‘Wà¢w#K,"’ÜðÖät—`k4‰,;YT4TˤVižX@z$'+I+Xð‚¢ ãltŠ@ZA£8<¥BbHP@žÈQT‹¼°¨É €‘ÏŠÜœ€P©‘V‘âV‡'Rk§R¤œg@œ€Pš‘”RúD’•ê¦æ¨a(JV!…›"I‰Á"Œ`Úšò `=¢ZÇ)Ä¥It %†ZøUÖªg¤UË ªuœÊ)¯u %&µšX«ÖÔ<”JÍ DÖB +U;ApP†‡U;À‚Ì!.”
‡‡Aä”Ù +òЈHÊ«4³4¥³D È:ýA¬,ùq<És,FÁ°Õ¼‚‚£JŸ# 4RUÈZ@rÂwi$9h9VZ"x,, A¡”}àYi„PŠBki•æ¶:¢fÂ4$( &x†`GN@(Õ”ã‘44¹²u“Ì#6•a–qÜÈÇ*ÉRÕ¶rÚrlQ$+[¤bÉÒÕGT<õ‡P$±XQ£iÞðÒU’GšHš +GFÒtì¡Ø.'¶£õv%÷‰Ïß—¸õ»œÇ¸±:Z7jJžAßÕdiƒŽþ3,ªív~Çk-ÊAÙ¸Eq_Ñ܇vE´«ØïÓŒ÷åltÏõ +#Öçm(qXU2ß?\¼:ûë5Å…ë°œo¿m»–?ì€B°ÃŸ¢£yPæp!ËÜuû/Ý€>¦*½{ïvÝçí¥×Ão«nü•îÖ8ŒÀÖ€ú§Ø¶Yöp€3Y +±Mîºök燀öïG0)ú#ä̶¶…¾–ßÏ6Áp×f÷%Š¼ÙUìmn×›å¸û4k'»»O2îuC³å UÖš+ÖL…×4…ý¢y¾ö
&’ùÔN†»»»vK½3§=NuÃòrÐð÷®´-³*ú;a¹§Áf ݬÆ;‡‹´>Æ
ù¦îûÑ¡ÈŠ{~?¦óvÃK Ž[߉þ}ÁÂípxY4G²µ=fy_¹Vdz•_o{ŽxyÀUðAòÙ3‚Š‹k(`¼ÂqšÑ¡PíO‘æÜXãÄ*6¡“o]»ÞÌÚMzOƒ‰Cå}Ÿ!õí}$R|h0ÀË‹^Þ}8ÅŠ>Ùݾø¼ÞÚïƒ]ݼKÎfkQŠ÷¿¡ÍÃsiô‹/ã…
ö·c.À°"Dw(
ýM2âÍl¦oºDû$Æé!¯fx³.öæკWQÝ?£}`{BfP”¿3™¾ÃÁŠàìaþð‹cÝa/‘ãŒ;†æÍ&„µ$„wØËbapyðLváÉ’ho?…£ÁxƒzØ4VöˆÏÚíí篰÷°û>o¨Á7½ÜµEß—CmpÖ²5!´7½ÔuöM1s¾ýbvó³ú€ÜgŸ
½·‚7?«
G2Õ^^Öî-<ΚŸ7¢{Žßˆo’ð-Îð%ξUÖÐ +2§EòÕèäÏ“ÿ +endobj +463 0 obj<</Type/Page/Parent 458 0 R/Contents 464 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F5 6 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>/Annots 99 0 R>>endobj +464 0 obj<</Filter/FlateDecode/Length 2547 >>stream +xÕZÛr7}×WÌÛf8`0·GYŠUɲlÒµÏ5Š¹&9Z^œøïsNãJ‰.U¥‘kWÙ<ÓÓ@ßÐh4æg*+ðWeÎÊ:›-ÏŠ¼À“ðϧ_ø$«M‡—Y©sãÀ"Ÿ%p™5MÞ¥´š|e•·à«Ú¼v€| \fª(8¨¼IbŠA-Ë\¥ÔƒZ•ûNª5r`M‰É¬B,:̶ÌÚ’4¤%ŒªÈ«„XR•ª«sMU:üg¡±Lˆ”ÀcPu©#+
[ÕHµ|Q€Ø Â%”‡:‘–@¨¡Â ä³’VµèÑ0 +šŠµÌ ‹É,à –V6¢|Ëø0"MQRA4BLX˜=¢T) º–©Åƒ–]+–i4´· ÒÚJÅzl³R€L!”ÐðD¤É|e£D‰†qlùHAK2Ê›qBÉZâŠ2+È„¶R¦H³šJlJ¾(@&Œ®hɈ‹R¹œÛO€È!¢›i ¤¬‰)¶3¦¬œQÃ^’8+ÌhgTBûDû%Øü ")Ó¦nl¾•x²@ø˜o4VQÙ:i$Æ!š€8fi“fZ +oš„*Z*D!7d¸ @ #b™-#2»$7úƒiÞoúQ™ÆF8ýaA°s*ƒÄ>bÅr]Bƒ!=„0È40¦T¬ÿ.‡M1¨£:òZEõ$°—L…$ª6B0b/a1Å "
Ã)‘š`P[&–Hµ“6sZ+ˆVp4U0ª@L1EÒ°c¤Ê°ØQ%diLùu®ù"’ˆã*¡EZŸ
CÊdØÇX8‰ +ò;Læ(JW1ˆ±8«„ák†Aød²Ú%~j&¿ÃdŽbH ¤¸±šˆ¼åÊütÖjØÒ=I˜ŒÛ*(…üLŽ¢°_%¤R +Ù{ùÙd@„kp˜ü:Š!ˆ±= ir²½œ½y×ÁzÙäÃfšµ1Ùä^êw<žý4™Þ-úlxÈ.†Õ¶_m7ÿžü\Ö8¹FŽm¤ÉöÓxº¼›ò
ÄZÙU8àavÎõjºp¼QáEQŠ GÈ…š¯]Ÿß“Å6[Î÷ÓÕô·~Íç´—1îy:OÝi÷ôüöŠo²®:û,?ÆÕPŒQ× `ƒz·ÓõtÙÃbÓQ¾ç6qCª ï§~»[¯Ä#]ÞoãoÓÅ®—§u^'¤…jÅè,Ï«_÷VZ™æQ•ñ8û_Ìà +ràÄRT>®¶ŒvÑÆ‘÷Ÿ›ëUŸ¨Ž¥Kkm„\++nòEäeÌ—Óo³¼ËgÃêAÔCF
Š?Ìv +ÌÞ£¯ªËË“éÂjë“Äk>ÄäuÿÇ|6]ð
$˜®u‹<;Grù¾™ËÊBά_NÁsV[«Ñh—¿NW÷‹ùê7qN¼ÞÈ´|„M¡S¥sç¾Ì·ýæq:OW8ãùÌú²9ÿî7œ2,š¿¨Îõ|e—<täî2_í¦Ûù 9Õƒi]Îù»uøÑx^7ô‡ÒäEEW{Ÿ<•å¬.<ñãn¾þjƒ±ÈÛÖ%—MûO=׊‘4bç#Ugü}µþ!K2ŸFŠ;h‚ ÿžøçwÃnKéqóUÂ#·ÖM>¥pø:¥´¦@{‰[‰.>wßôÛ·WÆ|š¦ñél.K€9 +õËüQ‚]•ce¯}
rª 䃷ÓÍæ÷a}o}p¤d<üCÚs¿–f_]€Í©ä¬çâ;ÑŒÁè—ýê;UB3ºÕ>xÞ£Ø/àô¬pŽ<̪åT©’Âe²ž>Þƒ= óY3û|u)ª Áõ1“<RI0ía-›âÞ1`µ[Þ¹ã&º˜Æ×ZÏ<ÖmA—Ö’·ëa;Ì[å79:¾n{»–œ +endobj +465 0 obj<</Type/Page/Parent 458 0 R/Contents 466 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F5 6 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>/Annots 128 0 R>>endobj +466 0 obj<</Filter/FlateDecode/Length 2020 >>stream +xÍYMsÓH½çWè´Ë"4>Ž‰©Ô†b\¸GN´ØVPœ¥ø÷ûºç«
¡¶*lËÓ›îéîéééÙSI†ÿTRå‰.“ùj/K3| ]Ó—¤,ü½J”IµËdº'à*1Ûœ€«¤®ƒ’Ó%AmÒ:“6' æSyZ Rb²F“9¬Çš1غ‚~Á +¼Jr•¥J°¦ “ò<-aRU$Ò+ ™¤ÃHžT`°eF&Q«6kÒ"¨eÕ:NiMžRb¨-rš4°¬Ö4eš{µµžS‰¤ÄPkÔ6+0ùB«eí¤5¹ïBdÄI§2#)1ÔêѬU[6œjà ªuœSH‰Im +%ŸaÀŽDA¬£¤5UU6°5 2`Á!¨(‘")1Xl‡F²ƒ8‚bkm¦9ìˆ)$Фr×À!Bi^D‚¬´h2:k± (õN")1©¥¢#XÁ +‹Y_QU¼˜MƒÅ´€&0¨å‘Dºiœ¤Ò +Aˆ¢Ó¤´f‚,j‹œVbÔÔÂJÈÚ(•'ŠBd!Ê(†‘vYÃQb9M¹„9BheD¤
C^pì
mÝ‚FˆK{"r’Rª€‘´¦*ÚÏ ñ˜Êˆ´J BeQÝÔÖKµ(ŠVSp#K«¯+Ån¢Z°—r‚$ÅÃC2–*J$9<qáO…¬”Î#]öꌬ4BRÊ‚<’H‰Ár¼f[æ…`Ë$Xíi…(„y3
ÕC™¯Ð¬òÁÛç°‡äíú(h•â#eª Œe@JDVæ¡À H1`/)1Å@!þQTb°mÁ +ŒðQY‰ÁB³”µÎd¶Å@õ‡3È) +9ªI$%[P+ XÁ",[²Ó¢Ñ^Š²”Õye[ÎjÈ"Wè¯àIä$k£¤ÌÍKÛ`¤r€8!ÈeÆŽ$òp¶÷òuƒ &³N,ºIʪHf—ÜýáóüŬý´ì’a‘L†õ¦[onÿšý)+Hj߉íç$öâlF4ZB˜Žž_’£aÕökú\Àìܾ8ŸüétA*@VC§ÆR‘¶W³Ó·ÇoÏHÖÕ•v:Ç›9σƒ§©Ü·ÙØ®oÛùÆÍTæ~ðY»ê.é+š£j7ü¼¿éè#ÎïB;£Ò'þc͈!>&ºy:=`K²´ +Q»è¾Üu·ìŒ®SÕäÎìÉu»\vë+¶½€ÿ^â‰M¿G½É7ØRÕ#ÞÜm®‘;ý¼Ý°á¨ÀMé<b-p¤¤kýž™vóÉùS—Øy!ï[›i7þÛä<º…ÂûqÞÞÞ~FÎ4ˆFùü›v¼Œ +—‹ÆeßnŠ³m— +ðc‰7=xÃɈ(Ô~kWï`´²u]<ó:Á-S°?TÃ[«ÜY,xý~/è.'üùˆ?oNN§§og?¢â¯XÊ)Fï|Ïcs‰Îxaì»»nüÆ™ƒN¤öU~1ð>Á`ª°QŽ&<Ž +ï3Øw…ø—sŠÙ°÷ýVÀõHÿ°ò&-K·Å…¢çû§)y]¸s.\¼Ÿ¾çpãñÀÉÿ<*ÑÏáj½ûŒCîØ”#bi>suí¯IÉôºí±Žjh
^ïVœr¸œ¨çpàǬp.UÙ#þÜ{Ô;ÏqÑ®''ëÅÀ>f©É]·ðã´;úbj»`u±!'ã·›Íp5¶7×=÷o%ZýÂï¬ÛþÒ®\–•ëÐw’"[ñ8u-&ªL8ac‹¹Õ+‰®£·çW‰VE=Ñùå}Ækƒ¬‹GÝ¢_÷ÀÝnñLÀUa•ÎÇa3̇%Þ—½¤Ÿã³i8µ`Y°x2¬Vþf‚ÛñsŠ?‹„³É.óbzrÄ á÷jÒ®¹uTrS_øAxV/Ýùù³©vÈ9¯dæ|è–ËýÏëá+÷Šx‚0¡ö~à±Õí÷šúýTeÆ)T«˜B›Ž%˜Òp<rú¥ú^ßîpÉHyûÆË]¾`ß¿§íêSË;7Ou㺫ä|ìqùZ_wÓÚ§M7®Û¥-Mx‹ÜÕMøÑ•šŒ}ù:¼
ÔôÞ¶üÁ§ÛÍè.ûøé!Øyü¨<Àú±omæËU„²hçöz¥Ò~møtÇIH/$öeå};öÃ¯Ò 6؇íü3§,ª†ñ9Ð/y$Þ;ª]UHç<=éÉÒÇÞ³ð&$).w춼TÏŽí+µÛÅï²Êίí”ÄËžeNŽx“áò-ÌôakÝ&ËÇ@x•LÚùµÛ¤x +ÝÍ==GÐ=Aà}1¼Q8®Zê6H½Ážyš†½´—À—@ùöó¡___m5Á‹ª¿%g³—ùßd~àŒÜC^ØHòp4ì!ƒÏ†M¿à+&=CT»9G¬£¢ââA÷±rûáälÊÖã÷Úð†²]jñû©‰üµ:òÄ£JnØE¹Ý¾Fzr<EâØ–Ÿ×m¿üC~Žò;ù‰MýUõÞ¥Ú½.ÓO\
~Û£Þq»?<HŽº»åpÓ·Éñ»è,KJë*khdß÷´œ¯f{ïöþ±dÕÔendstream +endobj +467 0 obj<</Type/Page/Parent 458 0 R/Contents 468 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +468 0 obj<</Filter/FlateDecode/Length 155 >>stream +x}Ž»Â0E÷|Åa ØiHÃØŠÇÄ€ð 6•Š¨€"ø~\Ú‰Y–,ßã#?ƒ´¹CPu†,!d+ëác®³Óîš1pdÝoPŠYîÖpiÔò©¡ÒM5;‡²À&½ÓõvOýûW[§¹\¾WìÇ«EÆj–zÂ%»‰`žàƒÜ”>’ÑëŠñ`ØŠ9šÒ°7~endstream +endobj +469 0 obj<</Type/Page/Parent 458 0 R/Contents 470 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F7 8 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>/Annots 171 0 R>>endobj +470 0 obj<</Filter/FlateDecode/Length 1633 >>stream +x…WÛNÛX}ÏWì·¡Ò`âKœ„§ ¤e€2$íS¥Ê‰OwlŸŒ}åïgí}û$ô¢J”åµï7›ÿ>
ñϧq@aLëb0ô†xÒýxºÄcoD£IàM¨ ì{ãå´ã‘7íØ0¼Èaa‡F!ÿ„æÈ÷±&?¦CÈE^ܦXЈXAæXÐtŒ zÎðN;¬èbŽf‚hzUƒÄÈÒa\PƨHϺl<9JÂHt<ö$:‘¬pL–‹#)¢‡OÌ9Ð&ƒ +u¤U
¥'(:*$€ÅaÄ%êHñŽ!"²ž +`‡£S‡ƒÑ´FˆÑ0rÎB€í!’Ÿrµ;Î0r‡{Òõ'Ò +kT@o´åü€OGØ‘.†YŒâéXkvÈ™ãBHpz³-ç‹JØ‘.f³CŽ¶cÅl0åHäðÄØb–8ëÐ!Ç\µ`<µ;€ ·ˆ5-ó€K>Ž£žD +r]å~‚˜ä¹ +pÇ8KÔ;jSl·Õ +vjA,YÈV˜r`£Ï&;Îfï‡öRñ>X[t€È!¡=i‡mÛ@ +è¨ ½n‡ +Çãâä=q2;ø<•#ç~8Dø¢›L"|^àúÉ‹ÿýrðÏàp-¦endstream +endobj +471 0 obj<</Type/Page/Parent 458 0 R/Contents 472 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F6 7 0 R/F8 9 0 R>>/XObject<<>>>>/Annots 223 0 R>>endobj +472 0 obj<</Filter/FlateDecode/Length 1857 >>stream +xuXËRÛJÝó³»IUp¬·´t ªìÜl²²ºØ’#ËIøû{N<Ó(IQ…}83ý8ÝÓ#ñý$0sü&M”šj{2ŸÍñ÷ëöýIÎæ&ÍSüÞš fñˆ6f9’X’“LãYaRAžLŠY*dD;‚HF4˜Æ)ÌmM’ÎÂSpkŠb)𸣀Š+7j6 —gm&Q Èvù`C¤Nr.v‰]…¹5Ÿ%&u¬MežŠHñ T<¤Ùx–)Rcš-hÖme(Iê²@âI„x9ŒzNÁÉ·û$Ò$Ÿ‹èiŽÈ)ÈHŸ“"]’fVº€AY$Ñ(Ì4ØŠUl–CvÏZÃIle·†)ÃGÖò¬Â03¸Ä³ +oMˆ| ¦cÛx.%+¦#€^„Ù$¤JŽÔlžÌÅZ}ÃLj–&ÌT +Ú@‘…#ecT$6C~X =„CÎ:ÏÙ} B¼ÄDÄ¡‡pˆNŠÉ¶ˆR¦‚¶ hpŸ‚[“¦hCÏ)ˆX¨«ç¤?Î@OŠ?Lf™ã@h’#„Ø,²çD9=gsíí!Ý ÜYº#Q.Šy2°—[Y’ìc4·c]Œ€œ‚ˆfNed!9™=¤'åô†E€lŒZࢠ3;ÿÜ(™±È“é8Æ©PI ”“Šâ³ƒ-£•…äD¨húTmÔ,Z$ѬÂ`6žrJÕÃhœósvœEô(L·1ÝÊZ‰W¶b&KƒÌäÉÀÎÛ¼ B@SVñ䈊€œ‚ðˆGŠÔ,Îw Y…ÁÆÉÖ¬<¹xVªävVèÄ$ˆ1il
gš…£#›±Õ^…y+…¨g[ôÏ4z
É +%<„Y(Q(Rc†”1`·ÕšÅÌ—Þ;¼Ù‘ðHƒh©1ÍrÞ+VafÊqáYë4¶·ÍE€w:rö‘2p¤Æ4›QNÏ*p¨Xë…ÒJ’© +_uè'ƒ3Ë¡G1½Ýª-Êš‰Øo!BÝKsY£JÙç–ž¹û¸D>¦ûÓ-Ú=Ž¹B¡×æ¦ÙIOkÇv5™©>êr]÷“˜Ve³™ü‰ÞÞ4ÈîµýXTRíÕêr¹ø[4jW]ïêÖÜt›¦’ÚNØO‡º2í}§Ö趦‰£p5\PÿõXèi†Îݲ®úz˜äEölÓíE²I—]÷xØ™åÅùrš+·4U·•ÓŠ_½]]^¿¿¾2ý®ú›&z=
ÞÖßõ~0ghäºýö§˜‡á¡Æ<ªÊ¡6á’YÖ=›âx†Íò)/ÿ7;Ð^¿Ãç\0^ÛÒ·q.—V½Y˜óúG½év8¨æý¡YÛÉqåi6/xÏ,îö§7#Šñb–ç1þO "â_Þ®N>ü½°endstream +endobj +473 0 obj<</Type/Page/Parent 458 0 R/Contents 474 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F6 7 0 R/F8 9 0 R>>/XObject<<>>>>/Annots 246 0 R>>endobj +474 0 obj<</Filter/FlateDecode/Length 1094 >>stream +xuVMSÛX¼ûWÌi“=`ô-ùhl ¨%†`\¸(¶J,‰•í¤ø÷Û=¤ÁÔ&U†¦ßôÌôÌ“üïÈÿ}I YÕ#oìá/ýÇÝå(
Æž$Y‚ÏZ&Þ8|[YŽ¬Å÷£qlH‹ÁFTp:
B<ƒ¬ŸzUDÒåŒ'ã„9'ähÎ2g<ö
i1Øpù!ÔÉ¢ˆ²!~$ +Tv€"öÙ“®Ø0LµMZë +˜Ô@&Ç©!-E´¨u²^¢Æ;ƒìçûe{ÒbȆ);XƒÁÆ)ïY50†å¨ïy bV‹Á>l0¬ÁL@ðƒ²ÊƒE·ž5¸– æ eõ)Î<]öMÄ!:/Eœ¤º¾Ïíuh !ÇÁѵHbE$¨.S@Î@¬YÂF{Î@ˆzš ©³7È°+±"ªú#4˜³g]›¸º¼oG™ÐwMÀ„žåfƧ÷&¤0ÐÀZ’ 3öœ´ÇçÄzR퉲L½Ã…ÅŠ:×Ö¡îT"ä¤(Ÿ +i1›ä5¬Á`ÎÍ°ƒEe™e
† hÆå +N|KœáG¤€¨UÔÛsx¬¾C–ëÁát¢Xl,£{‘Š¨8¨ô.ß;¤(¼i1=8b
Óß•˜ÔbxàiŸ}Z‹Á:7{Ö5ƺCXqŒ[Žt€H +Y'-…ÚÀÌ‚¹œ†5˜ó53°Üêöðòê;ÀŠÄÝÕ‚ô 9Y-ï÷èÚDÜ\ŒK¢€20 =ÉbB¼ +endobj +475 0 obj<</Type/Page/Parent 458 0 R/Contents 476 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +476 0 obj<</Filter/FlateDecode/Length 1556 >>stream +x•W[SÛ8~çWœ7Úâ\èPØÉi¦i÷A±åDÅ–\I&ÍþúýŽ|Áx»ÝÝá’‹tnßùÎ'ùûÁ˜FøÓÙ„ŽO)ÎF>žM¢ Mggx?ÁŸ•”\†·ç4Ñ*…ÉéÙŒV aûßÄoÞËTiå•ÑdRº—þjþ°¤…5ÞÄ&#¡º¹|»úv0¢Ád +ã7¥3Yl~7‰t¼È1ÆgUŒÁñy`ãýÍŠÝUëSëõÉYtÖëp¶ÔŽÌ³´ä·ÈÙd™Ù)½!o….Œõî‚V׋á|ñ.dxó8‰ÍŸ‡ËÅ爖"_2:ÛSé¤kË`—uæãã*¥ÊOD·ÆR"½P"ë·Zj—Ò9†e)í³Šeûý{áÅÆŠ¼Y8ª@ªJéEcèÜ9)ɦñx4Gþ‡Õç Žj«Éiðå.pÊ‘ +vmèa%MsT^d2—ڋпpÍؽ ÔÉ:ò†Ö™hO¦ô½<[ìwÊÊC’ùZ&‰Lh§üViº»»¦ÜE!™:;m<Hö½„
¶n¥üÜ·†FÁmk/`S*ÔçZ+SiÅ:Ö+NXiçQÐKÈ”·ÆBs)âÙ(¤Ø¯&E +kT +Ó㶯v IôÒôAcP#Zq™y‰ÒâL¨±6/5’£¥ßû\8îŠ3Á²"(Z"&w©E —8–BeÌŠÐ*[ˆCnÂVd)*u¯›s•(:»Þ‡Îv,¿¾e{qÓ&Å5ê‘H…ÛÚ1
èñwq¦X€x‚CÊÏcùOd¬Wä@Ä5>¡ø‹Øc„¨ÈJ–ÈC¿/ ZíÃWñ
ÔR™°,Í^Ÿ#¦âÏ$’ÄÛ^MÜiÁç
…QÖ%´°³`X1Ã{ +C{ªv2B•&UôíÒ : +¥ti™¯†µ- +¡gº±2s{{¿»¼g +}ÂxN°'ɇ©%‹{«¤QÁáÚA…ˆŸ¤Çª5y}»
‚ãh||v„³âøøüïDRЂ١:–6)áÖ^"š§á<ߊg0Ž €I/™þô°w†¥`gƒzõ +òÈÎO¨6×È´ê5yÓDŠŒ1âc§L܉ÒTÅ}éæÔÜ& +endobj +477 0 obj<</Type/Page/Parent 458 0 R/Contents 478 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +478 0 obj<</Filter/FlateDecode/Length 1463 >>stream +x…VkOãFýί¸ýHÁy&a[´´HÝìV‰„*Q¡ÉxŒ§Øwfœlþ}ϱC0HÕŠ°Ážû8çÜsçß“1ðoLó ]ÎH–'£dD³ù,™Ðt1Çÿ'ø±Š²ð`2ú_{nÖ'û)Ç´Îk¶˜Ó:%Äh-ÏÜNø\92m¬©Î“·"Ë´üáïä|ýŽ_ѧøøÅå4™"ÀÙòf¹¢¥ò7÷_Wñ¥×“y2ã—l&Ç£Ñ8ñß=¥ÊI«7Ê
H”¦zFƒÌ–|®ñm€ßŠtYªT•^›ŠD•RãŠÃ!:mÓÑR”ŠVÊnµT§¡D6¾(\Øzx½Â‰LYG§ºJÍÎÑ}å•”{–v¹–9iGYS{jëNHT¢Eå´i<åÂá'%oÈ‹Å
¥tµ’x‘¡ìö9Ie½ÐU‡U(Úþ`lÊ]*‰´ç‘>¡Ç³ÌXR߃0à'©…£èô²Zõ¬˜ +)AßÏcù)¨Ïm>Qœ3ÕŒp¥Ø»„î!´¤Ñp·J¤`UÀ_¿hi3™§‡ûe ÷¨[
ü®Šš2] ).›D½h¹pç)“YTËA#‘à‘c’‹Qdã!ÀR LíŒ}é„2tì3(Ø™¢áÖÑLäç=B +MKÈ,£Õq7ø*u8«”\³AVbž^±€
r8W¨NšäÈÑÞ4–þ¸^‚Ô;×ËËGÅÖè€.gnQXß~Þ;ª£òéûÀ=äªâ,Pß‘Þ`ĺüƒø@³bÐçïo]Hƒ‰\À1úx€ÜöµuŒ5ä²4qr,+Œ‰Ï
†2ê2†‡¡Æ(Kˆ-=—Svœ¸-°‡ÙV;ŠZ÷ê|’¢zŠ8¶y íZ
Š4EBô£YO‹@‰gkÀù>È)ÙXí÷½¬Ð¾3Uà’JýœóŒ`P"lNó°Ö÷,Ÿ +A“,„.£OÃP¢[LyáÁ®_[Ô®‘hÚÅ=N¢å°SQ*J÷-è`r=“Kèk¥x°Èáv©°}<C¾œÅ‹ ;¶ÀO¨¦ï™¯È&®Šûd˜Úça +¾ +SÛáíýÝjÈçyûðà§ÐåêËMØÃÚÂb¡{ß1>aº¿úxÎ +zaá ù¾<¢ã<–„&Â*
cbMƒMvÒNØ48þLFpYʬ)©õ`žXGãËù +endobj +479 0 obj<</Type/Page/Parent 458 0 R/Contents 480 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +480 0 obj<</Filter/FlateDecode/Length 1643 >>stream +xuW]oÛ8|ϯطK€Äuçë^ŠöpòТ‡ø— +;¢³†hƒÎ•sÔrJº¿hô$!k +M À¿ñ$KÄ?;ô+±:hcÕ0€+B B»,'bñ?»A·ºjUD«e<-¼Dé]×@ËIvA†ÍÂ<νÙ0 ÈÐãºÌÑT“z<BL`Îs7ªÃ¾¨^4A@’,AAÑ-‘+EzTæóé xyÜÚ¨^qtV*±¦Žz´-à|>CkT‰^ÃŽÊ$6í‰;û]Öv
+”Õ† +ònÙ…¸ƒí(:+Ëp¡ 5M$ÉJÊ,u¡:Ø‹‰#;óAk—Ž/`PÐÇ‹ÖköBÓJ}bB¤k2›lEÍ1Ū@_¹º°Û:¤<öm˜Èóà¾^õKU¼dSž
KDì=ËIÏgCi£‘ÖÆÙxe·c[ÆÁvÒL¢…œ»;µ W/,'iàPWL=´×Ù¨Yr +ó‡þσFÿoin¡qðÃóLO(T£`åÃãTB-~C"kªpp®¢?Æ“Dý‰hŠîe1‰;›ô•šÿ70mV0DðUn„ˆÏ©Qö.‚Þ=d±s>ÂÃò韤ÂtD Àv€~ +¶ÉD¾9{1> ¦»Ù¨åiÉ£òfnÊ>s”ÙUeR7Ð_ýK¯| dè"lBâBŸÈ£œ ¥Èœ.˜µnÁ$pØQ¼^%[ÈC«VL„„šiÝ)ž|ÃU§‚¿
0"’fO:T…xNTzƒˆpfÁ
Ž¹½8j‡9%¶k
ïЈ´ãåê>_@‡QλÈõ×d\O¨hÿ[äí'ßÒp0Ðl;ƒeeÿÅÐ!ƨ©Õ¸Œ¥TÓTL·¤pßäŒ2å‡ÈâôhŽð鸆k”‡ƒÙŠé‰ðIP"Kß2vÀ|÷F×pç¡cÊRêPx³Ž@cZ—”)î°nà\¤¯’„nMËYi5€´]»Ä¡®:â{P»Įß'6† Æ´Ôƒä>Š™žÆ)“z€öõ+Lª’ªÀåöùjMJJ<O6Þ.•të¼/mwÃÏti»á&žZÿ°™ßM'wwó|m½eÁ.Nþ:ù•Nbºendstream +endobj +481 0 obj<</Type/Page/Parent 458 0 R/Contents 482 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +482 0 obj<</Filter/FlateDecode/Length 1656 >>stream +xmWÛnÛF}÷Wò°XÉql¹/…’ôâ"MRXAú` X’#i#r—Ù]ZÑß÷Ì,©DD¶Éݹœ9sfôílAsü[Ðí½º¡ª=›sºž¿–Ïå->¯ð?0môÅby]ÜL_¼YŸýôÛ-ni½›å‚Ö5ÁÎ|Nëê|½ljë¶äÚ²¾XÅékZàœž]ÝÂâºÆ1éàû¦¦’ÉÖlšK*ûD[N‘bïöT©ó!™Ò66Õ·ÞnÙ¥Xˆ]±vS\‹µ•«(Ë5%O‡`“¡Ä1QÒˆ"5¶&iãƒÆ†&QqÅ»æHÆE;{K•w1…¾Bç}”L"§¯m‡šü.^Wâ·ñn‹7}v°›zgÃVô-ÓÇŽTó†á&I¾È( ¢`«$f‡ÛpešF™‰Äˆ{œA)âïüÃóèN1U} +±ïä.!Zò}8…Õ5&šåæ¡â;óûÈÚלKQú´£ƒÅ@Ö_|Ÿ&.‡€.õˆ„pš†ŒmÉoNhØ–¬ôˆ:©áGÎ'Ò0¶Æ:0À¸#J䶳‰`ÃLÜ·8 +0÷› T?è·£”hàoÒÄ8µ
¦vlD¢ë^uCàG8¡õ=úŸP?€T,¼.v(QÛ5ü}â:«;* §Ò9óàSA_P_#Ģ撩v4J™(GNnpÙrëF<BZNÏGäìÕuS®lkz§&1ýï`üìÖ:ˆ(ä:O5P'Q©µmU• ‡_’eiDîìžlðN†ä%vAKǨ¶è<akŽTDw[=®ˆ¬Já½Ûä XsÙo—ÌBt.FdAï{¨Û{¶Û]@˜¿h0Œr†W§†¾õÜëÅE 2ñºgî *I’±2A[“`ýâÚ©"ÌLs°Nüç¹mHæ3däTÓ!éæƒây” +:£³–ÁÔ‰)C“O7HÌÑŸŒýRv´LeY`3õò4ÈÊcòó]&‚!%•Ô‚îå‰!g+í&P/ñ|E3'@!{gtªÞédDŸÉ.“wsˆyY“|CµÅ;plÐ^°†™^d–Ïþͽ)çà$x*vÝ$€àz30Û¨s'K†®Uøá 1<“ô”¦Ce¢cŠ"3ÙßU9²\À%"ܤ$ómVÔ}âX„Zžc{ÂÁ2øƒnÛRè/÷ÆrÐÓåð%bq»,nîîè5aý*ñ°úëÍ +²šÛ +ôü½G<âk6žÝÎïò·a…HÒøåäz9/–Ëk|5Á:¿”K¿®Ïþ>ûD¤iªendstream +endobj +483 0 obj<</Type/Page/Parent 458 0 R/Contents 484 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +484 0 obj<</Filter/FlateDecode/Length 1221 >>stream +xVkoâFýž_q¿A$p0oP¶Ò>È)›UµÞªRˆ¢±=€[{Æõ!lÕÿÞsÇ6¯Ujˆž¹Ï3çÞ;^ùÔÁǧQ—zCŠ²«Ž7ÓáQ¬ðÒ¡A§ã¨?á·ß>’–îÖÕÎ`èMÊïÁôþC7wêv(XÂãp4¦ vûX‰šÁZ’Y(èÓìÃ÷ÏdvÆÊì:øýŠµüQ©Õîõ½.ôšrK_76ßXú¶SV¼–’}òýJ²;ò†,é;ÒKËp³Z%jE©^Ñ2I%%Aç…4RY“0ÓÒZ‡&lÌ÷ú½.µ»oŒo˜$úÉYaå[š¾{GU+™YÝÒ݂߬_FP‹»M'^ª¯ãâ–‹…jTÚV¾ÚÛÊNØ)7̨̿ÑjÐýì×Ù=5žt7¿ÇÒ´Awß>ó¯O0Þ„Èü‹ëÆËÎëIi¢×¥4Ê]Î:˜ý” ”xÕè·kÄF9>–Ì‚Œ-{E´…ˆ¬,É×(ÝļnA%·ìã àÕ‘½>ã_&
s,]Ò%•/2e«¼”IcÄJÒ¢)%8Ó•,ðíö +¡°Óñ<¿³¸>7ì`uaÚF¬ÈòssåZ‰LÖ>‘–…Îh»N¢µóåH²f+¤’… +¤28äˆ2ïáUØC|.ˆ +ÇóX?“D"Mw-ä +%§‰wd*”A®|ÐMÚÝêÀÞ_¨ºLÄ’69‡t‚•q.Û¨eô†¸é{ÄÀkÛï•õ?ÀøD‡‘;²'h-a½ ¡bbŠ{ +w$Ø[\{«¹ª^ï«S=rJ´CÛÄ–tØsÊÅTÿ&o¥ŠRm8¢FþÖ¸ð«:¨Ý3瘃=]ZÎôñiã|„¬ã„Š´Ôiª·%>µI yæ…š%ÊÆQ¤SJ'„uEÁ´;‘gà
¢¥ÁnS¤Ñº«Âä Ï\–„õè“Ì¥ría“£$ØV¤³Ù-÷¶¯ç<; +Ñc¸¥,š‰erìk6Îœ=?×}óùDŠ +ÍôæR†®Ò–6*yA³bâS’å©+·(FKIlÕM˜´ƒ®ÇÃÙ;Ðc¸ŸEõ8²ÁôgÈB“.(Ó®Œ‡i‘d¢Ÿb)ê¹ç£«’~é
sêPx?ËB6ÀuF%_ÑÎ0í´›ÿ9âˆýÉd|ÓÁüît0˜v-òŸHeaìEÓEs8˜,®kqg(‡#áïAÚ0Ñ +endobj +485 0 obj<</Type/Page/Parent 458 0 R/Contents 486 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +486 0 obj<</Filter/FlateDecode/Length 1218 >>stream +x¥V]sÛ6|÷¯¸ñLÇrÆ¢I}’ûOìÔ“¸N•æ¡êH‚#’`HÀŠþ}÷ÀIvÕ:mÉîÝíí-ñõÌ#¿#ûåg®ã’?›;šÌ|áUIJ°0›ÑþZá‹KÓÉØñÚÞØ º½.®Íùß®Œ'¾ãwðgº¿ÇóÝÍѦ£l¿p»àtQ@ÿ†¬®ïçä´HP—ïO-b»Ã¥E4X¬%½»»ýô~9X^Ò£ˆ*u¹ørv}?!ÏknŽ¤·ˆŸjI*!}tKηPZ“)¢µ(V2v +5dÒ¡·èa+°BU¹È¨ãÚLøŠÖhÉ:%tµUÕæyç~VZ‚m–ª'Ù·‘CÚ";ÎÍq'jiÉszläˆæèvÙ%‘mÅ®nêbvê¼uÊÜ]QÚÌÇ‘ <$§UªH~5¨Uë*S!¾=‰Ì´©}¼ûýîcÛ½>ßç¡…–¹,ì••Š€Ñ{!ó^-¯Çl4º
%Õ +³¹fn³t#oÙ1áço>Ÿ]»Áõné߸îÍÔ»"÷Ϧ“ÑM7xË7š-/»ìá—<Œ@°n´¤Ù"öôRôw“Ø
üÞ¼¢J‚ž¨Bn1¥"–½1SÿæpB@Wl"S¸³—ËJ>¥ÊÀZé1»´[ŠÓ˜ +¥‰'n›ê5B]`d/ú¥Ÿ½cMsëKÁA¤J™ßs äÐ$ ²lÌ{“ÌÔkl†V»gÑušË¦¸,-$#Ë"R¦€§²éŠ8v‹ˆU›i^êàeq`ÊXãJel5fÙJ¶,Ô)ÜîydQ–(ù¥¼Ç Ùq3ýúbàë‚>d&^a¦4mH`ø‚ÊLDÈQFÂàaÒóLkl %²ÄeP¥/准N1\p݉»›ºÎ£›œ%+6y§è,»•ü&E»ìgÖ÷ÃENZd¸¸"ƒÑ¯{›gãŠpnŒD‘•Ô¦*/[uç‚üÐ:PyÊfÏ»íãèÄ ´øÖtÏ•‘ç'ñdV÷Ïƃ0ÔqÙ`Ül;
rÏ>töñþið>Có`Ìê¬q+·FHXâ6/¼É™à¾ðž*ê¬1žL©5 ¦õ+ñz×Mýd¿h_7ft~Oœ“î†Jÿ´ï(á_ò³=¬¤uq¡)7pKŒU{ì²OÑÎ%6vHáÙßø”Ævo3™·fí!ÐfŽ?Ÿã ì:ã‘=Aýööñö-½ã›*qª£÷&mÁÃn÷0pq +âÃÖá¨÷gÌI0qghÞã¹ÌÕÝâì׳¿ +endobj +487 0 obj<</Type/Page/Parent 458 0 R/Contents 488 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +488 0 obj<</Filter/FlateDecode/Length 1264 >>stream +x•WýkãFý=Åppà€èß)$Mî8ÈÑ–º¥.a%d5Ò®o%åƒÒÿ½oV’-çÜØM°bI»ofgÞ›™|;óÈůG3Ÿ‚)EÅ™ë¸4/œ1ç3|÷ñ1’¼˜Ïiw1)n\šLæά[:v&ÝZ—ƳÀñÚ7ã)¾¶(.:Ý¥EOyëIƒ©ëø4ñg0ëïôg;=ƒä'hágóž“\ñ[¯·G¿^ž]|\7£e‚hM§gNË؞åe4X®%ÝÜ^ÿöéêæf5XÓ}¾üûÆäy;œžbßà³"ÇY•iE•¦ +»ò:Nå•:¯ûÏC£¤¢<S’6F‡¹,(–ed²PÆ$Bý(‡€àf% Šr)ÔÅ!xÆn¸4òÄ
Æ÷ü,ØORòQJ¥’FT’aÖRÄÒ8ô¹¢§,ÏIl6RÅXøD•|®:¯£Ú©*xÖ)²,E* hŠ²ä•]>e¢M!* +ë$A8,‹Mõb½¤òEUâ™tbãqÀK,gŒR’R5þ•M{<§ÉƒKNƒçŒŸF>Rˆ¿ˆáÇZ[
ÈÒjðn¹†©ÖZ’™²²áwV+õŽÛÕùÈa¦ÿ +/©zÙHzÿÌ2#Å2y_JLY‡ +.ã†_<ió]oð€)=<˜VYÀ!¥¹ÙäcÎÈhô¡½o2êè_ï-ø꼕É[,æÄì¼–gš`B<Bë'Eu™©´S)2" ¦~…rAHtžë§òÔˆRÀb§£AíK’»UÆÎêPüß¡<#-¯¢ø_uä{̽üì@ôO;˜Ëˆ~îzxoeïŠÊ¬Èra†(èP„Ikæ/¤²Z@Ç0ZDk[H52(wrëd۔禼4ê3²ª*iij44Û +:z¶í«k29ºLÎà9º7E ·üV‹¼ëN
oÛJqûõöŽE^3ƒõQ’d ¸a³a¥ JçÌ–Dx‡)·ÉSéu¨Ÿô þŽ`F§# 'ÓèÎ?¯·xµ²ãÔöü{×£ìÄð¼É +rL¡„ÜmËò§˜YÑÑ0 þP‚yEÄ“EÊ%œg-P¦ŒÖ²–zG½¨òh÷X²‘§,`F+pZs±fÇGæ0òÅÏ!¾Çív²ú]ׇu( º™’€e$]*+=0aÛÑÊ⇒۶”a(|ÝàB >ì;àï +endobj +489 0 obj<</Type/Page/Parent 458 0 R/Contents 490 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +490 0 obj<</Filter/FlateDecode/Length 823 >>stream +x…U]OÛ@|ϯØÇ 7NBAŠD+UuÛ—Hèì;'G»Ôw&Í¿ïìÇUˆ|Øç™Ý™ÙÍŸAJcü¥”Mh:§r;'c:˦x-2¼Nðß(ªÂÙ<Mïݘž“yÿÆe>øt}NiFy’ù"¥\ÆcÊËáWµ§ëÖ”^[ãNò‡xx¦˜Ë¡,Ö^ýõ«áê$ž™Q +M€,‡ùF;ª: Ú5ÚxGR횶Ê9±VÄä-ùêîTºV´ +#igÓE}àîàj»^Уáte›ðT´U¥š„òâ*ÀN“ ³?·N9ô(- +€‹fÝn•ñTkçé¡ÅK«X`ÅýmhÉu¦ü-€“6»Ö +}(‰(KtPë´Ysa½*]ˆ¸ÇšN‰ûÃiC;áЀ;ºÝ¥M趢ƒmA hyuùãæîç]¨‘/îu]£ [ ±C9Щ ++d«ðù(|¬÷…‡I4©x2:Mð1½‘Íÿ|†2lâ±C|;ûFû þk×7JH6ísx‡9ȱ±ž;)Èñ˵³½6ñbÄd:vø*l#«íÎ :•ŠAltÞ5Eìèe[" rµ~'ô]1º¢Òn93¶÷ +xjÚZ4£Meƒ <ó(ãmHópÚ8Õ\´5#ÁÏl¨*HݨÒׄ <ŒH*1!£Š‹å2dõCßMW<ýþàB9AίËgWµ‰cš”¡&çÑm4> +šu`ÑÞž‡Æx]“ö=E•)mk¼j¸£öµ6*¡_<-ŒÚ]¡r#Qâ›\á yYÃJà‹?ÏO½Y0]¾zÄÏ3ÿÔñÓ¤°hY!a½Á(»w˜N&25ì—È +”³h–=†jáAT¢Ü ¦¿,z3ÊòE~Ü“2®jw˜ä/•9±$õ–é~£AVÖJ”¹ëi¯ñˆ„U±è6yš-’ùù9MgYÜùß/¾\^`5>ªÚîØŸ›VËÐÅèxv”Ïyk¼ù™e³$›/ðó€»é„™®òÁ·Á?‹0µendstream +endobj +491 0 obj<</Type/Page/Parent 458 0 R/Contents 492 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>/Annots 251 0 R>>endobj +492 0 obj<</Filter/FlateDecode/Length 1882 >>stream +x}WÛrã6}÷WteV³eS–íø2o3^;ë‡Ä³–6•Ýr•"A1p +®lÙ·(6JëQì2îÁî5AµÜä}Z‹´‘ÇÆ(ãºK9@"ÐPŽT‹~%(RK…þn+Hò[üP?*aV’¼V«&hT¶f â4%Ñ~må솄G;8SOZ +g°ƒXÚ>]ú²wãÇrü"x „ˆ=f‹4 +Ê_;QÑLŽ\ûÍŽË;|vA?pƒ§Ih:Åro5DÎý€èN›pYÈu|l܃5r»u¬Ë)SêÇuƒ˜À·VFÒÜ?ÏÒÓáj˜ö¸6~
S +
iGPX¶p´oˆä‹fWVœÛéã%rîÀºîö¹gä’§äÇÃÙ{×h¢à]IÃg{ôn?´â’6ØŠ¿‹fo£Ä¿Ëîºøqoç)Áéãíð]p6»Ã󳫋ÔÔt_Ý\7×·É7g—ñaqòï“ÿT.Fendstream +endobj +493 0 obj<</Type/Page/Parent 458 0 R/Contents 494 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F8 9 0 R>>/XObject<<>>>>>>endobj +494 0 obj<</Filter/FlateDecode/Length 1702 >>stream +xmWasÚ8ýž_±ßš¦à +y<ì$þóøÅgQ,}ýõ]fñ’äLÝ7çꞃ¾ +:BÓÄZòu³ÅìõþûOhmeiiÖèK™ª•Âõ,½>·ìÈÄöcÔš+“nȦ.Od[aÂ!dÈ–u0¾v)ÐHp¦aKËIhÂiÒýi¤é¹H–§è£¯aš=½ÎæóŸ¿,ÀW¥à·Š»«÷=>³'ŸÛJ£N$ßDÍ[%¨Ì–¯k’$y¹„Ã@æ'íäp€æ@“½?ƒSM:SJƒÐð¶[MCѺš4—é†Ä»ƒ¶Ù“Xe@ æš-{$ôNì={]|_~m^uDƒZ‰TFÊtØÙ¨K[ˆú-¨ÔÕz}Øÿ6é»sIŒ¾„•…9«ËÚß 3(jÕüãG_J뽂Š±"«Fƒn &üoD0ÖBÓè…4ÁÓ5]ÁH@‘1·çŸ>u>»®ir…Ít@ß×µ´:çX…8"ʳ±µò›ßݱ÷˜L¸¬GÞ¬fUmaQ̨Tš]0³QôÌ2 +g¤::;~PFGÁ-)¬ +bûBýúÖ*¦†³e¸'ùVj°ƒ}9ÒâwÔ¦ÃÁ•NÃ{Žr@Q7JÈ„hƒÉ™:ŒA©úJàù$܆c¡-ѱR®ÐÌ>prM4 x;ÜáÞÕ@d‚D6ï£ÿA¥J7PcU„èÁ¾í×Ò !ž8Œž¬ +49mªb‰0à°|«WÌê:ꣃ^ë<êµ)ŸÃåÝ,opa%5W Çh°OKlcìNK>Þê
*¦–JòÄDŽõ†ä(»Ã—>'ÈÔC5âöæÞ]Ç·5É`ËÁdG" ¼$jÄ]Ñ“¶Ð;NÇ0žú5}x–ÆÙrtåÄdéÅ}ï, €Ÿ˜;vmùÒ«µãQ€g§Œ`Gðb.@üf—*-n'aˆGÉÒmfjú¾ÀSC‹^ã5ë`1!Š
Ž…s¼_uÜ´rôn×¹%·L|0Ül )'WXD÷‡FîXmÐûNiÍ×#b;ãþIÍ%cÉ˲ø· a¹aQgè/VÉßïPr׌TlÉðù3·¶WÁ3°'tÛO +øR§¸ÆñG‡…¦?¼ÃêÞoj^ÀÈ<¶£¸›Ç%6®qž¡P(Lúx¤GKБ +endobj +495 0 obj<</Type/Page/Parent 458 0 R/Contents 496 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +496 0 obj<</Filter/FlateDecode/Length 1889 >>stream +x}WÛnÛF}÷Wüäm]l)}kœ5Ð&h-?0`,É¥¸5¹ËpIËúûž™åÍrZ4E"r9—sÎ\öÇÉœ.ñßœÖZ^SRž\F—tµühµYãßü_kÊN>oO.n?Ñâ’¶>¹^oh›Ž_âIrv¯ÊXÑmtmUá?lÿ‘ãóu8>[®¢>8»ÉUœ¢ß”McwáèŠæóîèb]óÑmn<y4ÆYJµOjkOÉ`Áë†òÎ +KÃ9)O¦¬ +]jD“/h‰TpšTì^4{½¤Ùâ™Â×¥&×T)ß30œÒ‹®¤ÒYî’ÿpÑ}¢¤GM^»v—»¶[‰K5íñ†l[j¼BèªÐÀó| +™&?ò>I4QÄò¯§4À¸ÓVת +™}{øýwOú5ÑUCj¬4VqæœÙl~-7+t"T¯ê²
†Ò£±¦õ,6l¹¬ð9ÊE”F7='çä]Ç»÷²M÷ŽÅ?ƒ°nð-'ÉÏf ú°(b¨Â,ëyQžö†ú×vâZxGfüžÌ}Ž¯®¥¶¤\*pî~¨ÁOÓ‘lc
4NÙú/tµÙÙ¢ûäºÉÿ£«Q䙸ºF³.”»]¶+iö]wBÀÀ³0ŒƒàÈ-sOè[F*€,„¦Áålq56Ê[$¨_wöszØÞÎ6,f®´|´õÒAB“ŠSÞ Á‘= ë¥*Ã'¬ê‡›ûân.k/°:›4g÷qEð€©(ˆN«¶E[Y›o"žg‹‘¶ùR†ßÀZ(G—Ö@••~·Yèé@‚‚¡‘†0YK{S#c€Áô‹¡‰RBß$…7 +9³äŽ
Œ€ÈÖ¦ºæ^‚R€/ù(„-j•O»4x’{é(SíH5 +ÓIQÌU^9ÀÒËÃc^B»òŒ«ˆÃ„ËZÁØÇû?>cÆ'ÏX”úõ`POza戻ѯ”h’ëäYŒe…Â2’
—Ò¾ Þ80miq×CHuè×8!’î >ÁªðŒA¡dDOØSLìál¨jdq½"Éz%¡†ðíãgÿ
)ð>=+
%`8ôˆþvíQ®%6$l«Žë" +ëGf E¸Ýaµa +endobj +497 0 obj<</Type/Page/Parent 458 0 R/Contents 498 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +498 0 obj<</Filter/FlateDecode/Length 639 >>stream +xµU_oÚ0çSœú2*5nœ„$<ÒuÝ&ê6²=ñb’ñ³Z¾ýÎ…"A“tLBä»óï_â_=>}8$„1ä‹žÏ|ˆ“˜¥ ýè«ÊÍ‚Ïé¶ea,n[ˆÒ¨}TXÚÖ::‚aGG&,jÅ“a;\øípãà9Ú«¬wyç•N¤8M +€„ò}Èò¾˜ÏaU(•[Y+VüDh”| +¦k‹µ.P³jSÿ„Ó§Ž„8RuVI±A&×rŠ²BXlXJ…ÅÁ@Y…fW$(¡*|°¨Œ\á|í:Üœ±XL…@Ûò$¤móº@¶#A¸K¢æ…|Cáí÷ѧIÚ”ËÚLÎ[À»m£ ´‡£ +ÂB]–-PÜK[9š²Dí. EÒ9s„òJh‘[’§È磬ļA‚ Æ>º¹^:û·¤²8û‚ñޜߩ?B +Ö+ýv0~½ +endobj +499 0 obj<</Type/Page/Parent 458 0 R/Contents 500 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +500 0 obj<</Filter/FlateDecode/Length 955 >>stream +xµVMsÛ6½ûWìä${LFüI¹'¹mZÏÄ©k©=i¦’ „–UŒãß@´¥Hò$ד ì¾}ûvÁÏãPR”PÑœý1%qâ‡g)Æ!þ§ÊNLð*;:NýøØDœ0pÄT4=±#ŠîÈ2ûÃEð +› èAèµæp#ÝZ£ðÜsÂÕwîŸ1{Q +7ýÁ‹bWkgŸè–If*xΚœÑìîæHcðCÄb-:êx¡E+©ä]¡Dκ«^Ú×Iî¨jØ?œíz¸¿û‘ +V×>YKBVj˜µ¶f%åœKã{‡ú6×L˜¦“?ÿÂ!…\Ù +rh‹¶„‰Ü ¨v]™nP¨l‹¾áR[/>ÝhÓÖúº$Ùj8üÊ]Ñ¢.K›lìŠ×hŵ`yÍ·ùÓÔpˆ^…ÜxáÄÏp7&®¿ØF,G舴Q…Ô—¦9Rù<lv^7Û÷œ ÆmÿŠ5St±aŠ5—äJ¦Ù0¾P{SÊL.ÏØO7 L-Ú!ƒC®Ù,yeùE³.j ý²ÔwH,Úûüöš´b²c.ë¨)«xÓj¿§+áÎàçš«n2ì›Òf#±‹ˆáÜC‰Um]·Ý•Ù„ÃܧVKߕ͵웚E;Í5 b°c'ç+Ô™pŒ
GÎÁrødžñøTÜ6
'mZ!“ãÖÂCk.ÃÎ\þˆ¦oèe¨kQ¬Qæ´š#ƒ—{¸£#žv€¿àÉðM>âC–Ñ+äzÓšc^
‡øÓÐ@2=9´f 1fž2“šqÊÿÊÐ3D냀F-0m@[üúa'#NÓ¸Õµ•Ôõ©CðþC¶ýP +&‘ŸL§”¤¸'#«ùìözF?ñϼn7°G¿ôè"ÎLšÙÕ^:FßÀÒS_bqûi‚oC«ÓÔlþyqöûÙ›Þ> endstream +endobj +501 0 obj<</Type/Page/Parent 458 0 R/Contents 502 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +502 0 obj<</Filter/FlateDecode/Length 1568 >>stream +x•WÛnÛF}÷WüR°IVtÉ›Ò6…$Hc¡EÁ’\Z›»*—´¢|}Ïì…¢ÕmÄ ¤½œ9sæÌ𯋠ñoB‹)ÝÎ)«.ÆɘnW+ü-ø;ÅÿZRáàoß¿Þ\¼x3£É„6Ÿ1_.h“Îi“]e¢,?‰z¸z¸¦ªµ
å_™L4’š²TÉÊÔ‡äzóùbL£Ém2ÅWu.ñŠíŒÒ¬©1½ûʶ´WeI©$+þÙä‡f+ºik-sâsÚà+†‚ƒLáž"¨Á½ÿq„H#ÆeB¼{4}I£ÛU2gܸÈJàŒQìD-* ø–<äƒiÉ´[ØJßÒn©©sûTMb·“ج3tgQ +ú¾¼â«Aøh:Of|óZS«zä 'sJUƒ|Ä©ëw¤Û*•uB +2x–Twà·8)ô²ì$‰jŠ•Ó]†:ίn7Eù¯5ãÜë6F×åŠkïæùŒ1WO’†í…3°tyï²sIB3÷Îð¤tV¶y”ÏeûV>Éò²²‹)Æ0;†9}¦Ž<YêI¨o®<ÓCƒo`,œÁ´- +gÏjQ!Po-3‰}¼bdäõS‹Ÿrš"›Ð‡ZÚ¶)„à,3Ô/’ÅZH”©ò:ÓM¨/énáàNvÌA¹ó +®×HÃË#3ÿEZ¶M;QE³ën?jŠî +HNWC3åáÆ…6Äé}˯ o²6TJýØl¿ËãÜ£Z1e&wÊJ…âO2å^¬ë +‘sp£ž{ñÅVã~í5Öó½BäŸ1?°‰×jdYzL¢2-¾
plô¡®Æ|iùö‡ìø#£«3ŒÆA ¹8BÕDàôZXÅÞæäËçå(ÕÎ +l#ê&úÂ)†³ª ³Þ(zyC‡„[Ðrv´x6@˜€¦° ¢
¸Û´©Ñ?°²¨MÅkÑ%$qâ “r~›dm
¯bÔ»Fˆ3U0¹®£CôúÑËi²tc ¤Á¹ îè‡þ$KɹìrÔÙ_ÏG"gF\=ŠÒòœgJK6?9ÊÍâ0ÊÌ]ª‚-—<^ìݺ;z(¾ÐéN¬äwfød”õÛíM¨;?|BŒ²Žý±?s(×)Ð-vp¶÷² 5„H¹qâAÎyüV7W08i&%äpR{¨¬çºóz½ôC·ˆ›ñÃõ¥Ë{LÙe¬DçG¡ +í(žƒþrzÊ”O‰i‰g/B¥sÔwƽOz#†¥A`ƒ’‰ié{+íq»³`ˆ˜ŸÓV.Œ€LžÔ”cÃA×u’¯æ`ƒ»SYÌ@X|Ž³PN¬°“ìéÒ£€zoÜ{„ÊÙê|ɽf€Ûh@ÿ̽ºtsT¡¾~ʶ¢þ´kj÷J…ªíz[&4çËÅŽÀ|iìÚs6@”NÝÏ÷ÕOܳyŸ!ïx•Û"
®Æ¶nÜBÛ4^k!ëaÄ|:Î8m +endobj +503 0 obj<</Type/Page/Parent 458 0 R/Contents 504 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +504 0 obj<</Filter/FlateDecode/Length 546 >>stream +x•TMo›@½ó+æè ,Æ|äbÙNSEr#U¡ê%—³Þuw—¸É¯ï,¶œPT)2ÚµgÞ{óñüÛcÒà `ž@µ÷ „8‹ƒˆÞ)#úh„Æ[Þõ],…¢¡”$cPÔ@áaE5Û¨¡j¹æ•E
–—^¿('F¡.ÇÒ ¡¬ÙµåBBÍ-cu_Ù^£NL5šJ‹k(_`\P
¬7÷÷¯.VÈJI@g:¾'6- l;H b6§‚ˆøŸà§êö£$ˆÝï?ƒ}9 q[„NXÛ¡²\B/ØIÒ%¤Åj—ëSiT~=c¸;]/\„U©^Z§ßôå»:¨ZhTשã&šÂÜL£zýiIó)Öš°†ÊžfGa[P+”äÝY'þ9ЕÈ
XÍEç<´j±Ö<]äÆSŠ×‘\Õ4-XEß>üØnvc/$·Äqšåo1Åëþƒ'•ôOÐZ8·J#¬dŠUñMÒ°}çNœõé¤S
å6„< È9´Øng®²oÔËår$4›bl¡C¹£‘Gܼ|+Ÿbµ û}Irh/XB6Jï¹›>ðg´³ëEX,Î[žð®ï²³‰Ù"XžCÄ¿<®¾Wp‹ÏØ©j_{Q¦óYš Eúi˜žùôí"Nã M²3aîZó¥ð¾{lÝ^Nendstream +endobj +505 0 obj<</Type/Page/Parent 458 0 R/Contents 506 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +506 0 obj<</Filter/FlateDecode/Length 1286 >>stream +xVMoã6½çWЃm`¥ø+¶³Åvƒ] ‡5ÐCu¡eÚf#‘^‘Nâýõûf(YþÚ´ âØ9óæÍ›G~»P¿ši4¡¼¼é§}ÝÓ!gS¼â¯Ò´’ÃQÿÚƒÙŒúióRñ¡O³ûô¾ 1NïÚ£I:Fx+Á¿Ì9> ^æöñž†}š¯€p2Ñ|)ÏñMÞo4ùr‘æήhe +Ý›ÿ{ÃÓ¸!q
óe÷I¿™\ôÙªbïÇ4Ô‡Ót¿(Ï‹ý +ˆÎAÉxÚV.×Þë%9KŠ +c5-öõlñ)ªP\‰ÛUö[íÉdG0äa¥s·¶æ;B! +ô[^ì¼yÑhUTkà÷0ߘu˜®RG… +\ +ÇMFÕt¤*Ÿ+k‘lå*~r,¡„ö-ˆ‘ÉxO" µ^n¸ÒÛã
/ªØ¥¨[tN–£„J£ˆƒ{Ös¨dƒ“é”Áˆ½t"œ¬[à
¾.yZÒs¨Ê)bàœq´4/fÉU®DR +D§¡·BÔý‘:Ÿ:¢iñ"›S2Ä™ü+Ó·¢¿³ÇÉnO‡‡°]À6iAúKRžàAtž‡AžÙ–ËLgݬG«”u½Ö”³²îè!ëá!¦·[Ån¬~áRñ e™Å(±£QóàD¨LÐBçj‡™@ ̳2Q”¤Á/,»ÆQ…£cqÄsqkS:¢U‘ÔEðKŽÓN?Gç=µ“+6ÖšÛÝjDÔJ¥Ú7IÆbxà³ÇySúæ[Ï$ö<æÏûÁú™jrWn1“|4@•0EtgF¬áÀêrcóGƒÒxù×41À!y[†è—ÅòÌ]}ÑÕBS +L!,¶›Ý„媪ŒZkè'ì*{Ž½±6»^¡ëDyØ-‡-¶Ò¥{ÑË‹ŽÜµ©á ÎÒgæC¥ŒÌÁ™€]G‹c{ÒŽå!‡œPµ‘¶S&.qmΞ 6zÀÁgìt8©ôʸ=9€ó§§Í©JX·^T²Ð|€¤y óÊy|
ß7[´7®‚1ðÔŠ_à ò…ò›Ÿ±IÎ2>¦ä¬!6ˆ¹¥ÑàŦi!G;ƒƒÄÚSY‚Û4ŒÇMáhɺÖÙ¤¥3|P`«ã³òaÐ +N‘Ñ(:”$·!{Õ?Þê“ðÕ`nÀ{ð:Þ¡8¿³¹ +Ϊ +endobj +507 0 obj<</Type/Page/Parent 458 0 R/Contents 508 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +508 0 obj<</Filter/FlateDecode/Length 1074 >>stream +xµV[oâF~çWœ7’¼¾€
ÛM¤¤MªJÙ¬VK+UK3€ÛC=&l¶êßïÌxd7©*(ÆñœËw¾só߀||JBŠbJ‹Žïù‡‘7 Á(Á}ˆ¿JÒ£í.Õÿø4‡^ЈFC/r²>
’À7'Aä%»“h̆ùChÀ‚öäP'ŒcoØœ„Ü6˜ +øÑMVòÁ螨28y4‚RË2û +›"AÎØ\Ãy!áÝúñXùÍÕ˜ å$ö£`øÏûÀ?n²êN[…]Öû!gÝ%n³*¿ˆbË·Vç1{€õ(¤>:g„_(Ró1À¨8:¥Ê{‘oxS4ºXÑ‹Nù‡9rá÷M´|ßI(€³Tdóy.r¦é¤Tõ Ò T 1{iB)¦b£%e5At‘Uºf‡©¨U)ê&5h²‡êÖ›œužçæ5œ8þþCÄšIþºÕU¹R;(‘ÿ-ÀO˧³)œÌ+²ˆ`UHýBõ½–á@†k¸~=žh½¶ WRÌ›îë™ÊHs¥yÍ0îd1Ó½íN9!(%Aš+гE†ªbÙv†ôLSóüDIÕ<&øžç•ë7 +55“ÆV ‹¼P})>·ØÉöç--E5KùㆴœZQô²é`[çO7ï† +Ì Ãžo ÜPã‰që‚Ý™ÝÀQ‡µÀ’°“K˜'šÿÓ¦ø—C¤ˆaâÅ|̳AG³.fR´@ãc` _vü½TvDïXçÌEÿoOO‰þ¡wM`gô/]~¸ú.²Ý¹S6Šî1Ùú:cK†‚vÖÃà“ÆZ-‹¢û¹K7çï/ •ø½Îc³VÇÊŸvéóëß/éæúHG7Ølè¾:KEž?p€¼BŠ’—³¨Y/d}·CEKpÞ¡ÍšðUVŠ0« +lOW Øμ7aÌ5:g†]Y2•è¬¤»Rn—é±$}¼¾àue~xd!š7š`yñxLq2òÃÈ”Èùû‹súEÞË\yƒÿºA²Z?€K÷‹®YüOìÏA2ð’o”,¬9é|ì|ó,þendstream +endobj +509 0 obj<</Type/Page/Parent 458 0 R/Contents 510 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +510 0 obj<</Filter/FlateDecode/Length 562 >>stream +xmSÁRÛ0¼ç+öF`ˆ°c‡CÉzf:¸œrQd9QkKÁ’¡é×÷=% Lflé½Ý}ûÖO£ ýR”¦T7JD‚"›Šù¬¤çŒþ½F/./S1û|±¨F79ÒUà ŬDUƒ€’•Ïáµ +ÆYNÖî|;ßh:íѸ¶u/ºÆj‡?ºwp=:Gä[ÙËN*iÕ^œV?Gâ#øzœ ð;½NÒ©ÈøèÈx@&bSkLcöðÒÂmµ5vU/Õ/ m
¢èŒ•a_6ªuþ]•@µÑL—Ù´å"j¹Ÿß]y<¸ÿ0ú›äW‰Ó£ê¬ ³£ês²]µy&á5Œ
Ž‹,Tâq~ûã:ÊÁYczÎ ŸÙ›5
g#;ÛE7hÿI7Ë‹€MïºXþ3>²‚–HXýQÕ†@ïd9¾¿Åœ,—ödyúϤù~Ò‹›+¤4gƒIv‰Iž‹"½rCØ/ØÅ +Y"3ŽÒ˜<ç’¸ +WÎ6fÆ´šUJ¬LÀ`Ϙ;7@Rt^y×êßçØI¥Î©Ò;{”ÀÂ…
ßEmÒÊvçÍgŸ–c¯¤å¬,OcJ^¥0þV÷ë»}`âþhGÙšdQEë(Ü5ž‘´+J¹JŠèœ:*ß=;|Bi9Å»uÆÃün1ÇWý¬[ +mïñm PpÓäµvR&Wÿ·3/sQ³Ã·’q×u5ú>ú%2âendstream +endobj +511 0 obj<</Type/Page/Parent 458 0 R/Contents 512 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +512 0 obj<</Filter/FlateDecode/Length 1691 >>stream +x}WÛnÛF|÷W(ê +ãq +¶®®oä¡Ø9Å“âøO›Þ}¼»×Š‘Ï{–|¨ËW_ôÚÙõpíõÅåü?¶)ø²/’óípèRÎÎÆCç×ó+zX¹(ø1W>$)}Ñ7¶M’VÙX·°Q¢o¬ø +-ŽÇôDáÛ*xœ7rÿÇ;qMW[Þ7ô*øé艘Vã<•×gCt+¿‘{Ó,Œ¾ƒµK+Zoæò°²[iÌVV¶î¤³6e³òb€_íý“k—‚èhúç׿~zH’
0ÌÂÕ.mçÌÎÎ¯æ— +E’àR²$?˜ö=ãƵˆ@é RÒ¼Ê9ð<!ßÖÒuöBÆ¡WŸ£
ilüîVë‚O¾ðµ¬Ÿoë-BŠÑJ?Ú ËÂvi.LÀ{ÂœoEy<Ž}±\~÷÷‡pæãO¿¾|k+ÿÆ2±4u
k€yÕp8)jJ_Eô0lº$Š7iÖ,¨}<îLH®èk
¸JÏÁyÄBº åBL²6µ+!òº¤PnÀamÔR-€h‹œn©à…‰¶„D|ß–;o:ãƇdÂÓ\~SÕÈÂ?Sð}]ÍrÌi‚ébk·£Š²dc¿ˆÉ´ ¥@±©Æs&Z!‘5„2É ùv7ÄMd(i|L`´1«lÀ.E[W"EŠƒTø˜?S5³¸Ò*°k[ÏðjÌ¿ñ¥eáÅÌ«¥L_§I +<G±ð„©Ár‹$ÎŒj“ú«€²‡8¶RùP NQ¯ªÖÃXü•¢²ùýO¼«Øk Ùñ6HÓœN¶ÃcÍï EªŽI D—lœ¢ùña@c¤¦°DªÌ`WZ°Ís³hcd¿Š6õÝl§üY@¢¥Ç%¨d’L컎劂( +ßtˆ‘úÍ‚Ó6–#€“6çð=Aô½âÙGÞÒ(R°ˆyh0ALü¢•ŠúvšË×þ²² +4¹ÓãPfý„Æ
º)ÉØ;SCÄIöÏr +tâ0ìR.^™T…‘>õ°qˆ3ÓFôdä¬Åš9¬ôh·l¼±Áv¾,Wö[ážùЫ<’kìã1´‚``•‚ÝB”ᱚö
H&Ü9¸Š-x>PØ&÷¯àk’þ$÷ÝÝN¬Á^ǯŒi 6¯_Ú³è|¬àF°¨†4Ƶ3O\÷»D+ãjí +N¼ë¾œ¦Ür•”›7·7û´‹Óá;é;_}—×—óë«|*âCîü‚>><ýuôŠ«ã9endstream +endobj +513 0 obj<</Type/Page/Parent 458 0 R/Contents 514 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +514 0 obj<</Filter/FlateDecode/Length 1794 >>stream +x}W]Oã8}çW\ñ²ÌªZªa(+$>f¡³h$¤•›8g;c;-ý÷{®”n†]!Míûqî¹çÞü<Ñ)~F4ÓÙ”²êàtxJÓéþNÎgø;Ư“TÄ/&ã‹áä£/F£épÚÿâjqpr3¡ÑˆœLÏg´È NOi‘-J ÿ^®¥šjë½Zj<°º ÊOÁR(•§ÚY|Q
H™L7¹2+j¼tFT’*Q×x0 ar*¬Ëø[A¾–™*Töiñýà”ŽGgÃ1üí®á$Õ•5Z8ò%BñC>}rsA#ËQŸM2î}Þo¬Ë}:ñž×ñx†Üqâ^˜-=ß_Q¦•4ÁSS×ÒeÂKøi/ÓRÂ/§lb¡”Õn©kIÆ’Ê¥ M¹EÖrKyÊL +T/ße™\6ub7ȘŠ¦©–po‹”]†b¬¤¨Šà>Š*µ«ç8)´¶›½ Á*v®…V¨'³VÍccê•ÈJTŽ^¶V.oÑL/Ê<,ÀZfÐë§õ ¡u°Ì¸í`“&sÛ„Y%Cis.aÎéìµÊl¸²ðm®2@èŒôÒÚ3‰bß«ÌYo‹@Ftè.–"êÑ™@‡ùrŸ‡µLùHþlà +[Oœyñ3_¶ù³Aèž +g+€âO6–t{OðJëȉ„ ¨]Ë ßú€Òö1Fê¨Ô—+öKCbÌÛ8»€5–¬¬#÷aLXÑA(R +úÃ;^bé>c6%ï¤-k¸C»ðwJÁ/PLŒÈç]¬¬†)ç^q÷Dàä›à9`Ë +endobj +515 0 obj<</Type/Page/Parent 458 0 R/Contents 516 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +516 0 obj<</Filter/FlateDecode/Length 1885 >>stream +x}WMsÛ8½çW`|i:»¶óáä²3éGvö4¸ÓK.´DYl(R©8Þ_¿ d»JºÓvšP$<<<€¿Žf4ÅŸ-ætzAYu4LéâôbrAg—ü<Ç¿FS!Χ—o˜Ÿ½ñáãòèÃÍÍf´,`äârAËœ``:¥evüÝ™*U çIÿjͳ²ÚEüwZz2UmuÅ‹±4TµRÔH›XꆬϞ¨0++tNÞa+¼•%ã|®I¹üýòçєƳÓÉ×VeØk) +ºVŠ:]•›FgÑ7[ò
,Uƒ•®xiçê„¡ØKKe¶Âö
»™w¡àkÝøL‡`Üšw‰·À8ø¶Áò‰Dð¦Ùȳ +Ñnq“.4ûÈ÷`9¶!¯¶”ëBµ6RÐàjж!ê +‡J)´uí›H&Nø쇛+š!_œ¸ñéÙäŒ[6ªÎ=ÎÿçsH»öéÏàv]ÓÃíG +Iøk™ü\{€Ý9I¾\oý†Fº¯Ë\Ôètê!&úåÆGz™q¨åÞEÝD_„ÙÖÀ´5(>Ç€Xój&¤pÄ!SzëC¤ûOÞq¥õí‰÷£ø‘”å‡qwK€{v©ð–£B + N)¶3Y¬¦~Ö3dÁñö +½J`rwÖ‚Ü6Œzª°îõß6‡³›d4ÈAÑ@iœÞPѺŒû‰²°KÌ6•çÒG+º5Yãƒ/D¼12™ÒŒ$3²šN"ójo@hÌ…ÙøÍëŽ&<
LîöÝ‘~AîØÍ G‚5ß”©Z\çÂíN÷ÍŲã6§fwV! +íj¼/ˆÇcÜ…êËï<H5‘çùïƒ'É‹Ï>܃©ñÛu.®ÌÞéåWÅÌyìÞµµŒ!ü©(2™ú†¯™Ê¦üÉJå0Ú2ö¨ +endobj +517 0 obj<</Type/Page/Parent 458 0 R/Contents 518 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F8 9 0 R>>/XObject<<>>>>>>endobj +518 0 obj<</Filter/FlateDecode/Length 707 >>stream +xeT]oÚ@|çW¬xi"‚á1_TH!UWíC^Îö:¾r¾sïÎ þ}çŒTTdöövggfýgÓŸ˜’Ý,(¯GÓhJ·q-i¾Lð<Ã×2•£ûtt½žSSZâÊb™PZÒ§SJó_1½iHñžÕ˜ÊVç^í"ÚxrmÓ뎴¤·g¨öí’LIáîëöÞ[¡R³É?—Ÿö¬é%¥Â°Ó_>*]¦¿GSšÄ7Ñ0B÷š„RQŸ-¢yˆ¿Š:”·Ö²öèü£mÈ›®ñÅŸ·$ž©±Æ›Ü¨+:T2¯Hº.ÇhÆ—Œ:eGú)õê–„.Îp þ’ÞD·=·ùN¢£¯Pc({"‡*áHÐ8Ȥ’^²a’UÑ·u
ç7üo¶“"üž5Ô|˜”B¿+à2MGx‡Ø±Ý³
óÚ#JŒŠUƒÕbÇ]š¬Å5¸áêI‹ÿñÖm^õeá$ÛsºÓŠá +úŠ0w†út¾êúAeê†Ë»† +endobj +519 0 obj<</Type/Page/Parent 458 0 R/Contents 520 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F5 6 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +520 0 obj<</Filter/FlateDecode/Length 1575 >>stream +xWÛnÛF}÷WLý+€ÄH²l) iÀ@§µš¢€_–ä’Ú˜Üew—–õ÷=³\êBÇ}h.–LíÎœ™9sfôÏÙŒ¦ø;£åœ.¯)«Ï¦ÉjE‡¶Ä/Sš¿&KZ¬–x?»Ä[+©8û°Æñ)ìàø›Ooi>¥u»×Ëóð9žd£µ™Ò%9Q§‚ÜÎyYS&ªÊ½^?{óiA³Yws2_%sÜ7ÊQ¡*I¹t™U©t´1[ò†rC'FÈü$£é.ØÇ‘±dZOÛð¤¼Ã%°µF— ã°¯§ÂX1¥ ®ýA +¥=™‚6RX?¦¶TA;Ó’@¬9ÛóŒçõþ“ÆšT¤ÕŽa7Ò +/“h~~,8²_2ß"ô]€Å„£Täüžù¿HÍ£¤Z< håÉ™VçcúÞ:8ô…'ùÔÈ̇³ˆ²8Jz”vG•ÞïèÝäþõÀõíö:œnÒÒ¹„n5’Wc©*IäB{QÂ7ž¶Z=ÅŠCDBqG™A…2SKÚ*¿Ùf˜ÒP¡Ö«JY°{fëBÞ€½6Zycƒµc~ijˆÉ”VÔŒ +GTþ ¹LÛ²äÏ„Fž+gPÖªq`*çí.”ò„5;$½–(/.Á§ViLWé.ÿ ý
>dxÖ:9ˆ8ÁÔdœæ£Ð°ŒÚ)²Ö¨Jx暆_Ü+káÈ’¤>…ÀÄý#sÊUQH+ÁÖ€EÓGϺˡÈôYéö¨–hŠhÂ…ê}÷mð§Îò]«oïhÈw§)~þí9¿C£F_t?R:«ÚÐ ÎTÂ*wÿúÔ@˼ëÔHÉ wî>îqïF¿'0ûvâÊ¢5ºjq‹:äºBj׎{Ÿq?ijÀkfóÎ’FòÑh1Ãì¦Ó›Ð
ˆ;¹rÀr‰R Þ\àŠp®ÿv 厎ï +ÁFþ13¸ÿ˜\aKÔJ#Óäò¤úQÝiîÕ§SdN6ÛB.ÛÊ'ôEÂ摦h©¡”ˆúkûæ?a*ŨJé©2 +ÛÍÎ(ô6<OêÃJÃDу‹ØŸÖìÛÕ)ÔNHLQž‹ÃnÅŽnÈKP4‰¶Y’LTÎÊ`:BmLMõŽþÇx4ý•O°Ÿn¯rÒ¢a <5Ù +Ü:Q‰–t> îv£²
wÔÑÍÇŽY¥xZÁ?8 ²Mˆ*Z…bZŒ7ÐîH1ièëÍÇÓRhgƒŒþˆnÁê*p¼D(Û¯QÎcÚÙžX!ùQ÷‚ƒneaÆÔÆlÄ~×:QJ"¯‰7uS1pž¹
+¦%2Ò·P,¡½ÜÅ*O +BÀ—+ìéï_ÅÒ'¸Óøî\¿ˆýOGŽhþþÕìEo_Œï6ÖóIq—˜ÃfÆÝa¢í'JØÿÝ8ncÇk`˜…a-½ÅÜËZËÛÍ ±ºÝbÎÃ1Û¨*ÇAnTèƒjÍË9þ•ÐœðõÓa+i,¶{n˜XÖ¼b€Ð9¥¼œJ–Q^ÿcíϾSÉW»¯]fV‡ï/WWÉååUøóŸ_zËE²¼ÆW.>:_²ßÖg¿Ÿý\eœendstream +endobj +521 0 obj<</Type/Page/Parent 458 0 R/Contents 522 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F8 9 0 R>>/XObject<<>>>>>>endobj +522 0 obj<</Filter/FlateDecode/Length 841 >>stream +xU]oã6|÷¯XäÉbÙRü¡(Šä.9h›61p(š¢`¤ŭ"U’ŠëßYÊJR¿ô`@_\îÎÌÎÒršá—Óª ó%UÍh–•%½_ü3^f´ÈYNór…çbž-È3m;Ãî·Ë!v¾\fC,âSèÕz4½™SžÓzƒ‚ËrEë:íѺßÙŠiï:RˆV1ªjËuú·l©R–jG»ŠüÊžt$ÈYÂ*UF³xTék¥º í3µÞ=n)ÛgÚicN×f4ÉϳõÇ•jc'I©Â>DnPΘÐ'ÍSMzáöËl.{mÝN` nm#ûÖ³à`P‰áú–=²íé–+_m±î]÷,w&×Ŷ‹´qžBô@}¨zK/¹1©¶ÅÆ#à;QE2XÒVÂlÈè¹øÕ´†ÏHoPW5X}I¢ë ÒÆ-µì‚v6 ©h£±tK;×™zÀ +`G…“ÊȪ†Á;Á +endobj +523 0 obj<</Type/Page/Parent 458 0 R/Contents 524 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>/Annots 264 0 R>>endobj +524 0 obj<</Filter/FlateDecode/Length 1642 >>stream +xWmOãFþίõËDì8„BÇÁ5*Ç¥$ÕõªHÕÚÞ$[ì]ßî:/ýí}fíä \_@¼Ø;;/ÏÌ<3ùzPß
{ÔPVt£.Þì~Ý8HNO¢.
º=ü.!•Dƒö© )ËSÿ4‰z|6EýöiwÖ;‰Îp–Ïp¯žø,ö¢!õFgÑ N{ÝntÚ>ñéógœžœBª‘Ýêíá>ûÓžðÍð´;ƒü Ødïøö€øìÝì ¾Á͈z0<£Y‚Å›ìðnFïM)”¦ûÉÕw4û3ˆ'ÃF¼Ó?A”³üp¬½5yyet#tBIÒ +õ†0¡ÙJ9ÊMV—R{ÊŒöPìHé…±¥à«ä
UÖ¬U.Ih‚õGcœo•_Qa–ðÆI»V™tÇÄ/Míɯ$i)s‚2Üe'ºÔIúÐÄW¤hì n°¸[–ácËfA+ï«·qŒp‹•q>ÊÒ$ÊLÿU<dEœ©…Ó>hDþɇ¬) +M7t[?Ȩ5Û 9‹'ï +HªŒs*-$éd!3Optƒ—"g/DˆyiM]Ñü±²«/‘xãhv5‰Çèñ^饛!æ|/h±ðÒ†ë&-ÔRxc7dejœ÷›Jz˜«Œ¥<¦J8ÀóãWþA9¹:ânQņӀÛ@Þ"¾}ËUee¦„ç4nh¼¤"{ à¼1µ%ùTI«¤†¾@8‰œ ólà˜C ÷ +ÞdÆB!—ˆkNó\…§=À6¨ÚVÙ~BfÀ²‚'Ò£¥Ë¬J‘½•´’2²$…Sˆ/‡k®&kJ¤!x!¸˜Šç)€¸µ† óÆ䀉˜í9t'}it$ŸdD_Lh‹¢©S¸ +äCzžÕ`#·Âz"[¡ +çzvûéç»c*œ°UÐsvíÖͬÐN +UIÑËþä^}JpÚtM8—ÉžQ†HÖ*WçíÕBÑ6 Ò^¼¼ Ø
oš‘·"“¡qµH”åãJe«€ážñB=È*
ÒÄíd™ÖŒ”ÿkQ\΄œ° ÀÚT¸*«B¦Bä- Þòia@Y¶D²¶mIqà~f7•7K+*ø½çq%¬çvo»[ÔøG{•ªûN.Ä´„Ò“MI¢5ªÕèMf +¹2=oXZFfµU~ié÷çj)¨é +ÅÍœ(SpQ8Aû¡b—18²äаhËýNºD¢«
#ðÒ³·¹-¶¤ª}Z/‘ѯ‘Í"4D&âéÕýx2›ÆŸ/£ëß®¼ì](†Ý³óÛ‹øù§‹ËóÉEoÔ?ý¾âbk†>Zù²Ø»¿;¡;vù
ˆƒüš¹Óp¹Òµ£;4Z*í²ISCPïÿuÀ52vgKÕI•ŽË…‹»IÜ@'£Ñ0
E½Œ»ýQò=ÿc(…01ö£ä’½ ½¾MÔ\"˜žÌÜßFn[ÃW+‰¦~W+«ç|ôb7Ô,5êÕp£´†·ƒö¹
ºkɧ-g®•l¥$ó*f;»B,0FÍ#뼿þðÇôwŒ©¥BoèAn8†îS²_¡¾â,h»õ¢¶?ý|ûq>Ÿ~™Î®ñ÷ªÆÄÐþ +[fôTzµKÃ|* +´ùÛH¤fÝìñÍóÝ«ç–gG‰â˜.îm©WmÝÞyD„ÍŒZ p'󹱊7.^4]NÆð»h‚±U„µiƒ?-
{³æjCȵåMj¬€6ô]3Îs¹ +ŽwP¸ØóÃ$"† »5õsˆŸ~ÅFFã÷f®Çæ퇰†×/õEñÍY[¼Þ)uúüf¾M¯Ý +‚ÃÁYãFoÄ^\Ï~9ø9ý-ñendstream +endobj +525 0 obj<</Type/Page/Parent 458 0 R/Contents 526 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +526 0 obj<</Filter/FlateDecode/Length 1735 >>stream +xWMsÛ8½ûWtå²N•ÉèûcæäŒ'S©²ïJS{Xï"[Æ$È@;š_¿¯AB¢äì¶R‘,@w¿~ýºùŸ«!
ðoHóg”•Wƒt@Ó埓…|Žðß2mÃYšþèÁx6I——>¯¯>}™ÐpHëÜ>[Ìi,´Î®×{&þ®2O%+£ÍîSÎ[m´×•¡jK¯ÊêªqTªÎ(«ŒóÊxG•%6MÉVÉN—~\ÿq•À +.ͯÇ)ÉoüL†ãt$KbÇr]ˆÅá¬Ê™”É©q,vü^ùþ£·=RôVÙXÞl8«JvX-¹Ü°•cŠòªTÚ󃓹çk_ц)g—Y½áœ +åÙ>Lé‹ÒE4±Á²o¬míÎlë¢@À/دû. ‚ÊúÖYíI;±Û3« +Ë*?œ¹(w´NAÍÒ‰€29á4^¦3Y’Ý™=Ô¾ÚYUï¹Ó@* ÄôÈޮؾ²}RÎÁ³|ÅX–% ¼¡7ìßÃá¦ÈIEõvÀ%LÀ Û+³cÒÈiÝÝ™ÒZ‰?¦d)Ävl$å-2Eev P-ɱsB˜>¤ô¯¯‚ÕÖ6… +u +U|U›ê•Ÿ?ÆÐfé`6sMA·nï†ìºoÀ¢{Ö;YùÊùµôáqMw·@¬
Hht¼åËJ ¾LGþ„2½u³Ô÷ïLþÍàÏ(îïaÓ…>¥@ +yl3Ý7M†qe¸Z +?z\°ö9-}7öÙÑÉùO«4´úzŠBz-f‰Ê– +ºíhÑA]œð³‹Ç¤pÙ²Ñÿ úr)¢<²Ð¼ª¢ }î@nC½(•Òà;f(LnƒÁ
Ë`%¯Bôp¢í|I4T·èŸÜÛR<ºÊßµópAÑãï÷÷qµ‹—â1˜ˆç."
"(Øìü> Ü3üµÅçGი»Ÿ
f +"æ…M‰è,š“T!Ã{ÑAãZÉC£QÖªƒõ¹.Z +ÔB‘”Ûí!äæüÉi×`æ"i^(ƒªy¬«åèÝt9L[Åï» +diÛXà‡.'tÀG*!ß}æü˜7]ÍGóF£4tä–<]ú· ’²Ä`Ñ1¶•ŒÎqpé‘+:vP’›ƒí9¤fƒ€^ª;áA˜"ƒ'Ô[ì.íRÞm0ÅX”žF‡U[ÈR½Pî8öuãÑÙ]ÇÜO1ÕIó>ŽÄ‹îÕo8§³å’f£q:¶ƒñíÃç[ºkÕß¼jHPÉp¾»“ù`)×õfèÉ|’Îg‹îEo Û]_ýýê¿ßÆ´¿endstream +endobj +527 0 obj<</Type/Page/Parent 458 0 R/Contents 528 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +528 0 obj<</Filter/FlateDecode/Length 515 >>stream +x”Ýn1…ïyŠ¹L#íÖ6[¯é$¡Ô¤)l{[m¼Ü°?±½UÚ§ïx
UH©‰ÒŸ9ÌãˆÁ…œÁ˜ƒ¬G$%ÀÅ$Í 9þfø5 +VC!ïRq¬ÀOù±eôø îá/®˜£·ó ЊvŹÀ³EØ!Pȳ«¦¯•)nû¦øÔ4¨–£öìf¹¸»€ª¬”÷«SA—ý«ãø8Tʶ®Ë¦dÞ£V7à6 +jk: ])”ƒÍ€ þ/a¸ëûB=öʺ÷‡¡› §ÌßDž9„$ÏË{ŒíðY*Îa'93ÝTqÆìUŒ©|ˆc.ç58;<‰‰àm˜Â]pQ7«6hL¡ðž«²ÑÍÚ•Å´m˵m¡oªVâ̧ªÃ® $l7ȹ6ÖÍM¹Ž÷K#øT¾†3ÿ¶uåé²H%ÊgàÄøD„qÛÞô[§»zŠšAcyħÌ[s]©º‹BØ Èª53‰ÆF!Yòµ×q;Äîü~mcÓÃ¥3½t½QÿÛß>__Ây0ôH8þ0”^uîã8fp¯MÃ}ò}w¹—›Òœ¢y‡‰ç,±ûÑ\¤|2ŽOvÇrz3›Â¥ú©¶m§Œ…èÈ°Ô’½6ÉÉį™—Û1˳4ç7)ÇCü¯ŠÑ—Ñ=}Cendstream +endobj +529 0 obj<</Type/Page/Parent 458 0 R/Contents 530 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +530 0 obj<</Filter/FlateDecode/Length 676 >>stream +xUQS›@~ϯØGíå +œ†Ä»^oÀ5 P®Cm·+@HO
ß{_û"}ý6B Ê°¥€=8DÉÑm4½º<Žž0ÉK²\jû˜VG+ð\XrN€‹”'±æâ4ÏþÅ’B¤ + ‡<Å‚ŒÇ†´HÊœ ÍR“–ðLQ[¿h¸;ÂW4/xö)lâGvRýXÄö±¸çÜÛ5µË
kj³hy6Ô©_Qÿw:0L`r}õ0ŸN°›´ÈclÐüQZ–‰.%»;®™ÓQ§³ÈsÛš£³ÞúeEª\Zq©W…äš3e$Üjƒ[û¯ß"|ØnXJöÌ•ÑK-™ü<Øÿ º ÷ýl),_56Ÿr¯{°`š¢±xÆ™„óH¯[³4’¿S…Ð…x@Yªj èNæÃCèPª•Y¡ÙèÛç‰öÛ¶VìÏŠIÖïêyôÓŒ‡–8`…:æ²f\C²ŠåâÎðQ”ëµ¥™Ì¹ˆÍôÕxÆT±J8¯RãT?“ÛÙôÇÄ)OŠ”5 +§L6Üql!Œÿí?Ò5zeÈ´‘;´m6ÁGyüŸ„D}VŠÝˆUù«YGµ\nŸ^°Y— +–e–¡a7Ç¥8¨a%~¿†må >“]O'_†àvM¬_jöïa˵Ûl>´Æb`ôúÛ16oy7ÜnXâ»6žúõ
1?¿º8‡ {fëbƒ^‡ï%O™iÈ"AXåZ36WͼYÛÊ„ýÀ·âmin¡jS_F£›Ñ_”¥1Cendstream +endobj +531 0 obj<</Type/Page/Parent 458 0 R/Contents 532 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +532 0 obj<</Filter/FlateDecode/Length 660 >>stream +xUQoÚ0~çWÜ#–, ™At+SÉöÒNU°
¸ +1uœ¶üû“Ð-iK'„„9û»ûî¾»»m¹ààÇ…Àƒºl9¶Äulü0Àß~‡Yið;Ä&/¼C—„Ï_ôãÖ—o]p]ˆgè„Äгã@LÛãÞè®Ú)Ïæza‰Œ šhÎ È•ŒC®•ÈæW''ñ
âGË#¶HíßÃqÜñ*³_›‘åvÚ+d³=È]@kû‰tÉåßà Y‘¦–æj)²2Ú*Êm't‘¨„â•Ü®`6)(=yaüxÅ& IÅ<{/ï°)ÆU¦´„9×{ìÁ·¦kÍaãö^èè…Éw¢´!bѨž0®j›ü?KWS–ÉY…&X,$Å$-–<CɼRÐ&¨#£kÖȶ&J)?I¢A“þë^_ $äô†S
‰Æ˜šçèçÁ
1_5Ñ«¶ÈÀÔ!Ad4-*¥`Éë3ÁSÖTô?“áàÓá1ÅQRj`B! ©ÖHh%JíÓØÓpë¼dÉ’¿ôµa¢}J3‚nëê£áæœJè50žS%VZHõã~„¿-°™Ñ
önÎÕ ¼Af?'ç×gãÆqõ`%SA×°H2–ò}¾˜œÍ¬5 +¾ôœ†Á¸ƒÔà0]GÙ|L.”#žÌ°/¨.ÿlŽž¥Â™ˆÖz4ÄöZ¿b½^Õ‰9j˜½gꌇgƒ‹†Õ´Å|wÝÕC·ÊßËa–‹ãpÿ„®ž„õ¢t}Ï&Ý.€Ø¡Ù–QoÔïÁ€ßñT®pyÁ÷B°2_–àvÇ»VàtË«›båÓ|; !nxDétÌ_§qëWë@ýD¨endstream +endobj +533 0 obj<</Type/Page/Parent 458 0 R/Contents 534 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +534 0 obj<</Filter/FlateDecode/Length 748 >>stream +xÕVÁnÚ@½ós¨RÅ׆öD’¦B" ‚›Ú¬Çx[³K¼kHþ¾³¶!‘(UQ…†±ß¼yïí.÷6´èՆЃN +
¸’I&¸;4DikPHÁUŒ M.äRd1æÀd|¬*ŒÆ,¦Á(ؤ‚§ö¢ÐH§ÑïFœv‡ˆFqSÈXpfvÀÊ…I]B%.‘e ©‰"6$ŒVÙc·ñ’‡@v#ÀtpæqE“Ô¸ú•>°å*Ã3b,L£A7˜eΩ6¹*V€†×©y¬x±Di¨»VKÜXÊÆç×½˜Ž×(\oæj>kÆjÉ„û…Ä*¸)rœZÆû.8[î¿£¨ãUe¿Æ¥hìúÎ>QÐ¥ü8VͼwÖÔˆ0MÕ¦9ÔÏ;9ûXoéUȧÁIÿÔ“ +ï +ÖZÛ4$d‰äXߣ«N[sJº[{†ãóÁèzLþnkÌ) œ«Bš3à™ ›ßdV´L-”„ +$[Úð²ÜؼJúFÁÉlv<e9ãsZT´N(RÅjE¦q¦« ÑxÛTÀ5¥ +“î·¯jVs,›%¹Z–¥á´¼/P¸LYf×E¼dÁàI‹€ÔœD4ªV£½å÷2£Ûñàês¥è±XîÇ¬€•´\ò×
¦Ñä•´H{¸ç¼ö@Ø·ÃÒÒl/k ‘ÏÉdI)¥Ë"æÑš.%få&ôƶ/O…|¾ WðGã~9Eóéäv/î{ Ò›õÿ)Yɵvì5ó»õÑö=7èõ ðÊCuÚ¿¹èî1S´ãhøQˆm^œvØ-ïtÂVÏÓíUîž~è»aÐ¥ Têøö‰ïQãgã/©q€øendstream +endobj +535 0 obj<</Type/Page/Parent 458 0 R/Contents 536 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +536 0 obj<</Filter/FlateDecode/Length 741 >>stream +xÝVQoÚ0~çWÜc»MBÂ^¦¶´R¤ÝC;!×1à5‰SÛ)âßª&¨/Ó4P$ˆÏßÝw÷ÝÙO-,üÚÐw ç[V×϶º¸~;øH‹|Á[p¼Ú½Úq´N.`Û,Љç÷!Xôèüúb8ƒû#*YÈÍI¤à#h3PšÄéýñq𼄎ãu]Ä8¢+"ïü_ź[®cü»‡ƒ +s¤³kuŒÆõ U(…Í–JŽáøE(çW“`>š\N¤¢˜|f²
4âÈiÈŒêL²—7;q5ЛÍ>Ãzņp W\UX@Ò”©€'@°4OSº
‘Aœ)
š<2\ "Ý€XàfV†Ó¡$¢YD4a'Ãͪ2'eü™…mx`”dŠ„
¬yáüÇ*{PÆ3’¬ €®}TÝÜg*™ÊâÜZ›êŠ…žh|€$¯\“]¡)ÍC,™ N*‡$<ê–{¶JÈÓ?»¾-*ô¦ŠZ$„¢<˜©bÃV[û²Mÿ®A]_ð) Cž,Û°ÜÎÃFcÚ#¾Lb“•5×+˜Ï`ÅHÈdv%å=w·ÓÑðC}ü©À|ˆ¬ªŒ«&ܼ¿êqÖˆ±Ô°i‚¤Yþ;ê'”Š,AMþ·m +3¸òÙY©YÙÛM 8IzN=hJ$‰qT'ZŠè +endobj +537 0 obj<</Type/Page/Parent 458 0 R/Contents 538 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +538 0 obj<</Filter/FlateDecode/Length 786 >>stream +xU[OÛ0~ï¯8o+Órk.ìa +¬Òh7ÛRå&Në‰;;UÓþûŽ¤AS±ÑªŽŸóù;ŸÏågÏ¿6¸>$yÏ2-D®^¨V‚B†a‹˜ã\Ç1ÝÆtà›Qkk!¬Ù.íšÁSX<ÃŽ6 ›óNâÞṶ
q¦¸ùa +endobj +539 0 obj<</Type/Page/Parent 458 0 R/Contents 540 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +540 0 obj<</Filter/FlateDecode/Length 674 >>stream +xÅVMoÚ@½ó+æVÕ®m\Ûô%"i9@Ô`z Úx×°ÅÞ¥»ë üûŽ?’bˆU²„äÙ÷Þμ™ñÏŽþ\=èäÇv pÛ? +ñ¿‡bV/zQÏŽv_ÜÄw¸.Ä)bQ1Äqˆ“ît<ü2xðE‘ÏKçTæÚr¿_Ä?ð˜ßCnËí!iL»Ä £€±„(O$e âbKF(SºFx%¶¶!s?¦hpÉÙøÐÁýh>Zù£kàáFt¿¹v%Ú‹l¿¼w‰?ßÝìÛèã"•ï!cÏ,ÓÐ"(|‚Õ0KLŠŸ]Ì.ÚŠ°¼ Æ›ÇqôxDáÕÕ¬ ¥eN„3à[O/†ÉøBäLØp³Ä¼e@¦0Ý4Ùo³¶“¼npZò›ŠfL,ç¼ÿ€ûí~8¸<,·T&E™Œß†¬ŒÓh*Rô+¬%ÇuDÿ_ð c^M2Míý&‘ûúkÛü³n»·víÔ*lÓ +g¢¬x²’çì‰Ö©(dDÐØógêzLˆ€dIÄËr^ÂÞ ó5ž†Y¯™Ã•,
±gÞŸ0Ϊýuøš«È2ø'µu¢øÚìl«óÕ¯•LyÆpàümÏ‚óÁ—÷+åŠ%Fª—cðQ³]ß³ƒ~‚ÐÃ
\Š“ëÑÍ5Ê(׸ôásÁiÕŒ–FU¬:ý*Ô¨"1…bÕ’õC߃?H¥–õ»;_;¿ +endobj +541 0 obj<</Type/Page/Parent 458 0 R/Contents 542 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F8 9 0 R>>/XObject<<>>>>>>endobj +542 0 obj<</Filter/FlateDecode/Length 546 >>stream +x–ßoÚ0Çßù+îmÝ$²Pž¦VÙX¤–j%쥚PˆðìÌ?Øøïw&©ÖVÅxB9üõÝ×çûÝÀÇ_ +†³B +JKÆW°¦9¡²a<íÔ™§Ó,oR‰•àPÃõ”eN Εú#$9 +6–4WTBštÈq&R˜ú<7XYŒrèø~Ÿ&Äp" +³¡\SKS–x®Z0ü+A‹ï9ø¶x®s›©²ÊW.‘Å:—AøáÓbUŠ¡~ÑKQ‡g;!o‹È“½zœˆMÎøÉðSjÕœ¢Ýˆ¡µ›¢9ò²OòÈw$yä£äg~¨sBì
^î4U”FIþsnëðɱY—-|èúw!ôšÊ…bD¹h‰™Îoo‘÷Rûï÷€6U³4QN?OÓYöà¸úÖÐ<Ƕ÷Ò:®\ƒ|§0¿UF·f/$«õ×R”¬¢ØPõú‚ØWÏÉå2ü +üÖ;å*`G;ªOÒäÑ:¾éØŽ[¸ +endobj +543 0 obj<</Type/Page/Parent 458 0 R/Contents 544 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +544 0 obj<</Filter/FlateDecode/Length 679 >>stream +xUßS›@~Ï_±Ú)W>´£FÛ<5b_´“¡p˜«rGá°Ú¿¾{@И¤Ž“aÈpû}»ûíÞîï<lâl`\' >8¾‡ÿ-| +i}à˜¡«lêïùÁa8øtâ +˜ùèëªãc¢ØJæð“kqæ·Löf·—îŒ' ÓÇX†V¶E¼ÐíûÙhø¡¯m·jAS"ÊЖ[W?‚þÚ¯l¯ ¯Fãж6×Õ2 ~É´/—•Hd\e,yžG7ÆmR(Xwýb™iò–zC»_Öíþ¦¿½I‡¥È•à±LX{y +endobj +545 0 obj<</Type/Page/Parent 458 0 R/Contents 546 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +546 0 obj<</Filter/FlateDecode/Length 879 >>stream +x¥V]›8}ϯ¸]©Éƒfß !«hdÀ3™jU!ÎÄ[‚Scš™ßk>æCênÜ6QPBÌ=>÷ûëÈß&Ì,¸šB~¦¦1±ÀvføÝ °ydôçr +¦ dLp¸a +ß®µkÛàVÏ(šjˆ¦ª”¥['·ëþ¾—E¸«0“xAÈ`ÇL<CÁJ‘st7/K*ô±<÷FÎ4ÀËò/Íé—ÐÈ*ðÓ$º‹çþef–ï^Z©@²#y#ÐܪÑ,oüI?t‡»Ü\Ƴ
pO¸D`Éð²\òœ—½l:V £{!™c@È¿Q4¹¾
{O~àùñE.&†ñ¢sC@;-'lbÍÛTÓì"ôêÔ‡¬Íî^%|mh£#Ébå®Ñäšpö+Ü°® +†»D5˜àÿvƒ!#üpõ ‹è âØS/’ÆZ +É%aPÔžè—Ü.·—j¢/R½Ù²ªàgn®“éåécOj# +·¦Å\ŸÍ&"~HPøÔ‹£-Â^à¦ÚõÂM2 yV©4hw§@Š´ú1à¹ó›»&¸êëKؽÅÒZM›Üõõx¢»*ÈpðÓPC4´ˆ:ª|†Ð{ÓG-nëhŽ®W I£pý©ƒtú³9s&Óëk<v§7ð\XPŒ;~¢¢†¿V´ù0FŽgÆu{P’¢Ée#h›µö̞̦1ñe +Ä'£ÛÑwÞ]ãàendstream +endobj +547 0 obj<</Type/Page/Parent 458 0 R/Contents 548 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +548 0 obj<</Filter/FlateDecode/Length 1256 >>stream +xVaOÛHýίõœ×NÒ$|„B¯‘JšB¨®ºœÐÆ^öήë]¸_ovr!Tº½Ì¼y3ïÍþ<H(ÆwBƒuû”.â(¦îñ1>{Ã>;ø©$åáE—m½8¼ýУ$¡iÎAúÃM3B 8¦iz?ôðѹ®²N’ÑÅ#Ií*%--DõCfô¦0©(ÞM¿#`¿ ØFÄvÒ:ˆyxõõfúmr~söùâd4¾9__„Óéׇã‡aH»™÷Ì,„Ò6¢é¤Òþ}%«¥¬HèŒÿ +o©•XH'+@«£¹¤ñõ§OÑd~Ôcd×£ñ´ÛyÌ;Tߦ².7ÕâFe;bªüúytöÛË¡J£4°‘3¤sO WAÒB|7«Œþ±zKéÿ%–{,%ÍÖÝŽ¢ˆæÊQ®d‘ÍŽö€üuæR³X`üö宦—{Zj—IœÜpPzUj2IoÉädÃd½Ö¢×³Üpšï¾LÍ‘]Sºš,ˆáŸ…ªwi¦YÆø1[·ÒmWÕkÏ¡]Q¨[
½Þ+w‡‚Eå¸^A]]œÒ™¬Ç”Àrò*îö‚V.®.'ïɰÐV¤ŽÆ 1£‰*›y^ƒj:ƒ¨Ïû€Ùʤª°°u¾!Z _RªrÛÜCÓd@Rs¸]»›lá¤ö9%>+çd—p•¥Ôè¬NpzìBûz×ù9NàDxa2)!,Ö›ãál6MÎg³çÙ#úfê`5¹ª`8fŽ25 Jú<ù|V]ÌU!é–UÈÍQ¬öMŒÇ”Rÿ`pGJågô(¶ZÚeºˆ`R$Ä¢,d +Ú}R}ô³ÂRuhçhäaÞÊÚ@[ƒZ/?®o³[<üŒ‡ü°B`s)ÿÕ4œ;c‘ÒaÅøÑú“ɈÞÄyóB(M‰³C¶Ž;;B±>˳¶tÈ©ùØGï4*rSæp ŒÕI +ÿE(àûçeÃÚÃÂô±?6—ÃYŠ¢f¶e¨x0ÿëƒ\Ž^w›¸0>—Ò–F[\’X~Ô…Å…,<%ž.ðd•_=àRTÙ“×ç oÖÌGˆ»›»ðÎsÄ} ²ãnƒ9Ænk[¢«àÚÝ (ÑŸ5Ë"kQ–|ä`lRÀá:ÏWÉì°¬Ì\Ìq)KfvÄýBåyƒiLq(³¬°8|ƒÇÎÞ,QX¯ +ÌXªÍv2s¿“³&EØc|`œXeŒsm
V`c¥p¥Ó¢»ÿ¶¹9"ju÷Üõ'ÆÃ?zo|zÈýóܾý0l–D2Fýãcê¿4—Þ“‹Ó:“KYÀÜq'ý½F»\{u¶=ˆy]ˆû6koЋý!¶ Ž÷Žr>=ørð€Ã”¤endstream +endobj +549 0 obj<</Type/Page/Parent 458 0 R/Contents 550 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F5 6 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +550 0 obj<</Filter/FlateDecode/Length 970 >>stream +xÅV]oÚH}çWÜö!•jÇ_|¥OIZ¤”²‹[´ìÃ`Ã4fìÎþ}ÏŒ1E4´+ª5’1öý8÷Üs¯ùÒ )À'¤~Dq²U'ðúvRøP7‰ý!%ƒ>®ã®“âTÀ6€÷áÔÚ:ƒÆ6‚½3½I;—£„ÂÒ {ƒ>¥¹ó
(Í.FBi󊘤Ùû“Uò/ÂIò̈J’дb9'S‘YrOo'½dŠû”â÷‘åj
-xc¾ÖB>—™ÚÕ†ç/ÓÏ€¼0ö#侨™ÖÛJåúÉÊPVr¦<ߌ*[0UͦE +ÚUk4Ú€òìÍÍ™a^ÚenÄõ…vŸà°Ê‘ÄÊ’ÏÊΉ=j.í̶¼îGw¸²1f$r0UeþÛ º‚Ô†)Wg˜;ÔfU:Iïg×.Ëä.½ÿðöÃÄ©8wÒÕペ¶Â,÷¢ìV™×[U(rÿ¼]u¨§iÁ3Ÿ˜l]av5ÿÎñãx’~îkÙüηKžSýŠ}Æn¸Ò˜á³±Î!Ïzü:äØÐ
r!ÿòè@ŽåäCÖu%±”ÜÍY$çXÏzü:Öc`Ÿ7oá‘b´ÆÛ +Ô€XÕ»·Ž}2yݹz’³?¯'þ|v +endobj +551 0 obj<</Type/Page/Parent 458 0 R/Contents 552 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F5 6 0 R/F8 9 0 R>>/XObject<<>>>>>>endobj +552 0 obj<</Filter/FlateDecode/Length 501 >>stream +xµUËŽœ0¼ó-å À›ÓìæyH”Éi¤ÈÍàl›U6_Ÿ6CÒb13«$ì.QEu—oºBH#Ø$PvNàät‹³”îý„Ú¹*œ§¯žABQ"ÉR(* ê €¢te]+Ô—Åw*‹ç2‚ì°òèE‰ÔýÊÎnZ}ßãà—·ï‹0YWL³àz`û…†Å^7à)Å"ìÜ›{jw\”Ð «p +?ô?®ZiYZñ.V«ŽH™ÅN4:J&Jl¡”£Ð'“Nˆõù9—4”È}ËQ]R{ô p¸Ãê9
=ÜŽ¨4mÉ^Œm+DxRaͪÓè’‹®øÓoýë,Ú¢4´I€)¶wî^R8PÈÕ’¢úÏp}›†kNóÛ²ùà ÓÌOò’(÷#sØ|Þ¾»Ú¼ÃVö8(x=R +endobj +553 0 obj<</Type/Page/Parent 458 0 R/Contents 554 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +554 0 obj<</Filter/FlateDecode/Length 977 >>stream +xVÛ’ÚF}ç+ºüâujQfta—MöaSή\~ˆS©A¼ºY3à%_ŸîKÀ1 ¤ž¾œ>}f¾Œ80|sH|bÈêó„ðbE‚×>~z>_ýÿ0¢ÐKœièEΖ¡[Ï}9Û0ö¸³=¸Å?8qféèç» pi)Æ"4·N¤ÙÕãû›¿ÞËìY(ÚÃ~Y+m®ñBwm£Õ5,Ê&‰Ÿá"{nÚ¯•Ê—ªVy—~F÷ñÞýؽ\}¸ÿ-°Q½.Û¦–ŸÃpgˆyàùdÙ«®Ú‚–µ©]ð銽°èÓ»ã +Òx¡z•{4œ[T‰{XÉjÞìŒj nÑȬ$6ç`¿ÖZå.Q;Û]‰SÑДë~£7Ù7ƒ é÷BìÄØ<¿( +r¡±Ë™±:Î?¼»–éü6àqÂè:L¢i"¸O×BÌy<ŸÝYËL}¡Ž£Þ’WKœ‘%uS!¢[Ò +Îo&üf>Ûs1±žb +Î|wŸüú®Û{È]ò[†!¸·¸?~Ê<)‹QðøÏÓ”@“‘&6Í8vù$"€;Ù=íô¨ÑGn÷U‘Ò:"QA¨-¤6àJrzõ/úœb¯,‹–¶+%‰Üe±#0|EfY×åÀk·õÀ`yíìôª]W¸
Y-~5Ç´vš=Ãò*-šsD±–/F—ŸQr´(ëu=èK]jÚº¬tÑN´Ö‡ÇÁw‰ºÃÝïB@÷L•< Dþ@ì¶ÔºÍ–ç$ÌZ”ÒàH.ûvÝ¡ØJ.—î‘tª²›ý™Š5°“xêì¸ÜÀ¸!ø†±Øœ¬EÙy1çŠx½_9û½°ífúrA‚ÒÔ[Ü÷^Ô®±;”ðk“ ĉï‰8"Áxš>̦p«6ªj;<ËÀ/kÜ ˆicg=NJX~õ«¥5= +<ËÅxÈ£ÛaH·æéè÷Ñ?–tÍendstream +endobj +555 0 obj<</Type/Page/Parent 458 0 R/Contents 556 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +556 0 obj<</Filter/FlateDecode/Length 804 >>stream +xÍVÁrÚ@½ó:’L 6qlsètB›¶9$Ó2=”Ng±epk{Ý%|}%Ö&ÐÄæ’ét|ðjõ$=éÉwú¹àÔ‡(ï8}Ά=½Ÿú+„Ä8ƒ¾ÿÒ8ÏF“Λ¸.Löî‡Lb ÇIÔ5„b™ÏPL@¯#V¨aÚ]
"{k
3ÄÜwÓ£i×Y¹Ó££É/rêWN{äµçžöä·{{y= ¿ÿ°;°[¯7[$Ïé¼È±0PŠ8N‹ù ˆ¹Hmàæj1ªœc3m”ˆLJ>no.`üåýÏËDDØŒMy‚(b¸G¥ûœ.ÝEÅw ÊR&Õ°ÔM+2Á:Aõ:ÈF$q+Q\RÚ‚wË;û——“<c…ZÃøÛ~”ô¾5c\2,æfÑ\{Î…à. rRæT“([2#ÔYT <-„‘íl”RY¬—fÌ$1“÷HxÀϸ1NöQ1æÂä*2F=J‰×º"ußíT„a©j¥,¨ÖTò2cÖEBém’·
ÇÁXË2[SgF¿Ñ*r.VF§-m§ENPšðï–¨ÿrølzˆ7r©^Óåé€àµŒæiÜLÌ#*¹Ÿë^hÇ 1’ELÓª¶óVµb³S.&ßà~µAs®!F©tFì¢PÔòm½õ¯eƒÃRHÁ.3SMaÝJ»ÇI=IfeNŠé¬œÿC«ñ·‘5“cÏmà¼EXšƒòN
ªPhY´yæó'Ï…¬®€.1J“ãV˜c¨5Ö.¤mÃxf¦¾Yí2H”Ì«¡Þ¿FuãÝ5)Îa-Éi[ÑŽªÕÓŠÅsEa]GZ8k™ož/JÁŽ\1ƒ<µY&£í™æRsʬuÚ,g#XËXQ«FnÜÖDgI@³mpÕÄF´"…I‰ÙÊÒ˜^1ŸÊ’ÝÊjÕ–²¤áiNH–¨,H5c›Ž³ÚsXE×£¯ áüÀ뇼oίFçðj±
Ÿ–ãôÜ ÜØögȦŸ·_Ýü¾¾èµwÆÖ“Î×Χé²endstream +endobj +557 0 obj<</Type/Page/Parent 458 0 R/Contents 558 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +558 0 obj<</Filter/FlateDecode/Length 1005 >>stream +xµVÛrÛ6}÷Wì8/r§R¨K))}èØ›x&Q\›™ö3ˆ-ÔI dçës ]ÑVTû¡º‹XìåìÙÞ
)ÀsHÓCJÖGÁ 0ãs2›âs„·–”¹…Él>˜ì[‡?=ßq½ý=¤á¢AÂÙ”¢” (Jz?±õ’¾\ŸS´¹É´'Ñ?Ø2i¶ ¡þp<aWOPå,(••,RYX*²+I•ª$b-)îUº\ŠeþàTa¥ÎD"ãEꮕõz)u|âcÍ›X}6š¡:»ºüõï+i¥^ÓÕŸÞðß:ú£Ð›}¹XDã‰</“¢}?û7dÔWIeæ’pe§Â +R-¬4Ý.—¶p2©ÒÒ$%*º?†Í€° +è4ö¤.•)©‘a¤„AOïjil‹C[Þ³Ø3JD‘È<)ëÃz3…Ý/Ü/pÎùêLaPÍ–*Ð MUqs +B0 nOUëª4µRSZrp»R†ðª‹Û¢Üƒ.€;MX”V¾sNØ?D¡pýéŒ"NJ$¶,vdz賶ےjhFÙ +<Ö˜D(”ñ9eJË{07Á(ü™3Ø©†3²
ÿËT.ia×ošL1"n
ù”É¿v“2UYé*ûÏzÖ’5ÒÐZÜ[V®ù—vÆJêÚv£ð£i©ˆç…‰v‘Xd\Ö(óI1ûf‡GòŽ‘ôXìBëm©m¹ïx‹Á¸MÈvxö÷í1×&ŠG +£xB|
îx_·+ázÄ2[¯·-iéXý¤B5ê-%ô (Gn_âZTïQ›S2%eB£4';=R…²JäôØÕF»©Øw\î"ØùDY:ªpãá§-ŽÞ˜MrÌ%í?Œ;Ö……±i¬÷#s´L¿Ô5߼ܳ—‰ÿÇ÷öÖ¼X¿’ö@hRŸ5·$ÃélÎç¸orw@קŸÎNé7¹‘9fÃù¾y¸IýÖ²?
æ|}g/M¦“Á4œáî—'!_:Žþ8ú–Wä:endstream +endobj +559 0 obj<</Type/Page/Parent 458 0 R/Contents 560 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +560 0 obj<</Filter/FlateDecode/Length 767 >>stream +xUQo¢@~÷WLš{°I¥€´oZm¯Ikmá’{hrÙ œ¸KÙåZÿýÍ®pjm59Ùo¾ùæÛáµå€M_º>ÄË–mÙàõ»–^/ {—~%Bjzž||>ŒZç×8D©Æð{D ŽmC·Ožé3½Žõu2Žîn&'§Ño +óë°Åu\ßò(²= +/!š#<M¯~MY¼@iÉf9ò™šÃ—/XBÆáEÐ_E‡Oà _+” +Ý›ƒxÁÅ[ŽÉl‰\Á²¢ÅXpÅ2®ÓÛÐqº–«SjŒ]¤‘2*›@Â;£tq^%Ÿ™å-fsd –Öº FÂnÊ©i]ê
Žåu]Z +¬])ñG/w4%ß²ý‹f‚u)fq?e!¸Äÿ…–
ôùuÒ>¥ôk†]·a8‰îÂD%ã’Å +&l‰ L³÷Ö}oë¾IÝ #˜”IPl'ù2 +¢Â¸é®.Þ²ÚHœÊƒÇæ’•E|bA¨eÔNI³aN6Ëqû‡l<²µíŒ$!W2ÉÊ á»*W´ +oG‡¥õ€øR·HŸ†#HÇj3:X•m¯«êÕïÇs-¿ßŸ$ºpÌ$÷ÃŒðæ¢ÀRÂMEÎÒa'è™ÝÀîëwp$z½#ý½Ti§gº=ŽZ¿à]
endstream +endobj +561 0 obj<</Type/Page/Parent 458 0 R/Contents 562 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +562 0 obj<</Filter/FlateDecode/Length 691 >>stream +xU[oÚ0~çWœ·ÒiñâÜÓ—‰Šucj¡—tOH•I%]Hhì´BÕþûŽ“Ð-¬«FDäØÇßùü‹ï;Lz8øØÄóŽÉLðYà>-ú—ÓzÁ Cú|mÁt˜÷Ú‚½Êr9^î0ÙêUÞÒѱ™ÛZ!³Ÿésf¶¯ÖÔuX¸
zu>„Àˆ¦tV/ ARo5!Š»§W=-0‡ó"KãåatGæpÞ˜–OæÝa¡ð¢Â¢6ƒ™È“!9LD¾T³4¿…eQA–þDÖàÛgœ€iÇÝK¼¯Pª—~¼fýÇhÐÿЬ:ínŠŒÁm + mŸTÓ)–Ä"Í–›(ƺáõpp]Z»‘$–„”‹9‚UžÆE‚ U©Ï!•(•<¦jê±€ƒñø@îñ7:þ~Ó‹¢ËÝ‹ÉÆ +„"“Já>´ëÁ0²÷çD9A™–˜€ˆc”-ØJðZ +ëYr¹(r‰›ìM0¬VóóÑéÍ·a7u$ß„Ú¾DU•ùn,òiž¤± @V›ìë,ñlÞ$„ö}Qa¹„A>-Þš¦©¶3!%9£’i€y%•NXE™,uä…¤±PÚHÏ•Mv¾?}ÿ«”:¸·[ʵCŽ»"“ˆÍ0}6»ß—©Å*OŠ¸š#Ubo/Ì9Ô*Fk'ÃY÷ña'BÝÛa®P^»,°ëv!©~㌻ +Y¥\ËzÍÕ¯Ôât‰¡¦‚€~{j%h›#÷}fy>]Z³l[ï¿ê÷ ¯I,%|Ò¤®~ƒûóÂß$ɒ׺¿ã;Ì'évHºN ¹}‰:ß»!ãendstream +endobj +563 0 obj<</Type/Page/Parent 458 0 R/Contents 564 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +564 0 obj<</Filter/FlateDecode/Length 457 >>stream +xåTMoÛ0½ûW=e{’-øã˜6]; k×Æ;šÌ )•ä!û÷£-§HQ/+ÐKÂ0`€ä#ýÞ##ŒE +Yj±„AΫ¤QôÒkVC@i’O2ʬàÿ +”-Nëèó— +¸€zESå%}4@1µš]-çp®»
ZéjÛ9
,ÌF¶Ú}ª…bŠã´ âÙ>vè|ˆ +àOÑ<éÁgÚ +endobj +565 0 obj<</Type/Page/Parent 458 0 R/Contents 566 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +566 0 obj<</Filter/FlateDecode/Length 602 >>stream +xµUÁnÚ@½ós$Uíx
ئ7R’‰@N/I„Œ=(nm¯³ëD¿¾³Ø8à$(©,$‹Ï¾÷æÍì}‹E׆ŽaÚ²Lf™6t=—Þmú „Õ&Ðë1Ó;è4˜Ý3»‡¾ptñgGœùÓ‹>0þŠP9ž~„ȲÀÛ3”9Ï$žø¿)ÏÙå¶CgøQûÇt¼ø>–ñn'ZëJ°$&\b9Oâp
wA%7í Ià/ +.oNtC·-,°P"#HÄY‡A¤ +C”²<PÚè°Íx>€1çTóÑp¾Z³kOx_ Sé³BÄT7ÎHð’)¤J°DAŠÈý¼{…²0w*åÛ+1Ìp“°ö[Ó$jJÕKmTÚª{5šø»L8¤þ’/Tù5
?5QYÄC•’XÔȧÉEòÂRV(kLñ±õ3þq\?!{M +´ +®»œ[ˆ•Ê«†q8½\ßzýGšJm§¥Ö°ð.×̹mV;äiž`ɺÎ9°\Ó<s^94;ï½2®šÊìü¢ùôŠ–@ê,f!îæâ…öaBú$–ÚGÁ’?`9÷‹¥&Õ1®|³SþÖÊ"vÍ#¯ªL¦’¤ÈJðªµñêúTÝ>è¥÷r)S¥÷îÛ
lµ˜·`i1Û½p½êŠa®g:ý>8´ú7÷Ì|py6€!>`Âs¾©8ÚÜ[Æ6×p¾ÞÿzÁ~Õ7’nP×íš®ãÑ-B‘ž¥ÿ:÷[?[ÿ +endobj +567 0 obj<</Type/Page/Parent 458 0 R/Contents 568 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +568 0 obj<</Filter/FlateDecode/Length 842 >>stream +xµV]oÓ@|ϯX!Z„í¸vÊJ“ +¾Á¤;|ÙQìëÝÍh`¥€B.Äwj©*ì=äã%“_ö +3™fšý€‚Í2YýÈÕ¢ÖûÖ/œ=°endstream +endobj +569 0 obj<</Type/Page/Parent 458 0 R/Contents 570 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +570 0 obj<</Filter/FlateDecode/Length 876 >>stream +x¥UMoÛ8½ûWÐCÂR%Ù‘Þܦ]H²ÛÆí¥^,jd±+“.IEë¿CŠrb×q +†
K¾ùzóæÇ …„>)L3çÀ׃$Nà<™Ä9LfSúŸÑW#”þ`|>ŽgDz$?~#M³8;¼ñv1xýai +‹’¼ç³), + ÏI>¼ÄRH4P*
¶6bƒ#J+Ê+zð£A½¦ñlñðò^”åñ„‡W·søŒdg,¼«X]£\á›Î¼wOYGé˜b$ûä¿d²=>vp·¨ïQÃ_̘Vé‚žíiÀü9Àù5\©•’§a²_„)ËÓ8ãgpæ ;Q>ƒáÓwJZêÓP¡wRÃJðå§'º·ï:(sÜÞ(‹o vuÓµH²5‚±L[ ¬l«àårùxÅ4ãµ& ‚5›
5•3ƒ±sà`…óZ½£ßšñŠh:©¬Ñãã׹ +VÓ×L²ùÛô$ª˜©FÀVLHbj[ NÑÒ +´ã¬ó)Œi° 1Øs.ÍsOca
Ö%,‡µjCZ˳Ø!Ò ·¢®á9!÷˜dùµ—g!‹Â¡ù!aFP3*`LÒP6†&ò òe(~ï„~Tk`«° +Xݲ©][(Qãzµ+Çr(bçáêú¨Òÿ
åöùR1©×”ÛW×@ÊÔ½}ý8ô%Êf£‚tçGôâëŸ/_u§Çä¡‘…âÍš8€Ü5eéz¨=ú@$hO5¾Ü|¼]|ó{vµ\Ž¸:Tõ÷`gÖÍÆ·ÙßO! +‘ím‹(‰íÝ2q²¡±ËnähÎ7ž¨}4ú}ÅjgÏ+äÿ:‹õnÒéÁIþúÑí.G;Dºö€CsÚC\~@‚ÓiÁFã½P©·GqOüü9Œ0.»=q“¸ú§¬ÙŠä@úúÌz©ñÓÉœ+Fê×ÛøJ„Y›…YK§³8¿¸ î÷ïíüúí.ñkEkà†–¸K9ê-£irñäªv–“é$žæ3j1Éü¹ïÔûÅàÓàRV…rendstream +endobj +571 0 obj<</Type/Page/Parent 458 0 R/Contents 572 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +572 0 obj<</Filter/FlateDecode/Length 853 >>stream +xÝVÛnÚ@}ç+æ1QcÇ6Ęö)wEJ“¶Ð§¦Š6ë1¸˜]g/Pþ¾³k !éE}ªÖ;—3sæ"zÅÐO ›Ÿu¢0‚4íÒg/ëÓgBo…PøGñQ˜ízÐí¶Hâþn‹8醽]®’ÁsO'£ÎáE +q£‚ÒM³>Œr T£F|ïF|KiafµÃ¦¸¬— 0^•(LÀYÅmÅæÀætT²J>Žåœ'¨ð +J£X.E!·[F¦¾d_åõ…R½âøóÕÍ(ûòŠãšåy)Æ`$ô‚‡¥¡UåXP…Í´aʸn
ߟPXŽª-ݪ4[(\°nò2ãû¢bc
ÐwI}vMoŽîö¬¶¬‚9«,B©!úND¢9ˆ‹ân¿qºj˜ºn™®¥Ð¸]¢ÃªgüWÅÕ¨æ¨6É÷¯Pj6£‚j‡¶E^ +"¶ç˜Ñ iÉ¥ÐX%h”ât´åµ¡`eeiè›Y1r!ÖL&úº)ºqËÔá1`˜Ö©rú½ƒÙnjÛauC)pAcÒP´Õ5r×'¢ƒ³ó! àjYû™²Úó‡Le•¯Méö*á‡}ŠKŸìFc… Š< Y >U˜È©JM[àI6Dc³Yþ>Ÿ Ÿº3`cV +'9O +Š¸R†×çnÏLq¤«¸íCÖ +祴ºZ®E©ó
ÁºÛßÏõ9ÀQ+9ñÖ(ë«[(9Û +endobj +573 0 obj<</Type/Page/Parent 458 0 R/Contents 574 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +574 0 obj<</Filter/FlateDecode/Length 812 >>stream +xíUMo›@½ûWÌÑ©Â0^p{¨œ¯6Rê¨1î)’µ%¦²YºNÒªÿ½3Ä$qÔC{,–e‡y3of߸øó ôaÄ!Ù\æ8ó!ˆB¼÷ñ¯%dvcFû6¢\Öô-.ð½Ðc^çÃð¾ó‚€ÌmO1÷Ù¸3îz—MönøþË£xðöl^ +¹OáÿZ!£Ö«øŒO&Àù„q>&™À¢MáDnåZ•öc§öáxøÕ'k'tQ`Ÿ¶VAu
€…¨¸ø•M‡ã€Æƒ/ƒßÐJîendstream +endobj +575 0 obj<</Type/Page/Parent 458 0 R/Contents 576 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +576 0 obj<</Filter/FlateDecode/Length 689 >>stream +xÕ•ooÚ0Æßó)îe+5YÒ$LÓ$º² +  +î«1Mir@¶`ÓØ¡ë·ßÙáOiiaZ÷b áìós9ß5\pèíBèA3€tÞpl‚0°=ð£Æ}J„Ip\ú¹'pî{v°/àE-;ÚhêäO2]°Æ»Ï>¸.° © +¢X¤Èq€¥'%ªªä° çYž& +%È*MQJ*ž‰´š#W˜Á$É‹Šd¯æå‚Û§ìeoKIuv«éÛ>å?Ó«ßîöF½ãŽþb½ÁÕ ®—A–R•´$ +ßÃœ6‘…Pîó¢€Tp•äòK.—¸™qJÀý,Og f¸Ë™¨Šn$é¶MP%åĨ.ºƒ‘–@ZÝ&mÌ“9%aع¾éŒØ÷¸Ýï|ðœg”©ÞÇÿëyz7³FLÌxž¤³œ#eö4ÿ–xW¡T[‹È—Ú"·¶èºÂò&¢„/—Ÿö¸²õ$fK,%ù}½~Ì”ø‰fè9fH²>!ÁZ ÔE%Z¬ Ϧù¹žW;õDÙ +
Ë‹jeÃZúsMA¿éÆÌ
êðš,}c¨ó‹à +‰¨WJ´/±áËÙÖöjËw%Ÿã<¯$ÒÕE_¿½,h‘dYΧ?Ϻ}Päs‘O9«f 5DÆä +endobj +577 0 obj<</Type/Page/Parent 458 0 R/Contents 578 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +578 0 obj<</Filter/FlateDecode/Length 593 >>stream +xÍU]oÚ@|çWì[R)vÏئ/(QÚ +)A*¸OIT]ì®1wÄw†¶¿¾{¶qpìH‘ª‚Ýzvvvgý8p€à×Ð/€d= 6áȳ}ð£Ï.þr‹òÂõ†ø÷ÙÅE<øøeŽñ±‚) !'§óók¸’K)>Ä?10 +÷¿Aï$œÜÞž@²¢9M4Ë•m€ Xn€¤Ài¼Å;.Å\]Oc-XytIylå X ^1P&9Ux–˜yÉ·L˜8s•³Ç‚)ýz®B±¼a^E·Ø«bMï3$ßÊAõk॔BQUÒ¬ÊþRÁºäï“iìÕµ_Œí´Ïv$ä!Ži†uÜVK‰,„nSjãL'óxvœÔaËßÓˆßÑÉ£µ5å™ÊdgM(´ç¯‰f™Ü1l6ÎQÒ+PX*‘‘€ùäÿÃ:ê3f¸Q<ýaâîŽÓ{B<¹@Ôê 4–f•žÚî%Rn:Çø
MS.– %øcpÇ`` _ +Øq½¥i®Mê½Ö¥¡:’v‰ÝX¼C™¾anvû0ê¥Raà*,ý[ +è6®6B;ÍÁÖê#ZZØCÏö›U~“ÿ±
‘âNæØiÛt^(ý3ôЬG×¼Ú¾˜Óÿmd¢zœ0²ƒÑ‚°ÞÚؽ‹s¸d[–É
¾¬àkÁÓ²:kk…ddx«Ñ~èÛaá»o†åÚÿ¾
þ=2oendstream +endobj +579 0 obj<</Type/Page/Parent 458 0 R/Contents 580 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +580 0 obj<</Filter/FlateDecode/Length 742 >>stream +xÕUMs›0½ûWìÑé +˜ +,¶Z#I¤q}°èø£=Ö{°wõ´zïíê©ç‚CoB$yϱÂÀöÀBzö裲:pìGÛ~0°ým+<×±ƒmAþÇgqïÝ•®qV•D!Ä)PIŽqÒÿxã9F~Gq£Ì!¸ÏÀ¢TkàSqÚŸNî§÷ç+&4KŒYŽ)|â6‹6ðX^H¥Ñ’̸@
™T`\CAÙo§(ÏV\Ìéo„§Õ +˜Â“)XZ!Íæc40]P +\Š2ïnXéˆ>ÚÑyq².H}†M¸†AõŒ +® q$2¹Ë=n¢ÄQ°áÃÝ]R»òŠáþX<]W¾Äg\)èÜ$xfË‹š…ºBcÅô«ÌÙãrUÇ4Q
LÓ³¤„߈7mìªÄ6SõŽ Ï´b…g›³¾ÆÄp)àxv9[Á#‚Ì`ÉsnHC¦5׆‰a +kÄÚµ]*ì¨9òë-»·ö¾¿]¼ÙMh!¹0Dý¬o$èFAG{?;êBv4»¦ñÄÛ
ÛBÚ3ÇÑ—¯»a +–¦µ#%ÌÉ¥à‰L´QÕ¿¾õ¸2$Â’ÏQF.iS¦"³2òôæŒd)ª5‡?tD•öçÕ-γ¥å±=0) 6ýp:¹|¯n܇óx²t{êf@´ûµéN}ØPê +endobj +581 0 obj<</Type/Page/Parent 458 0 R/Contents 582 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +582 0 obj<</Filter/FlateDecode/Length 895 >>stream +x•VQo›H~÷¯˜‡>àPÀp¥>Û©¬äÜ;›öJm—uà»”G¾_³,¶.CtBHxgvæÛo¾™õ‰>.„Ì ÕıüÀöÀBüöðmì{ÃÕ•kG—¾ãÛÁECôëúu2y3ׇdɃ?2ÀÄŽ 56¬…k¬Oø¹æ{1MþÆ-¸®Þby!n16¢e dVB!¡ÍHR18²c@$¼_lØŽÉÖÖa0ó9Ld«ÜÆV;üš&Ðö/›õ.ÙzÚîû‘/Ë!Q@j¼³¿bý×ëËz“ÌÆ¢<-Íõ^bíÃxg´²\þ”ÉË;ÁýßyNÔ¾€ûõózùÛëg®EÁ[,R+`·Ú~]mÖ››Ï®ãŽPpÑs„Ñ«©!xy’e,ƒbÛ½nU{.¸õkD:UÉ5]
k»†£Ð,ÔCVPÒ2 ²£”Iyfõ¤´hÍ|]ñEs¬[ñØ:/(È"c ö°I`)*‚²Š;ToU´Bðs˜AÒÖÌAÙ£.–l_ðB¹©ND«jõŽ³,5b׌=
ýýÍ%6ÖÈt ß-Âh2Ö ÈFXᢢi˜EVðGðµã3zö-@š†%Ä.žA<ð„äEÉW©qk.Ç,W;X-®qª(“) +Uæ§FEh^pöP)Åé>~„ÞTJ’uU
ï›PªÍõ³2œ7¿ÃÕÔè•AÊòØû¨´¨ŠÓDÑ57/¨ÈØy{:UÏñvHoÍ»'siÞ!Ä×Ϥ\*æPE,kÉøc›Ã]8™rèK©Ê}ZÁpøVÙ6O
³L§÷¯ç—Ýw‰Sƒ`߈ª„Jn‚è%¦H‚Z÷Dµ:v1úPÊ$l—7u”ÿ-´íÐïÍþ‡cÛÁ½j,UÝ©¹A€b4Õùd,eRTX®1Þ‡&¥v.o¡Å
cG æb˜ —„9´-Kuù0"iŽÔaù–š[ùáÔ©\ÏçEÃ=çúžÌçø¯`®‡Ú.þý:†¥ºvEÍ Ÿ:œ +½å†xߣ¯:óþ†¾|—û¡o‡A„gäU¤¶®’ÉŸ“ÞbYendstream +endobj +583 0 obj<</Type/Page/Parent 458 0 R/Contents 584 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +584 0 obj<</Filter/FlateDecode/Length 1348 >>stream +x•V]sÛ6|÷¯¸§FI(V²eÉòL3£(I›IüQ‰ž<Dy€AÈdL4 +´F(—zEÊ€„µÊ¸Í€ÓtDdòÍàØò¼)<> ¹ŸÃ1¤ìó0{ ¯ +ú®Ó"-î(Ö¹HÿVf) Ò.Í2Ò¥ÃHD–íI8§òÒ‘Ó$QÜ)J¥5wÚÄ$Š¸›HêÂeÊP.ö=œFm+«8SUƘ2Q¬JUÄu—ZgöàÄ9|gCŠ’ÔÖ˜Df5i)+C;¥îÚÖ)³&¶a¯Ëå9Ä‚ùFi®6íJ¾èÎ{%_GvÖÊüPæºii(zD2èáFN˜Ø¯Ã,CY®wÛÍÀ` +PS“€2ñ}9øš¯ÇÌäy‡jàêÖ +\òÈú5>ÛDYæ2Ów¬ Ý•Áf2¡'‘¨d+™ +A4÷Ö –—×N-À^¯:O¡ºø¹
û´^*÷Yßéb-rÿ¿eõ¦?ÚŸyOƒÂyj¯ÁÄxê—ó'öÕ úOÌöšm··•Åæ8Ë%Ë‚Ñ®5EO$Ðã©vºƒó´ošCØ=“[½€2ŒßJ“–.¸ùø.X|gåüFtiöÐ>:–/ÑÉÿ/‚ç]WžŒ'Öy‘xƒ~ÆÎaVÛÔX÷O–Õµn©«,¦[Õú:ÞÃ!Š½.epå=ãDçì|…r¬EÖ$>öºÌ…LRl9¡a¾o¼/ô® "«TH70õÌçkÀ®ŒºÕúeóvê]¬Øé^QUH³‡Ó^F~3>_ +pñ…²µE¨hy+RÉ{[å} +endobj +585 0 obj<</Type/Page/Parent 458 0 R/Contents 586 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +586 0 obj<</Filter/FlateDecode/Length 646 >>stream +x•mOÛ0Çß÷SÜË"Í&NÒ$Ý»²„ÑLlR¥ÉKÍšáÚàÄ”~û“ÁÆœ6ª’ÖçßýïÁ—ǃ +Å +P”ã,ÎçPÕÀä,DiMÕì +„)Íð^¬ÆF<Uu¥És²°?g¶Y³þ!ì"J©ÛM ,¡A2y³5xÎ_}úMÌ?*0(#T#wZ¹.ž^˜‹µê#N ÆTS‚Þ+½UÀk¸’7Õ“ÀÌÔ˜š¼a&œêãÓ)°¸K/‰Ð·+¤$ÝfôV¿ØíË€rV_MÍ%lß³O^ÊF¤ãæVJW²Ø×›ƒ°ˆ¶_Ft=¼¶¸ÕF®ü +èOÇÎïpâ?¯¸´û‰¯H¹h¶ÚÜ!|E9áM¹øJp®axéÂfŸýwO¢k‡ªD$w3¥Õn£m}¡iµó{Ê
é~C-j7~‡ZdBRk£Ÿ‡JN2 kûW +WzÃ+¥VÑRâ)ãe©j†…úü,Ç7£‡Aò|ïDgû£Áâ&Ó)¾%CÊ"7¡³Ë“ÌÅ“úG5œÙjÕŒ°4kILÿ3òã4¦i’á{QI;R?£/£?Ëpendstream +endobj +587 0 obj<</Type/Page/Parent 458 0 R/Contents 588 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F5 6 0 R/F6 7 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +588 0 obj<</Filter/FlateDecode/Length 538 >>stream +x½UQo¢@~÷WÌ#M\ŽEXð^.Ô¨½Ì½˜N×–;d-Ëözÿþf{mÔ¶—šBH€™ùæ›ù&³w +Þ<zVÛŽeZÀzÌdàø¾ÛøT6Áe.~ž0ô<ß´O(µ
ƒ¤óiÄ€RH6˜ù$kÀÌ–ÉÊX³JQUæwŠCÊåÕUòƒœ6¹ÚCädmÄ„—XÔ%¦iîýàä©ãÒ¨¼¨I^ÂZl³¼| U¶¨¶µGìu4ݱGMüXßyQ_¥ø]Â< +ãç- ¶.Ì´r Hõƒdª¾U^ÿû¬P¼™„]VÕ 6Àóú–WèGaDÈÿÀ*“\ÛÇ•P;
'»1Ú^OÓqj˜öÐYWjU« +s´8‹x8O£Ùè:¥plÄÄÁ&âF”¨ºÜ‰Rò¶¥Ø€V/bû§Ê%y%÷=pŸ8³½sC½Ì¶üóó6š|ÍÒ†––á4šÅù‚ׄõ€³Ó*u"7¢‡Ð‘s6ÉÛÉŽÃ89‹sA²î>Éë2Üèy‡ãùõâkú(D;Õ'ºz±âì¤{U‰tõ +þendstream +endobj +589 0 obj<</Type/Page/Parent 458 0 R/Contents 590 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F5 6 0 R/F8 9 0 R>>/XObject<<>>>>>>endobj +590 0 obj<</Filter/FlateDecode/Length 320 >>stream +x½•_kƒ0Åßý÷±{ÐÅ4&v/#µ®ÈÚê’HÙ“Œ6…mvÝöñwû=Á„€è9÷þ¸ã‡Á‚ Ðç°Øx$ ÀhÀÅ)ž…•74ÞíCaf…0K@5!`=•înÌjØYÓB)9½ûóù”½ñ®Ùoë—½²ò©Ìf•œdRWX·*uªtk¡{\W5Èrµ7o¡
[›üƒv\¦Út‚K]àù<Uݸï‚Y&I^ÎL•Ì™¹`ÖÏÚ¤Ó®#ȅʺ2wA<”ÉcYt5dáY¥Å$K¤ÉUk5‡ ŸšÄçŒEðÁ +endobj +591 0 obj<</Type/Page/Parent 458 0 R/Contents 592 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F8 9 0 R/F9 10 0 R/Fc 11 0 R>>/XObject<<>>>>>>endobj +592 0 obj<</Filter/FlateDecode/Length 1473 >>stream +xWMoÛ8½çWz©[4Ší¸±³{júÍaÛtëîöÀ (Êb+‰ +IÅ1öÏï’r'èmS$µ$jæÍ›™7㫃 ñoBó)ŸlÆÙ˜^žN³)Ís|žâ×**ÃããG,4Ά?v¼Ç/F/Ù"Ú8[²xÜýÁé£w§4Ó²“ù‚–ExŽ;rôI4¹ «[¯Û5·^ÙVÔîÙòë¿7™Ç÷g@¼,F¯rç>˜Ñd’LçÙ XVŠºÞvÆ)2%ùJ;*ŒìÕzÂgo¨³æZŠœiéÖéu…G-ž8ON$@eßJ¯
i¿%ÑpFØÿ˜'ÇV¡œ´:W𻪈G: •õB·T*á{«Â½t[˜#YkF5xË‹zÆAÝ'¨Žý-¬6½£3!¿‘j‹ÄÚ#¤Dš{÷‚¼ÈëÀÍuá*ÈqêZmŠÛeÄ„—L7~Û±!TM¡Jݪäqà>ªmÈÉÀN°¼Ÿ³!“½dR`GÖ°Ý·2Ú‘Sí½ØBMNO²@’UÞj 9µ>Ð-"ÃtÕ«>” äá<[p‹€ãËéÉœîûw9îƦŸ5‡Z@Q"Ánñk0ªVž~59•Ö4ï/ <ÚŒ™þ5`™Úï3ÀÈ“—ŸÄíú¼ÑlŸM¢_¸70u‡ÓE69½µ×½µ(¯zËFQÀܦåË
ëKR<5&馫+`1 žyP‚֪UVKhˆgõÏQi,mŒýÆ2¹Ñ¾B÷@Ž„-èóûó/·>´Û:¯š¤?RébpÿúóÅ'r’º¦[0—£ «Ó´jYRн¬·ŠÂ[µÎ-ô B±a‚j#…ÇáIš¦ÓuhÄ; +êu£.Ÿ% ¼z‘;:L†!/³¤þL=}äF§å›³§ÿ'‰i@ñÁº)¤²bŽÃì@R{ßõþ¶•žÔÝG +ãzZh×Õb¤†'ç…nt«]¥ +Ò;Ù\uÒ‹Ûƒd/Q-µv¡Ôá;µ”éÐ÷1愶bizb|P7‚ý![w0ä‹|ZpUä·3ÆÑåh”SIppU)ÆÏм™$”#½Š2Ï +3.lbÕ$®…®C–û5n<7E{¿í›¶P\kï”:u#•*°a ØG°Ö(ÿ"\ÂwèÛ;õ”1€r±JFõÅDæ•lm,$± ýØ`Ûâ‹3„PSu@A©Á$à¬Ý±uÌܦҲÂûÃîÀ#$•<CѸX âX%Øá"eT[ +ÕÙ‘ôÀË`…Çæ#3Y—‡º»|v…TÇß5RFÜç¼ýs/ìj?ÜÇ<u
½[[çÀØ<›`é ßû4›Ï²ù ¾‚ñÁ“c¦çíòàãÁj¦EXendstream +endobj +593 0 obj<</Type/Page/Parent 458 0 R/Contents 594 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F2 4 0 R/F4 5 0 R/F8 9 0 R>>/XObject<<>>>>>>endobj +594 0 obj<</Filter/FlateDecode/Length 1704 >>stream +xWkSÛFýί¸“/!~c’N;!-„4qš|`Ƴ–ÖX´ëh%ÚÉï¹wwmcBÌX¶çž{îS_v:ÔƇ»ÔRZшÖÕ5~´i0$êñ½Óëâ{¥i¶ÓòïQ7éQ¿=HŽ6¯ÕúêX¯ÛtDãu’~¯KC +†5*ui«[–è[´¼-)t[•Þ¾Š% ‹Ê"‚ªF@
XdU°è+Õm»!Qo™)†_x-ó¢ …®€çpf‹Â.YIWë…C~!Of„¹ò¸ñeÂC!d¨dU’>—ãDà'bU_í^=óÅêÚ¥«gÏù†c+Êýj®ÓϬµÓš›¥B’!Î^:D:_qsB¤ÚÉ°Y¹Çª‰m©=Ôªô±”¡áΖÐ|óñsµP4Ë]ïvÏ/_ý)Ãïàu7x¼+þéjÂýrË«„Îf˜4ûœÚY,eâ5ºF´%8-ˆeë$bgVBœ[ÖÜʦÖ_ N SB]qÂpÊd$À¹–g ý¸\¤1º&MµF7Ø']8d‹Ê‹•yìÙnwm;ÒyÏRˆqÏKÌ©r±ê^F/)U• +_ù¬;%¨½û¨ï4&™ö5ž¤›\Ñ.s«ï±ÖûMWÚq«;HFXtàCÜk»”îõ †ûÎêòßç#Üö°Ž
{ŸRØAí¡ ¡‚Äf{–DŒxÜÀâbݽ§Šç7šbŽqÎ<Bê1ÒÑ๵Ÿ›…D±Ò)·ÎÐÎÅÔct#J ]x0ÎN¥Ÿ â±fÅx™ç£’?Kƒs÷]¢¡xÜ(9ž8q'5Åí#@߸.ç7—Ÿ†žß†ƒ¤ï’ápÀÉy¢Í¹bn9ÊX(ýp”®ÏuªPk<JÃùpà™û½ÂnØMw]®Ò–Bm‡×ÖØU}Þ‡ÙÌ×õFÑ«kl0w +:Üé ÒäPóq°Œsw
ù¸ÀzúƒDW;¶tFŒOëPùÆšV¦gª)ê-F'š×¬šH{gSØ-óz.nùp!)bzT&ñ”“´Lƒ©¼z3kxnÒ¢á
O‘·°eV†À_.´yë×åÓ¯<„Ñ´)㣙:9ijŒS×L˼fzJÚ'¯Â +¾s8J†GGx‹î&G]¼Vg»ï_^¿dÁua±'9ú½É3ñ¿ïn¶ýªœ*ÙY¾3~Y1ªp,Vÿ°Ÿâ½\Æä°Ï§NÇ;íüKÄÕendstream +endobj +595 0 obj<</Type/Page/Parent 458 0 R/Contents 596 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F8 9 0 R/F9 10 0 R/Fc 11 0 R>>/XObject<<>>>>>>endobj +596 0 obj<</Filter/FlateDecode/Length 1545 >>stream +x¥WïoÛ6ýž¿â>-î–(þUÛ)ÖÙP;sÃ<´DÛliÑ%¥¸Ù_¿w$å8^< KÓ(‰hݽ»{÷îôõ¤EM|µ¨ß¦N²õI3iR¯×Áµ;èãÚÆ·•´ÍÖSƒ5“úb—øÏñƒ/ÛݤEíæ #oS¶—»>~1êR«EéHzƒ>¥¹?oRš5&…¾§Âç¹\ˆJ—ôNÞ©LÒ“K +*W2ÞùZÉJRúîmBܵ[åä™?Ö^¤ŸOštÞê$m8oxÛÊ‘™—B0¾°fý`NZœ|–YIÛ•n2$<+ç*éHÐ{Yþj泆–wRÓë×Ôž½@€Ã• {»]R‘rÈçnÒe¿Ã•(–òúý@Ã`p(²•*–dtñÁõu±0v-JeŠ`è!wçí~ÒcC¦†æ¨™Òè‘ +-ðè_GTEn¶ŽÆéEû·§ +Ö~¢wFŠ³C㜚k@3i +õrÒÞ!°ÒPå$Mo†ü«“ENÂÝÙÊšÂTŽìÕ(ó¹3 +)sïïKa¶ ˆ(T!·LAZ CHŽÈsT¨˜Š!ü¥à.dÄ[àOåG6déÀµ‡Ž³ù‰<áBÉÚÁÿÜ’e%ºÈØre–¦Ú§ÔB˜›Ô +Ó +k*C K&. +zê8Ÿ>j½ÑrÍÍòTÑÐìJ´³7•kÄ5CGʺ2¶A€¨yõf
šŽF7Ã1Í^°‹Q弟Xãгv¯Oá´î¸ëûWcùí¿<Ÿë‰Ãjãäá –Ñð¹¦r£ï'YDÏI +,íc}†)ƒ>›Ê…•nõDྊ`Ë÷ñ¼=HZ—Œ™€ôè9Å ®³ ÄPZ°ö ÈÉ¢sFh}>- 6t~ïµV1·1FãŒÀàyÅá?âg +IŠ!ÍßÇÁCøÜ@fSTëÐþZsA‚6¢•xêaúÉ]SE¦«\^ØMöɃu.Y1ʽ¦¬ƒ§4×·%’1W«k …€,¼ü² oüDý·Êî‰,ë&Z“I‡™¹ˆ®ëajåR9L¶Äñ©Æ‡šç(
×É!n1Ž‚áÓá)ßfé‰S–ù ÓÛÝI¨fBo´>p/å'Møà ›w(Öe©ÕZ¿<Žä&]òDn%ÝNtz™ð“çò+òÿ&~€4òÙa%ôÓ‹1Å;5lEl <N‘tt§„À•°$lN{zõùƒ)¤u¬hå6˜J”9ðÃVÐÐ*ßd¹&@+lu·~¬Öb7’`)ÀÇv…aËÓ".?GB‰Ið$v/daÖ@U¡Å2V-Lê0œXC.צPXåÎ8™³Æ–ÝL¯ÇéÕôÓx’^þø4¹I¯'ã[¬|¶ÊÊ*Ì +Þ ÒŒjóÄgÆqPÞ3Ú +{“7ºKȳw #èj à‘kxõôÁ–Éâ§/.ô±š¥ÀñóØ=ŒOÕ›¢ß—ŒÍüí.^yuH‡7È!Ž1Œ“ˆ¼Ÿ5ÊUåü©¸Ž sbÛÖ[Ì`£^:/{¾Ë¶RkÎ2˜ÄËÖnÁ:H¦ ÃYâ ZSçÄÃèkÖqô1h?“×Õì[¨n*Þ¡V0Nî‘0ý‚JûHžÖÈXb;x®îƲ€Ln°Ç9rUæµ+Æ7‰ýu¥ô “ØN¤
Õ‰Âå‹Ä&Žxg8€TËÂ^.²ÌV¡èkÚ›ß) É\ØH[™1µ·Îò'.Fƒ¸µúý„÷ŸÞ +endobj +597 0 obj<</Type/Page/Parent 458 0 R/Contents 598 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F8 9 0 R/Fc 11 0 R>>/XObject<<>>>>>>endobj +598 0 obj<</Filter/FlateDecode/Length 1739 >>stream +x¥X]O9}çWøi7HÍòAß ,[¤.°iUmV‘3ã$ngì©ífýžk{2I +Z ‘Œç~œ{ï9×|?ê²þwÙ°ÇN,-Ž:ÉhÄšf‰Öô“>ë÷Î’.ëžöð»lqt9Áù,l~àüÉu‡³É‚u“³ÓŒ†I0b“Ìë°IÚzüÈü¿ÉJ0+Ì“0°WæRXö,ÝŠqŸ1|Íïïî>Ïnï&7×_f7·×w³«‹ÉÅñäëQ‡µ»f[ÁcÖ™*u••i+ÕÊq©DÆ$Œ½4Ôœž'Ñ`¯›Èà8†w³`¦+®–‚)íäB¦ÜI¾ÊrÁ¤e"DŸnál¾¦W˜"CåØ“äˆèz|?¾EÚß+aÝï(Ba…Ê,N< +H ;h:¿»Òc»ò"CT…1•xo9!ã.z$ÎXª*æÔB†ùò£‹©¢/òô+xØÏßè¶Ãû‡!ÝlûÍVÓÚħç¼dØKâ|WŠ}¾Gʱ7÷ayl©øªŸIowÿ BA#¼Tc($°…žÕôàƒx»ªŽg¡õÌ5"«I%TU„•~3¦¸Cuç•ów”·‚Péld²må¿?›ËXP—¸ÚSæÔÓ•ª—}|óv¦-Ž¥€\ËÌËMHÇ{ljJ
dš¯Âíxþò}2‡â“IF,Kµ +”îqSiìÑq\9_·îIW”x3bä¢n9Ü¡Äh˜=N.°%ö"ñ2±ç5JZdWô¶Š‚S7n¼EÆ*¥°-U ‹}¸`;ë@‚ +Œàߘ7åúRA!Hl¢\¬ +šk¶e¿WJï½;%ƒslýC¼‚£cÄ°7Wì6é1uGÆMÝìŠËÙð,âoþ’2Ýß&GýÜq~endstream +endobj +599 0 obj<</Type/Page/Parent 458 0 R/Contents 600 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F4 5 0 R/F8 9 0 R/Fc 11 0 R>>/XObject<<>>>>>>endobj +600 0 obj<</Filter/FlateDecode/Length 301 >>stream +x5KoÂ0„ïùsª@"Á©Ž âЗšÞr ‰C\‡Ú‰þúnxÈòʲg?ÏìoÀÁhqÈ3ê°ˆAˆÕ$•TcÚV¡ –y0Ý$ày3hE*‘× =cÈ«QÞ*8ý§ ”ö²(Fe1á¼ÕfN™½o¡
¾ß¶Ùûj¦·÷G7!ýî¡¿‚v¯úæQÕÉjç?CÈgQLFµr•ÕGßÛ ˆVŒ*‚°+¹.}‰sÙ”‹†®é¦ºe”r<E,$n‚ô.àÏ,zfsÄ×?¾¯ËVꬺþ¨¬ÃËI×jè¹L#1Ÿ#”¤&;Y[š½Ú®ð„¬ÓÊxdeÕé)ÆÁÓd¶†‚J¯{3@™DR¤äš +endobj +601 0 obj<</Type/Page/Parent 458 0 R/Contents 602 0 R/MediaBox[0 0 595 792]/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 5 0 R/F8 9 0 R/F9 10 0 R>>/XObject<<>>>>>>endobj +602 0 obj<</Filter/FlateDecode/Length 1265 >>stream +xVßoÛ6~Ï_qÈËÚ-Q,Û±ypÑf°µ[â®ÍÐ-s“H…¤ìØ¿ïHÉ¿¯ÅâÀ–È#ïîûî;òé$¥>)û4QVô’É„¶_¶ÀK.{WIJÃÉÏãIrIVÒ¶=/73ýáîÌ ½äù°f;óvÆËàtó7WÔïÑlXFã Íò0‘ìÕ½¨æ‚>ß~¸§[í¥Õ¢t¯gðštל†I«^³¡J³’6Z
)M[«þ8±Õl))k¬•ÚSÜ>3¹œ'©6ÎIþ'ÏF¢sU*ÿLÞPƒùš¦vd1"'-±±ðä–°ÊLUÍÞ{tžbdZTÒÕ"nÆÒéßÞ~¼'–…rÞ +¯Œ&¡s8S6üšÇŠ•(©æ€€Ü³öâ+©ˆ]q†i2ôé¼™Lð‹<©ýcTïßßýñþîñ·éÝô×vüšâ }ÁOÌ>ÞµC¿ÜÞÏèÏ. Ä÷mxºVÚQ„åôÈêÖiÝæ÷š¦ïÞÝ}y3›þ|Ì1lìw®IÕ"Ï-ýC‹§|þAÜØygÑöñš€¿ÒÅÑ€;p¶Køé:P-àóáÁýttqÀ=๻üûÀ¿¸éê÷¼£wh½SrªªKIò«¿¨JA+Qªœvh +EjšH,ª½+у“;È è²4k–,š–*…Åq@-ble±[BŸ9üÜŠ]죻R‡™1Ì]w +°ÈB™{ÒhH ‡½Øq¸>КŠÐÌžK&>n˜ËüÀµ–.+ -BÿÌV¸KÄ”Xxà1¡[>˜+0E&Ã¥(0²Á.ëj™©…ÊvóçãMŒ/Þ3vZZ%ìß áåfº0TÛØÒ
´>Á7ÈÑɯÛýbCxÇrŠÂó"ó2Oè#Ã}dÍ¥ÈÏZfC]g«MÈ‚÷ÙK€¯\/®ZÛÒp(\úØlJ«jhqà=íQ¥tã¥kÛÙd{·L/'ɤ®—Çn¬Ãñ0p»æV>šðæïg'¿ŸüP¡xendstream +endobj +603 0 obj<</Count 14/First 604 0 R/Last 715 0 R>>endobj +604 0 obj<</Parent 603 0 R/Title(Table of Contents)/Dest[461 0 R/XYZ 0 756 0]/Next 605 0 R>>endobj +605 0 obj<</Parent 603 0 R/Count -1/First 606 0 R/Last 606 0 R/Title(SAMBA Developers Guide)/Dest[467 0 R/XYZ 0 786 0]/Prev 604 0 R/Next 607 0 R>>endobj +606 0 obj<</Parent 605 0 R/Title(SAMBA Team)/Dest[467 0 R/XYZ 0 762 0]>>endobj +607 0 obj<</Parent 603 0 R/Title(Abstract)/Dest[469 0 R/XYZ 0 786 0]/Prev 605 0 R/Next 608 0 R>>endobj +608 0 obj<</Parent 603 0 R/Count -3/First 609 0 R/Last 611 0 R/Title(Definition of NetBIOS Protocol and Name Resolution Modes)/Dest[475 0 R/XYZ 0 786 0]/Prev 607 0 R/Next 612 0 R>>endobj +609 0 obj<</Parent 608 0 R/Title(NETBIOS)/Dest[475 0 R/XYZ 0 738 0]/Next 610 0 R>>endobj +610 0 obj<</Parent 608 0 R/Title(BROADCAST NetBIOS)/Dest[475 0 R/XYZ 0 254 0]/Prev 609 0 R/Next 611 0 R>>endobj +611 0 obj<</Parent 608 0 R/Title(NBNS NetBIOS)/Dest[477 0 R/XYZ 0 758 0]/Prev 610 0 R>>endobj +612 0 obj<</Parent 603 0 R/Count -5/First 613 0 R/Last 617 0 R/Title(Samba Architecture)/Dest[479 0 R/XYZ 0 786 0]/Prev 608 0 R/Next 618 0 R>>endobj +613 0 obj<</Parent 612 0 R/Title(Introduction)/Dest[479 0 R/XYZ 0 762 0]/Next 614 0 R>>endobj +614 0 obj<</Parent 612 0 R/Title(Multithreading and Samba)/Dest[479 0 R/XYZ 0 581 0]/Prev 613 0 R/Next 615 0 R>>endobj +615 0 obj<</Parent 612 0 R/Title(Threading smbd)/Dest[479 0 R/XYZ 0 387 0]/Prev 614 0 R/Next 616 0 R>>endobj +616 0 obj<</Parent 612 0 R/Title(Threading nmbd)/Dest[481 0 R/XYZ 0 786 0]/Prev 615 0 R/Next 617 0 R>>endobj +617 0 obj<</Parent 612 0 R/Title(nbmd Design)/Dest[481 0 R/XYZ 0 487 0]/Prev 616 0 R>>endobj +618 0 obj<</Parent 603 0 R/Count -5/First 619 0 R/Last 623 0 R/Title(The samba DEBUG system)/Dest[483 0 R/XYZ 0 786 0]/Prev 612 0 R/Next 627 0 R>>endobj +619 0 obj<</Parent 618 0 R/Title(New Output Syntax)/Dest[483 0 R/XYZ 0 762 0]/Next 620 0 R>>endobj +620 0 obj<</Parent 618 0 R/Title(The DEBUG\(\) Macro)/Dest[485 0 R/XYZ 0 771 0]/Prev 619 0 R/Next 621 0 R>>endobj +621 0 obj<</Parent 618 0 R/Title(The DEBUGADD\(\) Macro)/Dest[487 0 R/XYZ 0 771 0]/Prev 620 0 R/Next 622 0 R>>endobj +622 0 obj<</Parent 618 0 R/Title(The DEBUGLVL\(\) Macro)/Dest[487 0 R/XYZ 0 546 0]/Prev 621 0 R/Next 623 0 R>>endobj +623 0 obj<</Parent 618 0 R/Count -3/First 624 0 R/Last 626 0 R/Title(New Functions)/Dest[489 0 R/XYZ 0 786 0]/Prev 622 0 R>>endobj +624 0 obj<</Parent 623 0 R/Title(dbgtext\(\))/Dest[489 0 R/XYZ 0 766 0]/Next 625 0 R>>endobj +625 0 obj<</Parent 623 0 R/Title(dbghdr\(\))/Dest[489 0 R/XYZ 0 655 0]/Prev 624 0 R/Next 626 0 R>>endobj +626 0 obj<</Parent 623 0 R/Title(format_debug_text\(\))/Dest[489 0 R/XYZ 0 543 0]/Prev 625 0 R>>endobj +627 0 obj<</Parent 603 0 R/Title(Coding Suggestions)/Dest[491 0 R/XYZ 0 786 0]/Prev 618 0 R/Next 628 0 R>>endobj +628 0 obj<</Parent 603 0 R/Count -5/First 629 0 R/Last 650 0 R/Title(Samba Internals)/Dest[495 0 R/XYZ 0 786 0]/Prev 627 0 R/Next 651 0 R>>endobj +629 0 obj<</Parent 628 0 R/Title(Character Handling)/Dest[495 0 R/XYZ 0 762 0]/Next 630 0 R>>endobj +630 0 obj<</Parent 628 0 R/Title(The new functions)/Dest[495 0 R/XYZ 0 621 0]/Prev 629 0 R/Next 631 0 R>>endobj +631 0 obj<</Parent 628 0 R/Count -15/First 632 0 R/Last 646 0 R/Title(Macros in byteorder.h)/Dest[497 0 R/XYZ 0 758 0]/Prev 630 0 R/Next 647 0 R>>endobj +632 0 obj<</Parent 631 0 R/Title(CVAL\(buf,pos\))/Dest[497 0 R/XYZ 0 683 0]/Next 633 0 R>>endobj +633 0 obj<</Parent 631 0 R/Title(PVAL\(buf,pos\))/Dest[497 0 R/XYZ 0 624 0]/Prev 632 0 R/Next 634 0 R>>endobj +634 0 obj<</Parent 631 0 R/Title(SCVAL\(buf,pos,val\))/Dest[497 0 R/XYZ 0 566 0]/Prev 633 0 R/Next 635 0 R>>endobj +635 0 obj<</Parent 631 0 R/Title(SVAL\(buf,pos\))/Dest[497 0 R/XYZ 0 507 0]/Prev 634 0 R/Next 636 0 R>>endobj +636 0 obj<</Parent 631 0 R/Title(IVAL\(buf,pos\))/Dest[497 0 R/XYZ 0 436 0]/Prev 635 0 R/Next 637 0 R>>endobj +637 0 obj<</Parent 631 0 R/Title(SVALS\(buf,pos\))/Dest[497 0 R/XYZ 0 377 0]/Prev 636 0 R/Next 638 0 R>>endobj +638 0 obj<</Parent 631 0 R/Title(IVALS\(buf,pos\))/Dest[497 0 R/XYZ 0 319 0]/Prev 637 0 R/Next 639 0 R>>endobj +639 0 obj<</Parent 631 0 R/Title(SSVAL\(buf,pos,val\))/Dest[497 0 R/XYZ 0 261 0]/Prev 638 0 R/Next 640 0 R>>endobj +640 0 obj<</Parent 631 0 R/Title(SIVAL\(buf,pos,val\))/Dest[497 0 R/XYZ 0 202 0]/Prev 639 0 R/Next 641 0 R>>endobj +641 0 obj<</Parent 631 0 R/Title(SSVALS\(buf,pos,val\))/Dest[499 0 R/XYZ 0 786 0]/Prev 640 0 R/Next 642 0 R>>endobj +642 0 obj<</Parent 631 0 R/Title(SIVALS\(buf,pos,val\))/Dest[499 0 R/XYZ 0 728 0]/Prev 641 0 R/Next 643 0 R>>endobj +643 0 obj<</Parent 631 0 R/Title(RSVAL\(buf,pos\))/Dest[499 0 R/XYZ 0 669 0]/Prev 642 0 R/Next 644 0 R>>endobj +644 0 obj<</Parent 631 0 R/Title(RIVAL\(buf,pos\))/Dest[499 0 R/XYZ 0 611 0]/Prev 643 0 R/Next 645 0 R>>endobj +645 0 obj<</Parent 631 0 R/Title(RSSVAL\(buf,pos,val\))/Dest[499 0 R/XYZ 0 553 0]/Prev 644 0 R/Next 646 0 R>>endobj +646 0 obj<</Parent 631 0 R/Title(RSIVAL\(buf,pos,val\))/Dest[499 0 R/XYZ 0 481 0]/Prev 645 0 R>>endobj +647 0 obj<</Parent 628 0 R/Count -2/First 648 0 R/Last 649 0 R/Title(LAN Manager Samba API)/Dest[499 0 R/XYZ 0 423 0]/Prev 631 0 R/Next 650 0 R>>endobj +648 0 obj<</Parent 647 0 R/Title(Parameters)/Dest[499 0 R/XYZ 0 270 0]/Next 649 0 R>>endobj +649 0 obj<</Parent 647 0 R/Title(Return value)/Dest[501 0 R/XYZ 0 481 0]/Prev 648 0 R>>endobj +650 0 obj<</Parent 628 0 R/Title(Code character table)/Dest[503 0 R/XYZ 0 786 0]/Prev 647 0 R>>endobj +651 0 obj<</Parent 603 0 R/Count -2/First 652 0 R/Last 656 0 R/Title(The smb.conf file)/Dest[505 0 R/XYZ 0 786 0]/Prev 628 0 R/Next 658 0 R>>endobj +652 0 obj<</Parent 651 0 R/Count -3/First 653 0 R/Last 655 0 R/Title(Lexical Analysis)/Dest[505 0 R/XYZ 0 762 0]/Next 656 0 R>>endobj +653 0 obj<</Parent 652 0 R/Title(Handling of Whitespace)/Dest[505 0 R/XYZ 0 476 0]/Next 654 0 R>>endobj +654 0 obj<</Parent 652 0 R/Title(Handling of Line Continuation)/Dest[505 0 R/XYZ 0 312 0]/Prev 653 0 R/Next 655 0 R>>endobj +655 0 obj<</Parent 652 0 R/Title(Line Continuation Quirks)/Dest[507 0 R/XYZ 0 705 0]/Prev 654 0 R>>endobj +656 0 obj<</Parent 651 0 R/Count -1/First 657 0 R/Last 657 0 R/Title(Syntax)/Dest[507 0 R/XYZ 0 276 0]/Prev 652 0 R>>endobj +657 0 obj<</Parent 656 0 R/Title(About params.c)/Dest[509 0 R/XYZ 0 705 0]>>endobj +658 0 obj<</Parent 603 0 R/Count -9/First 659 0 R/Last 667 0 R/Title(NetBIOS in a Unix World)/Dest[511 0 R/XYZ 0 786 0]/Prev 651 0 R/Next 668 0 R>>endobj +659 0 obj<</Parent 658 0 R/Title(Introduction)/Dest[511 0 R/XYZ 0 762 0]/Next 660 0 R>>endobj +660 0 obj<</Parent 658 0 R/Title(Usernames)/Dest[511 0 R/XYZ 0 647 0]/Prev 659 0 R/Next 661 0 R>>endobj +661 0 obj<</Parent 658 0 R/Title(File Ownership)/Dest[511 0 R/XYZ 0 269 0]/Prev 660 0 R/Next 662 0 R>>endobj +662 0 obj<</Parent 658 0 R/Title(Passwords)/Dest[513 0 R/XYZ 0 745 0]/Prev 661 0 R/Next 663 0 R>>endobj +663 0 obj<</Parent 658 0 R/Title(Locking)/Dest[513 0 R/XYZ 0 511 0]/Prev 662 0 R/Next 664 0 R>>endobj +664 0 obj<</Parent 658 0 R/Title(Deny Modes)/Dest[513 0 R/XYZ 0 198 0]/Prev 663 0 R/Next 665 0 R>>endobj +665 0 obj<</Parent 658 0 R/Title(Trapdoor UIDs)/Dest[515 0 R/XYZ 0 718 0]/Prev 664 0 R/Next 666 0 R>>endobj +666 0 obj<</Parent 658 0 R/Title(Port numbers)/Dest[515 0 R/XYZ 0 590 0]/Prev 665 0 R/Next 667 0 R>>endobj +667 0 obj<</Parent 658 0 R/Title(Protocol Complexity)/Dest[515 0 R/XYZ 0 330 0]/Prev 666 0 R>>endobj +668 0 obj<</Parent 603 0 R/Title(Tracing samba system calls)/Dest[519 0 R/XYZ 0 786 0]/Prev 658 0 R/Next 669 0 R>>endobj +669 0 obj<</Parent 603 0 R/Count -8/First 670 0 R/Last 706 0 R/Title(NT Domain RPC's)/Dest[523 0 R/XYZ 0 786 0]/Prev 668 0 R/Next 709 0 R>>endobj +670 0 obj<</Parent 669 0 R/Count -2/First 671 0 R/Last 672 0 R/Title(Introduction)/Dest[523 0 R/XYZ 0 762 0]/Next 673 0 R>>endobj +671 0 obj<</Parent 670 0 R/Title(Sources)/Dest[525 0 R/XYZ 0 679 0]/Next 672 0 R>>endobj +672 0 obj<</Parent 670 0 R/Title(Credits)/Dest[525 0 R/XYZ 0 569 0]/Prev 671 0 R>>endobj +673 0 obj<</Parent 669 0 R/Count -3/First 674 0 R/Last 676 0 R/Title(Notes and Structures)/Dest[525 0 R/XYZ 0 447 0]/Prev 670 0 R/Next 677 0 R>>endobj +674 0 obj<</Parent 673 0 R/Title(Notes)/Dest[525 0 R/XYZ 0 426 0]/Next 675 0 R>>endobj +675 0 obj<</Parent 673 0 R/Title(Enumerations)/Dest[527 0 R/XYZ 0 771 0]/Prev 674 0 R/Next 676 0 R>>endobj +676 0 obj<</Parent 673 0 R/Title(Structures)/Dest[527 0 R/XYZ 0 288 0]/Prev 675 0 R>>endobj +677 0 obj<</Parent 669 0 R/Count -12/First 678 0 R/Last 689 0 R/Title(MSRPC over Transact Named Pipe)/Dest[547 0 R/XYZ 0 481 0]/Prev 673 0 R/Next 690 0 R>>endobj +678 0 obj<</Parent 677 0 R/Title(MSRPC Pipes)/Dest[547 0 R/XYZ 0 419 0]/Next 679 0 R>>endobj +679 0 obj<</Parent 677 0 R/Title(Header)/Dest[549 0 R/XYZ 0 617 0]/Prev 678 0 R/Next 680 0 R>>endobj +680 0 obj<</Parent 677 0 R/Title(Tail)/Dest[557 0 R/XYZ 0 571 0]/Prev 679 0 R/Next 681 0 R>>endobj +681 0 obj<</Parent 677 0 R/Title(RPC Bind / Bind Ack)/Dest[557 0 R/XYZ 0 447 0]/Prev 680 0 R/Next 682 0 R>>endobj +682 0 obj<</Parent 677 0 R/Title(NTLSA Transact Named Pipe)/Dest[559 0 R/XYZ 0 575 0]/Prev 681 0 R/Next 683 0 R>>endobj +683 0 obj<</Parent 677 0 R/Title(LSA Open Policy)/Dest[561 0 R/XYZ 0 786 0]/Prev 682 0 R/Next 684 0 R>>endobj +684 0 obj<</Parent 677 0 R/Title(LSA Query Info Policy)/Dest[561 0 R/XYZ 0 486 0]/Prev 683 0 R/Next 685 0 R>>endobj +685 0 obj<</Parent 677 0 R/Title(LSA Enumerate Trusted Domains)/Dest[563 0 R/XYZ 0 786 0]/Prev 684 0 R/Next 686 0 R>>endobj +686 0 obj<</Parent 677 0 R/Title(LSA Open Secret)/Dest[563 0 R/XYZ 0 554 0]/Prev 685 0 R/Next 687 0 R>>endobj +687 0 obj<</Parent 677 0 R/Title(LSA Close)/Dest[563 0 R/XYZ 0 269 0]/Prev 686 0 R/Next 688 0 R>>endobj +688 0 obj<</Parent 677 0 R/Title(LSA Lookup SIDS)/Dest[565 0 R/XYZ 0 692 0]/Prev 687 0 R/Next 689 0 R>>endobj +689 0 obj<</Parent 677 0 R/Title(LSA Lookup Names)/Dest[565 0 R/XYZ 0 207 0]/Prev 688 0 R>>endobj +690 0 obj<</Parent 669 0 R/Count -5/First 691 0 R/Last 695 0 R/Title(NETLOGON rpc Transact Named Pipe)/Dest[567 0 R/XYZ 0 333 0]/Prev 677 0 R/Next 696 0 R>>endobj +691 0 obj<</Parent 690 0 R/Title(LSA Request Challenge)/Dest[569 0 R/XYZ 0 586 0]/Next 692 0 R>>endobj +692 0 obj<</Parent 690 0 R/Title(LSA Authenticate 2)/Dest[569 0 R/XYZ 0 194 0]/Prev 691 0 R/Next 693 0 R>>endobj +693 0 obj<</Parent 690 0 R/Title(LSA Server Password Set)/Dest[571 0 R/XYZ 0 477 0]/Prev 692 0 R/Next 694 0 R>>endobj +694 0 obj<</Parent 690 0 R/Title(LSA SAM Logon)/Dest[573 0 R/XYZ 0 786 0]/Prev 693 0 R/Next 695 0 R>>endobj +695 0 obj<</Parent 690 0 R/Title(LSA SAM Logoff)/Dest[573 0 R/XYZ 0 344 0]/Prev 694 0 R>>endobj +696 0 obj<</Parent 669 0 R/Count -2/First 697 0 R/Last 698 0 R/Title(\\\\MAILSLOT\\NET\\NTLOGON)/Dest[575 0 R/XYZ 0 758 0]/Prev 690 0 R/Next 699 0 R>>endobj +697 0 obj<</Parent 696 0 R/Title(Query for PDC)/Dest[575 0 R/XYZ 0 683 0]/Next 698 0 R>>endobj +698 0 obj<</Parent 696 0 R/Title(SAM Logon)/Dest[577 0 R/XYZ 0 786 0]/Prev 697 0 R>>endobj +699 0 obj<</Parent 669 0 R/Count -2/First 700 0 R/Last 701 0 R/Title(SRVSVC Transact Named Pipe)/Dest[579 0 R/XYZ 0 758 0]/Prev 696 0 R/Next 702 0 R>>endobj +700 0 obj<</Parent 699 0 R/Title(Net Share Enum)/Dest[579 0 R/XYZ 0 630 0]/Next 701 0 R>>endobj +701 0 obj<</Parent 699 0 R/Title(Net Server Get Info)/Dest[581 0 R/XYZ 0 786 0]/Prev 700 0 R>>endobj +702 0 obj<</Parent 669 0 R/Count -3/First 703 0 R/Last 705 0 R/Title(Cryptographic side of NT Domain Authentication)/Dest[581 0 R/XYZ 0 486 0]/Prev 699 0 R/Next 706 0 R>>endobj +703 0 obj<</Parent 702 0 R/Title(Definitions)/Dest[581 0 R/XYZ 0 466 0]/Next 704 0 R>>endobj +704 0 obj<</Parent 702 0 R/Title(Protocol)/Dest[583 0 R/XYZ 0 786 0]/Prev 703 0 R/Next 705 0 R>>endobj +705 0 obj<</Parent 702 0 R/Title(Comments)/Dest[583 0 R/XYZ 0 437 0]/Prev 704 0 R>>endobj +706 0 obj<</Parent 669 0 R/Count -2/First 707 0 R/Last 708 0 R/Title(SIDs and RIDs)/Dest[583 0 R/XYZ 0 181 0]/Prev 702 0 R>>endobj +707 0 obj<</Parent 706 0 R/Title(Well-known SIDs)/Dest[585 0 R/XYZ 0 686 0]/Next 708 0 R>>endobj +708 0 obj<</Parent 706 0 R/Title(Well-known RIDS)/Dest[587 0 R/XYZ 0 718 0]/Prev 707 0 R>>endobj +709 0 obj<</Parent 603 0 R/Count -5/First 710 0 R/Last 714 0 R/Title(Samba Printing Internals)/Dest[591 0 R/XYZ 0 786 0]/Prev 669 0 R/Next 715 0 R>>endobj +710 0 obj<</Parent 709 0 R/Title(Abstract)/Dest[591 0 R/XYZ 0 762 0]/Next 711 0 R>>endobj +711 0 obj<</Parent 709 0 R/Title(Printing Interface to Various Back ends)/Dest[591 0 R/XYZ 0 674 0]/Prev 710 0 R/Next 712 0 R>>endobj +712 0 obj<</Parent 709 0 R/Title(Print Queue TDB's)/Dest[591 0 R/XYZ 0 414 0]/Prev 711 0 R/Next 713 0 R>>endobj +713 0 obj<</Parent 709 0 R/Title(ChangeID & Client Caching of Printer Information)/Dest[595 0 R/XYZ 0 745 0]/Prev 712 0 R/Next 714 0 R>>endobj +714 0 obj<</Parent 709 0 R/Title(Windows NT/2K Printer Change Notify)/Dest[595 0 R/XYZ 0 683 0]/Prev 713 0 R>>endobj +715 0 obj<</Parent 603 0 R/Count -1/First 716 0 R/Last 716 0 R/Title(Samba WINS Internals)/Dest[601 0 R/XYZ 0 786 0]/Prev 709 0 R>>endobj +716 0 obj<</Parent 715 0 R/Title(WINS Failover)/Dest[601 0 R/XYZ 0 762 0]>>endobj +717 0 obj<</Type/Catalog/Pages 458 0 R/PageLayout/SinglePage/Outlines 603 0 R/OpenAction[467 0 R/XYZ null null 0]/PageMode/UseOutlines/PageLabels<</Nums[0<</P(title)>>1<</S/r>>4<</S/D/St 1/P()>>5<</S/D/St 2/P()>>8<</S/D/St 5/P()>>10<</S/D/St 7/P()>>12<</S/D/St 9/P()>>16<</S/D/St 13/P()>>18<</S/D/St 15/P()>>23<</S/D/St 20/P()>>26<</S/D/St 23/P()>>30<</S/D/St 27/P()>>32<</S/D/St 29/P()>>66<</S/D/St 63/P()>>71<</S/D/St 68/P()>>]>>>>endobj +xref +0 718 +0000000000 65535 f +0000000015 00000 n +0000000245 00000 n +0000001811 00000 n +0000001885 00000 n +0000001967 00000 n +0000002045 00000 n +0000002122 00000 n +0000002201 00000 n +0000002284 00000 n +0000002360 00000 n +0000002442 00000 n +0000002501 00000 n +0000002602 00000 n +0000002704 00000 n +0000002805 00000 n +0000002906 00000 n +0000003008 00000 n +0000003110 00000 n +0000003212 00000 n +0000003313 00000 n +0000003415 00000 n +0000003517 00000 n +0000003619 00000 n +0000003721 00000 n +0000003823 00000 n +0000003924 00000 n +0000004026 00000 n +0000004128 00000 n +0000004230 00000 n +0000004332 00000 n +0000004434 00000 n +0000004536 00000 n +0000004638 00000 n +0000004740 00000 n +0000004841 00000 n +0000004942 00000 n +0000005044 00000 n +0000005146 00000 n +0000005248 00000 n +0000005350 00000 n +0000005452 00000 n +0000005554 00000 n +0000005656 00000 n +0000005758 00000 n +0000005860 00000 n +0000005962 00000 n +0000006064 00000 n +0000006166 00000 n +0000006268 00000 n +0000006370 00000 n +0000006472 00000 n +0000006573 00000 n +0000006673 00000 n +0000006773 00000 n +0000007083 00000 n +0000007184 00000 n +0000007286 00000 n +0000007388 00000 n +0000007490 00000 n +0000007592 00000 n +0000007693 00000 n +0000007795 00000 n +0000007897 00000 n +0000007999 00000 n +0000008101 00000 n +0000008203 00000 n +0000008305 00000 n +0000008406 00000 n +0000008508 00000 n +0000008610 00000 n +0000008712 00000 n +0000008814 00000 n +0000008916 00000 n +0000009018 00000 n +0000009120 00000 n +0000009222 00000 n +0000009324 00000 n +0000009425 00000 n +0000009526 00000 n +0000009628 00000 n +0000009730 00000 n +0000009832 00000 n +0000009934 00000 n +0000010036 00000 n +0000010138 00000 n +0000010240 00000 n +0000010342 00000 n +0000010444 00000 n +0000010546 00000 n +0000010648 00000 n +0000010750 00000 n +0000010852 00000 n +0000010954 00000 n +0000011056 00000 n +0000011158 00000 n +0000011260 00000 n +0000011361 00000 n +0000011461 00000 n +0000011561 00000 n +0000011885 00000 n +0000011987 00000 n +0000012090 00000 n +0000012193 00000 n +0000012296 00000 n +0000012399 00000 n +0000012502 00000 n +0000012605 00000 n +0000012708 00000 n +0000012811 00000 n +0000012914 00000 n +0000013017 00000 n +0000013120 00000 n +0000013223 00000 n +0000013326 00000 n +0000013429 00000 n +0000013532 00000 n +0000013635 00000 n +0000013738 00000 n +0000013841 00000 n +0000013944 00000 n +0000014046 00000 n +0000014149 00000 n +0000014252 00000 n +0000014355 00000 n +0000014458 00000 n +0000014561 00000 n +0000014663 00000 n +0000014766 00000 n +0000015007 00000 n +0000015062 00000 n +0000015149 00000 n +0000015204 00000 n +0000015291 00000 n +0000015358 00000 n +0000015444 00000 n +0000015546 00000 n +0000015649 00000 n +0000015752 00000 n +0000015855 00000 n +0000015957 00000 n +0000016060 00000 n +0000016163 00000 n +0000016266 00000 n +0000016369 00000 n +0000016472 00000 n +0000016574 00000 n +0000016677 00000 n +0000016780 00000 n +0000016883 00000 n +0000016986 00000 n +0000017089 00000 n +0000017192 00000 n +0000017295 00000 n +0000017398 00000 n +0000017500 00000 n +0000017602 00000 n +0000017705 00000 n +0000017808 00000 n +0000017911 00000 n +0000018014 00000 n +0000018117 00000 n +0000018220 00000 n +0000018323 00000 n +0000018426 00000 n +0000018529 00000 n +0000018632 00000 n +0000018735 00000 n +0000018838 00000 n +0000018940 00000 n +0000019041 00000 n +0000019142 00000 n +0000019471 00000 n +0000019574 00000 n +0000019677 00000 n +0000019780 00000 n +0000019883 00000 n +0000019986 00000 n +0000020089 00000 n +0000020192 00000 n +0000020294 00000 n +0000020397 00000 n +0000020500 00000 n +0000020603 00000 n +0000020706 00000 n +0000020809 00000 n +0000020912 00000 n +0000021014 00000 n +0000021117 00000 n +0000021220 00000 n +0000021323 00000 n +0000021426 00000 n +0000021529 00000 n +0000021632 00000 n +0000021735 00000 n +0000021838 00000 n +0000021941 00000 n +0000022043 00000 n +0000022145 00000 n +0000022248 00000 n +0000022351 00000 n +0000022454 00000 n +0000022557 00000 n +0000022660 00000 n +0000022763 00000 n +0000022866 00000 n +0000022969 00000 n +0000023072 00000 n +0000023175 00000 n +0000023278 00000 n +0000023381 00000 n +0000023484 00000 n +0000023587 00000 n +0000023690 00000 n +0000023793 00000 n +0000023896 00000 n +0000023999 00000 n +0000024102 00000 n +0000024205 00000 n +0000024308 00000 n +0000024411 00000 n +0000024513 00000 n +0000024614 00000 n +0000024715 00000 n +0000025140 00000 n +0000025243 00000 n +0000025346 00000 n +0000025449 00000 n +0000025552 00000 n +0000025655 00000 n +0000025758 00000 n +0000025861 00000 n +0000025964 00000 n +0000026067 00000 n +0000026170 00000 n +0000026273 00000 n +0000026376 00000 n +0000026479 00000 n +0000026582 00000 n +0000026684 00000 n +0000026787 00000 n +0000026890 00000 n +0000026993 00000 n +0000027096 00000 n +0000027199 00000 n +0000027301 00000 n +0000027404 00000 n +0000027597 00000 n +0000027681 00000 n +0000027767 00000 n +0000027841 00000 n +0000027927 00000 n +0000027960 00000 n +0000028038 00000 n +0000028125 00000 n +0000028231 00000 n +0000028317 00000 n +0000028389 00000 n +0000028475 00000 n +0000028534 00000 n +0000028621 00000 n +0000028712 00000 n +0000028798 00000 n +0000028869 00000 n +0000028955 00000 n +0000029020 00000 n +0000029054 00000 n +0000029088 00000 n +0000032144 00000 n +0000032187 00000 n +0000032230 00000 n +0000032273 00000 n +0000032316 00000 n +0000032359 00000 n +0000032402 00000 n +0000032445 00000 n +0000032488 00000 n +0000032531 00000 n +0000032574 00000 n +0000032617 00000 n +0000032660 00000 n +0000032703 00000 n +0000032746 00000 n +0000032789 00000 n +0000032832 00000 n +0000032875 00000 n +0000032918 00000 n +0000032961 00000 n +0000033004 00000 n +0000033047 00000 n +0000033090 00000 n +0000033133 00000 n +0000033176 00000 n +0000033219 00000 n +0000033262 00000 n +0000033305 00000 n +0000033348 00000 n +0000033391 00000 n +0000033434 00000 n +0000033477 00000 n +0000033520 00000 n +0000033563 00000 n +0000033606 00000 n +0000033649 00000 n +0000033692 00000 n +0000033735 00000 n +0000033778 00000 n +0000033821 00000 n +0000033864 00000 n +0000033907 00000 n +0000033950 00000 n +0000033993 00000 n +0000034036 00000 n +0000034079 00000 n +0000034122 00000 n +0000034165 00000 n +0000034208 00000 n +0000034251 00000 n +0000034294 00000 n +0000034337 00000 n +0000034380 00000 n +0000034423 00000 n +0000034466 00000 n +0000034509 00000 n +0000034552 00000 n +0000034595 00000 n +0000034638 00000 n +0000034681 00000 n +0000034724 00000 n +0000034767 00000 n +0000034810 00000 n +0000034853 00000 n +0000034896 00000 n +0000034939 00000 n +0000034982 00000 n +0000035025 00000 n +0000035068 00000 n +0000035111 00000 n +0000035154 00000 n +0000035197 00000 n +0000035240 00000 n +0000035283 00000 n +0000035326 00000 n +0000035369 00000 n +0000035412 00000 n +0000035455 00000 n +0000035498 00000 n +0000035541 00000 n +0000035584 00000 n +0000035627 00000 n +0000035670 00000 n +0000035713 00000 n +0000035756 00000 n +0000035799 00000 n +0000035842 00000 n +0000035885 00000 n +0000035928 00000 n +0000035971 00000 n +0000036014 00000 n +0000036057 00000 n +0000036100 00000 n +0000036143 00000 n +0000036186 00000 n +0000036229 00000 n +0000036272 00000 n +0000036315 00000 n +0000036358 00000 n +0000036401 00000 n +0000036444 00000 n +0000036487 00000 n +0000036530 00000 n +0000036573 00000 n +0000036616 00000 n +0000036659 00000 n +0000036702 00000 n +0000036745 00000 n +0000036788 00000 n +0000036831 00000 n +0000036874 00000 n +0000036917 00000 n +0000036960 00000 n +0000037003 00000 n +0000037046 00000 n +0000037089 00000 n +0000037132 00000 n +0000037175 00000 n +0000037218 00000 n +0000037261 00000 n +0000037304 00000 n +0000037347 00000 n +0000037390 00000 n +0000037433 00000 n +0000037476 00000 n +0000037519 00000 n +0000037562 00000 n +0000037605 00000 n +0000037648 00000 n +0000037691 00000 n +0000037734 00000 n +0000037777 00000 n +0000037820 00000 n +0000037863 00000 n +0000037906 00000 n +0000037949 00000 n +0000037992 00000 n +0000038035 00000 n +0000038078 00000 n +0000038121 00000 n +0000038164 00000 n +0000038207 00000 n +0000038250 00000 n +0000038293 00000 n +0000038336 00000 n +0000038379 00000 n +0000038422 00000 n +0000038465 00000 n +0000038508 00000 n +0000038551 00000 n +0000038594 00000 n +0000038637 00000 n +0000038680 00000 n +0000038723 00000 n +0000038766 00000 n +0000038809 00000 n +0000038852 00000 n +0000038895 00000 n +0000038938 00000 n +0000038981 00000 n +0000039024 00000 n +0000039067 00000 n +0000039110 00000 n +0000039153 00000 n +0000039196 00000 n +0000039239 00000 n +0000039282 00000 n +0000039325 00000 n +0000039368 00000 n +0000039411 00000 n +0000039454 00000 n +0000039497 00000 n +0000039540 00000 n +0000039583 00000 n +0000039626 00000 n +0000039669 00000 n +0000039712 00000 n +0000039755 00000 n +0000039798 00000 n +0000039841 00000 n +0000039884 00000 n +0000039927 00000 n +0000039970 00000 n +0000040013 00000 n +0000040056 00000 n +0000040099 00000 n +0000040142 00000 n +0000040185 00000 n +0000040228 00000 n +0000040271 00000 n +0000040314 00000 n +0000040937 00000 n +0000041094 00000 n +0000041261 00000 n +0000041450 00000 n +0000043586 00000 n +0000043775 00000 n +0000046396 00000 n +0000046586 00000 n +0000048680 00000 n +0000048837 00000 n +0000049066 00000 n +0000049265 00000 n +0000050972 00000 n +0000051143 00000 n +0000053074 00000 n +0000053245 00000 n +0000054413 00000 n +0000054579 00000 n +0000056209 00000 n +0000056375 00000 n +0000057912 00000 n +0000058078 00000 n +0000059795 00000 n +0000059961 00000 n +0000061691 00000 n +0000061866 00000 n +0000063161 00000 n +0000063336 00000 n +0000064628 00000 n +0000064803 00000 n +0000066141 00000 n +0000066307 00000 n +0000067204 00000 n +0000067394 00000 n +0000069350 00000 n +0000069506 00000 n +0000071282 00000 n +0000071448 00000 n +0000073411 00000 n +0000073577 00000 n +0000074290 00000 n +0000074465 00000 n +0000075494 00000 n +0000075660 00000 n +0000077302 00000 n +0000077468 00000 n +0000078088 00000 n +0000078263 00000 n +0000079623 00000 n +0000079798 00000 n +0000080946 00000 n +0000081112 00000 n +0000081748 00000 n +0000081914 00000 n +0000083679 00000 n +0000083845 00000 n +0000085713 00000 n +0000085879 00000 n +0000087838 00000 n +0000087994 00000 n +0000088775 00000 n +0000088959 00000 n +0000090608 00000 n +0000090773 00000 n +0000091688 00000 n +0000091887 00000 n +0000093603 00000 n +0000093778 00000 n +0000095587 00000 n +0000095762 00000 n +0000096351 00000 n +0000096526 00000 n +0000097276 00000 n +0000097451 00000 n +0000098185 00000 n +0000098360 00000 n +0000099182 00000 n +0000099357 00000 n +0000100172 00000 n +0000100356 00000 n +0000101216 00000 n +0000101391 00000 n +0000102139 00000 n +0000102304 00000 n +0000102924 00000 n +0000103108 00000 n +0000103861 00000 n +0000104036 00000 n +0000104989 00000 n +0000105173 00000 n +0000106503 00000 n +0000106687 00000 n +0000107731 00000 n +0000107896 00000 n +0000108471 00000 n +0000108655 00000 n +0000109706 00000 n +0000109881 00000 n +0000110759 00000 n +0000110934 00000 n +0000112013 00000 n +0000112197 00000 n +0000113038 00000 n +0000113222 00000 n +0000113987 00000 n +0000114162 00000 n +0000114693 00000 n +0000114868 00000 n +0000115544 00000 n +0000115728 00000 n +0000116644 00000 n +0000116819 00000 n +0000117769 00000 n +0000117944 00000 n +0000118871 00000 n +0000119055 00000 n +0000119941 00000 n +0000120116 00000 n +0000120879 00000 n +0000121054 00000 n +0000121721 00000 n +0000121896 00000 n +0000122712 00000 n +0000122887 00000 n +0000123856 00000 n +0000124022 00000 n +0000125444 00000 n +0000125628 00000 n +0000126348 00000 n +0000126532 00000 n +0000127144 00000 n +0000127309 00000 n +0000127703 00000 n +0000127888 00000 n +0000129435 00000 n +0000129609 00000 n +0000131387 00000 n +0000131572 00000 n +0000133191 00000 n +0000133366 00000 n +0000135179 00000 n +0000135345 00000 n +0000135720 00000 n +0000135895 00000 n +0000137234 00000 n +0000137290 00000 n +0000137389 00000 n +0000137542 00000 n +0000137621 00000 n +0000137724 00000 n +0000137911 00000 n +0000138000 00000 n +0000138112 00000 n +0000138206 00000 n +0000138355 00000 n +0000138449 00000 n +0000138568 00000 n +0000138677 00000 n +0000138786 00000 n +0000138879 00000 n +0000139032 00000 n +0000139131 00000 n +0000139245 00000 n +0000139362 00000 n +0000139479 00000 n +0000139610 00000 n +0000139703 00000 n +0000139808 00000 n +0000139911 00000 n +0000140024 00000 n +0000140170 00000 n +0000140270 00000 n +0000140382 00000 n +0000140535 00000 n +0000140632 00000 n +0000140742 00000 n +0000140857 00000 n +0000140967 00000 n +0000141077 00000 n +0000141188 00000 n +0000141299 00000 n +0000141414 00000 n +0000141529 00000 n +0000141645 00000 n +0000141761 00000 n +0000141872 00000 n +0000141983 00000 n +0000142099 00000 n +0000142202 00000 n +0000142354 00000 n +0000142446 00000 n +0000142540 00000 n +0000142642 00000 n +0000142790 00000 n +0000142924 00000 n +0000143028 00000 n +0000143152 00000 n +0000143258 00000 n +0000143382 00000 n +0000143465 00000 n +0000143619 00000 n +0000143713 00000 n +0000143817 00000 n +0000143926 00000 n +0000144030 00000 n +0000144132 00000 n +0000144237 00000 n +0000144345 00000 n +0000144452 00000 n +0000144553 00000 n +0000144674 00000 n +0000144820 00000 n +0000144950 00000 n +0000145039 00000 n +0000145128 00000 n +0000145279 00000 n +0000145366 00000 n +0000145473 00000 n +0000145565 00000 n +0000145727 00000 n +0000145820 00000 n +0000145921 00000 n +0000146020 00000 n +0000146134 00000 n +0000146254 00000 n +0000146364 00000 n +0000146480 00000 n +0000146604 00000 n +0000146714 00000 n +0000146818 00000 n +0000146928 00000 n +0000147026 00000 n +0000147189 00000 n +0000147292 00000 n +0000147405 00000 n +0000147523 00000 n +0000147631 00000 n +0000147727 00000 n +0000147884 00000 n +0000147979 00000 n +0000148070 00000 n +0000148227 00000 n +0000148323 00000 n +0000148424 00000 n +0000148601 00000 n +0000148694 00000 n +0000148797 00000 n +0000148887 00000 n +0000149018 00000 n +0000149115 00000 n +0000149212 00000 n +0000149367 00000 n +0000149457 00000 n +0000149591 00000 n +0000149703 00000 n +0000149846 00000 n +0000149963 00000 n +0000150101 00000 n +0000150183 00000 n +trailer +<</Size 718/Root 717 0 R/Info 1 0 R/ID[<ee2e3d1648e40c359fbf8e3964570ce3><ee2e3d1648e40c359fbf8e3964570ce3>]>> +startxref +150623 +%%EOF diff --git a/docs/docbook/devdoc/printing.sgml b/docs/docbook/devdoc/printing.sgml new file mode 100644 index 0000000000..2ef64353e1 --- /dev/null +++ b/docs/docbook/devdoc/printing.sgml @@ -0,0 +1,393 @@ +<chapter id="printing"> +<chapterinfo> + <author> + <firstname>Gerald</firstname><surname>Carter</surname> + </author> + <pubdate>October 2002</pubdate> +</chapterinfo> + + +<title>Samba Printing Internals</title> + + +<sect1> +<title>Abstract</title> +<para> +The purpose of this document is to provide some insight into +Samba's printing functionality and also to describe the semantics +of certain features of Windows client printing. +</para> +</sect1> + + + +<sect1> +<title> +Printing Interface to Various Back ends +</title> + +<para> +Samba uses a table of function pointers to seven functions. The +function prototypes are defined in the <VarName>printif</VarName> structure declared +in <filename>printing.h</filename>. +</para> + +<itemizedlist> + <listitem><para>retrieve the contents of a print queue</para></listitem> + <listitem><para>pause the print queue</para></listitem> + <listitem><para>resume a paused print queue</para></listitem> + <listitem><para>delete a job from the queue</para></listitem> + <listitem><para>pause a job in the print queue</para></listitem> + <listitem><para>result a paused print job in the queue</para></listitem> + <listitem><para>submit a job to the print queue</para></listitem> +</itemizedlist> + +<para> +Currently there are only two printing back end implementations +defined. +</para> + +<itemizedlist> + <listitem><para>a generic set of functions for working with standard UNIX + printing subsystems</para></listitem> + + <listitem><para>a set of CUPS specific functions (this is only enabled if + the CUPS libraries were located at compile time).</para></listitem> +</itemizedlist> + +</sect1> + + + + +<sect1> +<title> +Print Queue TDB's +</title> + + +<para> +Samba provides periodic caching of the output from the "lpq command" +for performance reasons. This cache time is configurable in seconds. +Obviously the longer the cache time the less often smbd will be +required to exec a copy of lpq. However, the accuracy of the print +queue contents displayed to clients will be diminished as well. +</para> + +<para> +The list of currently opened print queue TDB's can be found +be examining the list of tdb_print_db structures ( see print_db_head +in printing.c ). A queue TDB is opened using the wrapper function +printing.c:get_print_db_byname(). The function ensures that smbd +does not open more than MAX_PRINT_DBS_OPEN in an effort to prevent +a large print server from exhausting all available file descriptors. +If the number of open queue TDB's exceeds the MAX_PRINT_DBS_OPEN +limit, smbd falls back to a most recently used algorithm for maintaining +a list of open TDB's. +</para> + +<para> +There are two ways in which a a print job can be entered into +a print queue's TDB. The first is to submit the job from a Windows +client which will insert the job information directly into the TDB. +The second method is to have the print job picked up by executing the +"lpq command". +</para> + +<para><programlisting> +/* included from printing.h */ +struct printjob { + pid_t pid; /* which process launched the job */ + int sysjob; /* the system (lp) job number */ + int fd; /* file descriptor of open file if open */ + time_t starttime; /* when the job started spooling */ + int status; /* the status of this job */ + size_t size; /* the size of the job so far */ + int page_count; /* then number of pages so far */ + BOOL spooled; /* has it been sent to the spooler yet? */ + BOOL smbjob; /* set if the job is a SMB job */ + fstring filename; /* the filename used to spool the file */ + fstring jobname; /* the job name given to us by the client */ + fstring user; /* the user who started the job */ + fstring queuename; /* service number of printer for this job */ + NT_DEVICEMODE *nt_devmode; +}; +</programlisting></para> + +<para> +The current manifestation of the printjob structure contains a field +for the UNIX job id returned from the "lpq command" and a Windows job +ID (32-bit bounded by PRINT_MAX_JOBID). When a print job is returned +by the "lpq command" that does not match an existing job in the queue's +TDB, a 32-bit job ID above the <*vance doesn't know what word is missing here*> is generating by adding UNIX_JOB_START to +the id reported by lpq. +</para> + +<para> +In order to match a 32-bit Windows jobid onto a 16-bit lanman print job +id, smbd uses an in memory TDB to match the former to a number appropriate +for old lanman clients. +</para> + +<para> +When updating a print queue, smbd will perform the following +steps ( refer to <filename>print.c:print_queue_update()</filename> ): +</para> + +<orderedlist> + <listitem><para>Check to see if another smbd is currently in + the process of updating the queue contents by checking the pid + stored in <constant>LOCK/<replaceable>printer_name</replaceable></constant>. + If so, then do not update the TDB.</para></listitem> + + <listitem><para>Lock the mutex entry in the TDB and store our own pid. + Check that this succeeded, else fail.</para></listitem> + + <listitem><para>Store the updated time stamp for the new cache + listing</para></listitem> + + <listitem><para>Retrieve the queue listing via "lpq command"</para></listitem> + + <listitem><para><programlisting> + foreach job in the queue + { + if the job is a UNIX job, create a new entry; + if the job has a Windows based jobid, then + { + Lookup the record by the jobid; + if the lookup failed, then + treat it as a UNIX job; + else + update the job status only + } + }</programlisting></para></listitem> + + <listitem><para>Delete any jobs in the TDB that are not + in the in the lpq listing</para></listitem> + + <listitem><para>Store the print queue status in the TDB</para></listitem> + + <listitem><para>update the cache time stamp again</para></listitem> + +</orderedlist> + +<para> +Note that it is the contents of this TDB that is returned to Windows +clients and not the actual listing from the "lpq command". +</para> + +<para> +The NT_DEVICEMODE stored as part of the printjob structure is used to +store a pointer to a non-default DeviceMode associated with the print +job. The pointer will be non-null when the client included a Device +Mode in the OpenPrinterEx() call and subsequently submitted a job for +printing on that same handle. If the client did not include a Device +Mode in the OpenPrinterEx() request, the nt_devmode field is NULL +and the job has the printer's device mode associated with it by default. +</para> + +<para> +Only non-default Device Mode are stored with print jobs in the print +queue TDB. Otherwise, the Device Mode is obtained from the printer +object when the client issues a GetJob(level == 2) request. +</para> + +</sect1> + + + + +<sect1> +<title> +ChangeID & Client Caching of Printer Information +</title> + +<para> +[To be filled in later] +</para> +</sect1> + + + +<sect1> +<title> +Windows NT/2K Printer Change Notify +</title> + +<para> +When working with Windows NT+ clients, it is possible for a +print server to use RPC to send asynchronous change notification +events to clients for certain printer and print job attributes. +This can be useful when the client needs to know that a new +job has been added to the queue for a given printer or that the +driver for a printer has been changed. Note that this is done +entirely orthogonal to cache updates based on a new ChangeID for +a printer object. +</para> + +<para> +The basic set of RPC's used to implement change notification are +</para> + +<itemizedlist> + <listitem><para>RemoteFindFirstPrinterChangeNotifyEx ( RFFPCN )</para></listitem> + <listitem><para>RemoteFindNextPrinterChangeNotifyEx ( RFNPCN )</para></listitem> + <listitem><para>FindClosePrinterChangeNotify( FCPCN )</para></listitem> + <listitem><para>ReplyOpenPrinter</para></listitem> + <listitem><para>ReplyClosePrinter</para></listitem> + <listitem><para>RouteRefreshPrinterChangeNotify ( RRPCN )</para></listitem> +</itemizedlist> + +<para> +One additional RPC is available to a server, but is never used by the +Windows spooler service: +</para> + +<itemizedlist> + <listitem><para>RouteReplyPrinter()</para></listitem> +</itemizedlist> + +<para> +The opnum for all of these RPC's are defined in include/rpc_spoolss.h +</para> + +<para> +Windows NT print servers use a bizarre method of sending print +notification event to clients. The process of registering a new change +notification handle is as follows. The 'C' is for client and the +'S' is for server. All error conditions have been eliminated. +</para> + +<para><programlisting> +C: Obtain handle to printer or to the printer + server via the standard OpenPrinterEx() call. +S: Respond with a valid handle to object + +C: Send a RFFPCN request with the previously obtained + handle with either (a) set of flags for change events + to monitor, or (b) a PRINTER_NOTIFY_OPTIONS structure + containing the event information to monitor. The windows + spooler has only been observed to use (b). +S: The <* another missing word*> opens a new TCP session to the client (thus requiring + all print clients to be CIFS servers as well) and sends + a ReplyOpenPrinter() request to the client. +C: The client responds with a printer handle that can be used to + send event notification messages. +S: The server replies success to the RFFPCN request. + +C: The windows spooler follows the RFFPCN with a RFNPCN + request to fetch the current values of all monitored + attributes. +S: The server replies with an array SPOOL_NOTIFY_INFO_DATA + structures (contained in a SPOOL_NOTIFY_INFO structure). + +C: If the change notification handle is ever released by the + client via a FCPCN request, the server sends a ReplyClosePrinter() + request back to the client first. However a request of this + nature from the client is often an indication that the previous + notification event was not marshalled correctly by the server + or a piece of data was wrong. +S: The server closes the internal change notification handle + (POLICY_HND) and does not send any further change notification + events to the client for that printer or job. +</programlisting></para> + +<para> +The current list of notification events supported by Samba can be +found by examining the internal tables in srv_spoolss_nt.c +</para> + +<itemizedlist> + <listitem><para>printer_notify_table[]</para></listitem> + <listitem><para>job_notify_table[]</para></listitem> +</itemizedlist> + +<para> +When an event occurs that could be monitored, smbd sends a message +to itself about the change. The list of events to be transmitted +are queued by the smbd process sending the message to prevent an +overload of TDB usage and the internal message is sent during smbd's +idle loop (refer to printing/notify.c and the functions +send_spoolss_notify2_msg() and print_notify_send_messages() ). +</para> + +<para> +The decision of whether or not the change is to be sent to connected +clients is made by the routine which actually sends the notification. +( refer to srv_spoolss_nt.c:recieve_notify2_message() ). +</para> + +<para> +Because it possible to receive a listing of multiple changes for +multiple printers, the notification events must be split into +categories by the printer name. This makes it possible to group +multiple change events to be sent in a single RPC according to the +printer handle obtained via a ReplyOpenPrinter(). +</para> + +<para> +The actual change notification is performed using the RRPCN request +RPC. This packet contains +</para> + + +<itemizedlist> + +<listitem><para>the printer handle registered with the +client's spooler on which the change occurred</para></listitem> + +<listitem><para>The change_low value which was sent as part +of the last RFNPCN request from the client</para></listitem> + +<listitem><para>The SPOOL_NOTIFY_INFO container with the event +information</para></listitem> + +</itemizedlist> + +<para> +A <VarName>SPOOL_NOTIFY_INFO</VarName> contains: +</para> + +<itemizedlist> + +<listitem><para>the version and flags field are predefined +and should not be changed</para></listitem> + +<listitem><para>The count field is the number of entries +in the SPOOL_NOTIFY_INFO_DATA array</para></listitem> + +</itemizedlist> + +<para> +The <VarName>SPOOL_NOTIFY_INFO_DATA</VarName> entries contain: +</para> + +<itemizedlist> + +<listitem><para>The type defines whether or not this event +is for a printer or a print job</para></listitem> + +<listitem><para>The field is the flag identifying the event</para></listitem> + +<listitem><para>the notify_data union contains the new valuie of the +attribute</para></listitem> + +<listitem><para>The enc_type defines the size of the structure for marshalling +and unmarshalling</para></listitem> + +<listitem><para>(a) the id must be 0 for a printer event on a printer handle. +(b) the id must be the job id for an event on a printer job +(c) the id must be the matching number of the printer index used +in the response packet to the RFNPCN when using a print server +handle for notification. Samba currently uses the snum of +the printer for this which can break if the list of services +has been modified since the notification handle was registered.</para></listitem> + +<listitem><para>The size is either (a) the string length in UNICODE for strings, +(b) the size in bytes of the security descriptor, or (c) 0 for +data values.</para></listitem> + +</itemizedlist> + +</sect1> +</chapter> diff --git a/docs/docbook/devdoc/wins.sgml b/docs/docbook/devdoc/wins.sgml new file mode 100644 index 0000000000..53410316c5 --- /dev/null +++ b/docs/docbook/devdoc/wins.sgml @@ -0,0 +1,79 @@ +<chapter id="wins"> +<chapterinfo> + <author> + <firstname>Gerald</firstname><surname>Carter</surname> + </author> + <pubdate>October 2002</pubdate> +</chapterinfo> + + +<title>Samba WINS Internals</title> + + +<sect1> +<title>WINS Failover</title> + + +<para> +The current Samba codebase possesses the capability to use groups of WINS +servers that share a common namespace for NetBIOS name registration and +resolution. The formal parameter syntax is +</para> + +<para><programlisting> + WINS_SERVER_PARAM = SERVER [ SEPARATOR SERVER_LIST ] + WINS_SERVER_PARAM = "wins server" + SERVER = ADDR[:TAG] + ADDR = ip_addr | fqdn + TAG = string + SEPARATOR = comma | \s+ + SERVER_LIST = SERVER [ SEPARATOR SERVER_LIST ] +</programlisting></para> + +<para> +A simple example of a valid wins server setting is +</para> + +<para><programlisting> +[global] + wins server = 192.168.1.2 192.168.1.3 +</programlisting></para> + +<para> +In the event that no TAG is defined in for a SERVER in the list, smbd assigns a default +TAG of "*". A TAG is used to group servers of a shared NetBIOS namespace together. Upon +startup, nmbd will attempt to register the netbios name value with one server in each +tagged group. +</para> + +<para> +An example using tags to group WINS servers together is show here. Note that the use of +interface names in the tags is only by convention and is not a technical requirement. +</para> + + +<para><programlisting> +[global] + wins server = 192.168.1.2:eth0 192.168.1.3:eth0 192.168.2.2:eth1 +</programlisting></para> + +<para> +Using this configuration, nmbd would attempt to register the server's NetBIOS name +with one WINS server in each group. Because the "eth0" group has two servers, the +second server would only be used when a registration (or resolution) request to +the first server in that group timed out. +</para> + +<para> +NetBIOS name resolution follows a similar pattern as name registration. When resolving +a NetBIOS name via WINS, smbd and other Samba programs will attempt to query a single WINS +server in a tagged group until either a positive response is obtained at least once or +until a server from every tagged group has responded negatively to the name query request. +If a timeout occurs when querying a specific WINS server, that server is marked as down to +prevent further timeouts and the next server in the WINS group is contacted. Once marked as +dead, Samba will not attempt to contact that server for name registration/resolution queries +for a period of 10 minutes. +</para> + +</sect1> +</chapter> diff --git a/docs/htmldocs/Samba-Developers-Guide.html b/docs/htmldocs/Samba-Developers-Guide.html new file mode 100644 index 0000000000..7c008667af --- /dev/null +++ b/docs/htmldocs/Samba-Developers-Guide.html @@ -0,0 +1,8355 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> +<HTML +><HEAD +><TITLE +>SAMBA Developers Guide</TITLE +><META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ +"></HEAD +><BODY +CLASS="BOOK" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF" +><DIV +CLASS="BOOK" +><A +NAME="SAMBA-DEVELOPER-DOCUMENTATION"><DIV +CLASS="TITLEPAGE" +><H1 +CLASS="TITLE" +><A +NAME="SAMBA-DEVELOPER-DOCUMENTATION">SAMBA Developers Guide</H1 +><H3 +CLASS="AUTHOR" +><A +NAME="AEN4">SAMBA Team</H3 +><HR></DIV +><HR><H1 +><A +NAME="AEN8">Abstract</H1 +><P +><I +CLASS="EMPHASIS" +>Last Update</I +> : Mon Sep 30 15:23:53 CDT 2002</P +><P +>This book is a collection of documents that might be useful for +people developing samba or those interested in doing so. +It's nothing more than a collection of documents written by samba developers about +the internals of various parts of samba and the SMB protocol. It's still incomplete. +The most recent version of this document +can be found at <A +HREF="http://devel.samba.org/" +TARGET="_top" +>http://devel.samba.org/</A +>. +Please send updates to <A +HREF="mailto:jelmer@samba.org" +TARGET="_top" +>jelmer@samba.org</A +>.</P +><P +>This documentation is distributed under the GNU General Public License (GPL) +version 2. A copy of the license is included with the Samba source +distribution. A copy can be found on-line at <A +HREF="http://www.fsf.org/licenses/gpl.txt" +TARGET="_top" +>http://www.fsf.org/licenses/gpl.txt</A +></P +><DIV +CLASS="TOC" +><DL +><DT +><B +>Table of Contents</B +></DT +><DT +><A +HREF="#NETBIOS" +>Definition of NetBIOS Protocol and Name Resolution Modes</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN24" +>NETBIOS</A +></DT +><DT +><A +HREF="#AEN35" +>BROADCAST NetBIOS</A +></DT +><DT +><A +HREF="#AEN39" +>NBNS NetBIOS</A +></DT +></DL +></DD +><DT +><A +HREF="#ARCHITECTURE" +>Samba Architecture</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN54" +>Introduction</A +></DT +><DT +><A +HREF="#AEN65" +>Multithreading and Samba</A +></DT +><DT +><A +HREF="#AEN70" +>Threading smbd</A +></DT +><DT +><A +HREF="#AEN86" +>Threading nmbd</A +></DT +><DT +><A +HREF="#AEN92" +>nbmd Design</A +></DT +></DL +></DD +><DT +><A +HREF="#DEBUG" +>The samba DEBUG system</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN103" +>New Output Syntax</A +></DT +><DT +><A +HREF="#AEN128" +>The DEBUG() Macro</A +></DT +><DT +><A +HREF="#AEN151" +>The DEBUGADD() Macro</A +></DT +><DT +><A +HREF="#AEN159" +>The DEBUGLVL() Macro</A +></DT +><DT +><A +HREF="#AEN179" +>New Functions</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN181" +>dbgtext()</A +></DT +><DT +><A +HREF="#AEN184" +>dbghdr()</A +></DT +><DT +><A +HREF="#AEN188" +>format_debug_text()</A +></DT +></DL +></DD +></DL +></DD +><DT +><A +HREF="#CODINGSUGGESTIONS" +>Coding Suggestions</A +></DT +><DT +><A +HREF="#INTERNALS" +>Samba Internals</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN284" +>Character Handling</A +></DT +><DT +><A +HREF="#AEN288" +>The new functions</A +></DT +><DT +><A +HREF="#AEN317" +>Macros in byteorder.h</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN320" +>CVAL(buf,pos)</A +></DT +><DT +><A +HREF="#AEN323" +>PVAL(buf,pos)</A +></DT +><DT +><A +HREF="#AEN326" +>SCVAL(buf,pos,val)</A +></DT +><DT +><A +HREF="#AEN329" +>SVAL(buf,pos)</A +></DT +><DT +><A +HREF="#AEN332" +>IVAL(buf,pos)</A +></DT +><DT +><A +HREF="#AEN335" +>SVALS(buf,pos)</A +></DT +><DT +><A +HREF="#AEN338" +>IVALS(buf,pos)</A +></DT +><DT +><A +HREF="#AEN341" +>SSVAL(buf,pos,val)</A +></DT +><DT +><A +HREF="#AEN344" +>SIVAL(buf,pos,val)</A +></DT +><DT +><A +HREF="#AEN347" +>SSVALS(buf,pos,val)</A +></DT +><DT +><A +HREF="#AEN350" +>SIVALS(buf,pos,val)</A +></DT +><DT +><A +HREF="#AEN353" +>RSVAL(buf,pos)</A +></DT +><DT +><A +HREF="#AEN356" +>RIVAL(buf,pos)</A +></DT +><DT +><A +HREF="#AEN359" +>RSSVAL(buf,pos,val)</A +></DT +><DT +><A +HREF="#AEN362" +>RSIVAL(buf,pos,val)</A +></DT +></DL +></DD +><DT +><A +HREF="#AEN365" +>LAN Manager Samba API</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN371" +>Parameters</A +></DT +><DT +><A +HREF="#AEN406" +>Return value</A +></DT +></DL +></DD +><DT +><A +HREF="#AEN420" +>Code character table</A +></DT +></DL +></DD +><DT +><A +HREF="#PARSING" +>The smb.conf file</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN451" +>Lexical Analysis</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN472" +>Handling of Whitespace</A +></DT +><DT +><A +HREF="#AEN484" +>Handling of Line Continuation</A +></DT +><DT +><A +HREF="#AEN495" +>Line Continuation Quirks</A +></DT +></DL +></DD +><DT +><A +HREF="#AEN515" +>Syntax</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN530" +>About params.c</A +></DT +></DL +></DD +></DL +></DD +><DT +><A +HREF="#UNIX-SMB" +>NetBIOS in a Unix World</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN540" +>Introduction</A +></DT +><DT +><A +HREF="#AEN544" +>Usernames</A +></DT +><DT +><A +HREF="#AEN552" +>File Ownership</A +></DT +><DT +><A +HREF="#AEN557" +>Passwords</A +></DT +><DT +><A +HREF="#AEN563" +>Locking</A +></DT +><DT +><A +HREF="#AEN570" +>Deny Modes</A +></DT +><DT +><A +HREF="#AEN574" +>Trapdoor UIDs</A +></DT +><DT +><A +HREF="#AEN578" +>Port numbers</A +></DT +><DT +><A +HREF="#AEN583" +>Protocol Complexity</A +></DT +></DL +></DD +><DT +><A +HREF="#TRACING" +>Tracing samba system calls</A +></DT +><DT +><A +HREF="#NTDOMAIN" +>NT Domain RPC's</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN651" +>Introduction</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN687" +>Sources</A +></DT +><DT +><A +HREF="#AEN694" +>Credits</A +></DT +></DL +></DD +><DT +><A +HREF="#AEN701" +>Notes and Structures</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN703" +>Notes</A +></DT +><DT +><A +HREF="#AEN716" +>Enumerations</A +></DT +><DT +><A +HREF="#AEN774" +>Structures</A +></DT +></DL +></DD +><DT +><A +HREF="#AEN1570" +>MSRPC over Transact Named Pipe</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN1573" +>MSRPC Pipes</A +></DT +><DT +><A +HREF="#AEN1587" +>Header</A +></DT +><DT +><A +HREF="#AEN1841" +>Tail</A +></DT +><DT +><A +HREF="#AEN1853" +>RPC Bind / Bind Ack</A +></DT +><DT +><A +HREF="#AEN1897" +>NTLSA Transact Named Pipe</A +></DT +><DT +><A +HREF="#AEN1938" +>LSA Open Policy</A +></DT +><DT +><A +HREF="#AEN1972" +>LSA Query Info Policy</A +></DT +><DT +><A +HREF="#AEN2000" +>LSA Enumerate Trusted Domains</A +></DT +><DT +><A +HREF="#AEN2024" +>LSA Open Secret</A +></DT +><DT +><A +HREF="#AEN2053" +>LSA Close</A +></DT +><DT +><A +HREF="#AEN2070" +>LSA Lookup SIDS</A +></DT +><DT +><A +HREF="#AEN2129" +>LSA Lookup Names</A +></DT +></DL +></DD +><DT +><A +HREF="#AEN2192" +>NETLOGON rpc Transact Named Pipe</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN2231" +>LSA Request Challenge</A +></DT +><DT +><A +HREF="#AEN2266" +>LSA Authenticate 2</A +></DT +><DT +><A +HREF="#AEN2305" +>LSA Server Password Set</A +></DT +><DT +><A +HREF="#AEN2334" +>LSA SAM Logon</A +></DT +><DT +><A +HREF="#AEN2358" +>LSA SAM Logoff</A +></DT +></DL +></DD +><DT +><A +HREF="#AEN2381" +>\\MAILSLOT\NET\NTLOGON</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN2385" +>Query for PDC</A +></DT +><DT +><A +HREF="#AEN2459" +>SAM Logon</A +></DT +></DL +></DD +><DT +><A +HREF="#AEN2549" +>SRVSVC Transact Named Pipe</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN2561" +>Net Share Enum</A +></DT +><DT +><A +HREF="#AEN2622" +>Net Server Get Info</A +></DT +></DL +></DD +><DT +><A +HREF="#AEN2653" +>Cryptographic side of NT Domain Authentication</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN2655" +>Definitions</A +></DT +><DT +><A +HREF="#AEN2698" +>Protocol</A +></DT +><DT +><A +HREF="#AEN2708" +>Comments</A +></DT +></DL +></DD +><DT +><A +HREF="#AEN2715" +>SIDs and RIDs</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN2723" +>Well-known SIDs</A +></DT +><DT +><A +HREF="#AEN2811" +>Well-known RIDS</A +></DT +></DL +></DD +></DL +></DD +><DT +><A +HREF="#PRINTING" +>Samba Printing Internals</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN2895" +>Abstract</A +></DT +><DT +><A +HREF="#AEN2898" +>Printing Interface to Various Back ends</A +></DT +><DT +><A +HREF="#AEN2924" +>Print Queue TDB's</A +></DT +><DT +><A +HREF="#AEN2958" +>ChangeID & Client Caching of Printer Information</A +></DT +><DT +><A +HREF="#AEN2961" +>Windows NT/2K Printer Change Notify</A +></DT +></DL +></DD +><DT +><A +HREF="#WINS" +>Samba WINS Internals</A +></DT +><DD +><DL +><DT +><A +HREF="#AEN3032" +>WINS Failover</A +></DT +></DL +></DD +></DL +></DIV +><DIV +CLASS="CHAPTER" +><HR><H1 +><A +NAME="NETBIOS">Definition of NetBIOS Protocol and Name Resolution Modes</H1 +><DIV +CLASS="SECT1" +><H2 +CLASS="SECT1" +><A +NAME="AEN24">NETBIOS</H2 +><P +>NetBIOS runs over the following tranports: TCP/IP; NetBEUI and IPX/SPX. +Samba only uses NetBIOS over TCP/IP. For details on the TCP/IP NetBIOS +Session Service NetBIOS Datagram Service, and NetBIOS Names, see +rfc1001.txt and rfc1002.txt.</P +><P +> +NetBEUI is a raw NetBIOS frame protocol implementation that allows NetBIOS +datagrams to be sent out over the 'wire' embedded within LLC frames. +NetBEUI is not required when using NetBIOS over TCP/IP protocols and it +is preferable NOT to install NetBEUI if it can be avoided.</P +><P +> +IPX/SPX is also not required when using NetBIOS over TCP/IP, and it is +preferable NOT to install the IPX/SPX transport unless you are using Novell +servers. At the very least, it is recommended that you do not install +'NetBIOS over IPX/SPX'.</P +><P +>[When installing Windows 95, you will find that NetBEUI and IPX/SPX are +installed as the default protocols. This is because they are the simplest +to manage: no Windows 95 user-configuration is required].</P +><P +> +NetBIOS applications (such as samba) offer their services (for example, +SMB file and print sharing) on a NetBIOS name. They must claim this name +on the network before doing so. The NetBIOS session service will then +accept connections on the application's behalf (on the NetBIOS name +claimed by the application). A NetBIOS session between the application +and the client can then commence.</P +><P +> +NetBIOS names consist of 15 characters plus a 'type' character. This is +similar, in concept, to an IP address and a TCP port number, respectively. +A NetBIOS-aware application on a host will offer different services under +different NetBIOS name types, just as a host will offer different TCP/IP +services on different port numbers.</P +><P +> +NetBIOS names must be claimed on a network, and must be defended. The use +of NetBIOS names is most suitable on a single subnet; a Local Area Network +or a Wide Area Network.</P +><P +> +NetBIOS names are either UNIQUE or GROUP. Only one application can claim a +UNIQUE NetBIOS name on a network.</P +><P +>There are two kinds of NetBIOS Name resolution: Broadcast and Point-to-Point.</P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN35">BROADCAST NetBIOS</H2 +><P +> +Clients can claim names, and therefore offer services on successfully claimed +names, on their broadcast-isolated subnet. One way to get NetBIOS services +(such as browsing: see ftp.microsoft.com/drg/developr/CIFS/browdiff.txt; and +SMB file/print sharing: see cifs4.txt) working on a LAN or WAN is to make +your routers forward all broadcast packets from TCP/IP ports 137, 138 and 139.</P +><P +> +This, however, is not recommended. If you have a large LAN or WAN, you will +find that some of your hosts spend 95 percent of their time dealing with +broadcast traffic. [If you have IPX/SPX on your LAN or WAN, you will find +that this is already happening: a packet analyzer will show, roughly +every twelve minutes, great swathes of broadcast traffic!].</P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN39">NBNS NetBIOS</H2 +><P +>rfc1001.txt describes, amongst other things, the implementation and use +of, a 'NetBIOS Name Service'. NT/AS offers 'Windows Internet Name Service' +which is fully rfc1001/2 compliant, but has had to take specific action +with certain NetBIOS names in order to make it useful. (for example, it +deals with the registration of <1c> <1d> <1e> names all in different ways. +I recommend the reading of the Microsoft WINS Server Help files for full +details).</P +><P +> +The use of a WINS server cuts down on broadcast network traffic for +NetBIOS name resolution. It has the effect of pulling all the broadcast +isolated subnets together into a single NetBIOS scope, across your LAN +or WAN, while avoiding the use of TCP/IP broadcast packets.</P +><P +>When you have a WINS server on your LAN, WINS clients will be able to +contact the WINS server to resolve NetBIOS names. Note that only those +WINS clients that have registered with the same WINS server will be +visible. The WINS server _can_ have static NetBIOS entries added to its +database (usually for security reasons you might want to consider putting +your domain controllers or other important servers as static entries, +but you should not rely on this as your sole means of security), but for +the most part, NetBIOS names are registered dynamically.</P +><P +>This provides some confusion for lots of people, and is worth mentioning +here: a Browse Server is NOT a WINS Server, even if these services are +implemented in the same application. A Browse Server _needs_ a WINS server +because a Browse Server is a WINS client, which is _not_ the same thing].</P +><P +>Clients can claim names, and therefore offer services on successfully claimed +names, on their broadcast-isolated subnet. One way to get NetBIOS services +(such as browsing: see ftp.microsoft.com/drg/developr/CIFS/browdiff.txt; and +SMB file/print sharing: see cifs6.txt) working on a LAN or WAN is to make +your routers forward all broadcast packets from TCP/IP ports 137, 138 and 139. +You will find, however, if you do this on a large LAN or a WAN, that your +network is completely swamped by NetBIOS and browsing packets, which is why +WINS was developed to minimise the necessity of broadcast traffic.</P +><P +> +WINS Clients therefore claim names from the WINS server. If the WINS +server allows them to register a name, the client's NetBIOS session service +can then offer services on this name. Other WINS clients will then +contact the WINS server to resolve a NetBIOS name.</P +></DIV +></DIV +><DIV +CLASS="CHAPTER" +><HR><H1 +><A +NAME="ARCHITECTURE">Samba Architecture</H1 +><DIV +CLASS="SECT1" +><H2 +CLASS="SECT1" +><A +NAME="AEN54">Introduction</H2 +><P +>This document gives a general overview of how Samba works +internally. The Samba Team has tried to come up with a model which is +the best possible compromise between elegance, portability, security +and the constraints imposed by the very messy SMB and CIFS +protocol. </P +><P +>It also tries to answer some of the frequently asked questions such as:</P +><P +></P +><OL +TYPE="1" +><LI +><P +> Is Samba secure when running on Unix? The xyz platform? + What about the root priveliges issue?</P +></LI +><LI +><P +>Pros and cons of multithreading in various parts of Samba</P +></LI +><LI +><P +>Why not have a separate process for name resolution, WINS, and browsing?</P +></LI +></OL +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN65">Multithreading and Samba</H2 +><P +>People sometimes tout threads as a uniformly good thing. They are very +nice in their place but are quite inappropriate for smbd. nmbd is +another matter, and multi-threading it would be very nice. </P +><P +>The short version is that smbd is not multithreaded, and alternative +servers that take this approach under Unix (such as Syntax, at the +time of writing) suffer tremendous performance penalties and are less +robust. nmbd is not threaded either, but this is because it is not +possible to do it while keeping code consistent and portable across 35 +or more platforms. (This drawback also applies to threading smbd.)</P +><P +>The longer versions is that there are very good reasons for not making +smbd multi-threaded. Multi-threading would actually make Samba much +slower, less scalable, less portable and much less robust. The fact +that we use a separate process for each connection is one of Samba's +biggest advantages.</P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN70">Threading smbd</H2 +><P +>A few problems that would arise from a threaded smbd are:</P +><P +></P +><OL +TYPE="1" +><LI +><P +> It's not only to create threads instead of processes, but you + must care about all variables if they have to be thread specific + (currently they would be global).</P +></LI +><LI +><P +> if one thread dies (eg. a seg fault) then all threads die. We can + immediately throw robustness out the window.</P +></LI +><LI +><P +> many of the system calls we make are blocking. Non-blocking + equivalents of many calls are either not available or are awkward (and + slow) to use. So while we block in one thread all clients are + waiting. Imagine if one share is a slow NFS filesystem and the others + are fast, we will end up slowing all clients to the speed of NFS.</P +></LI +><LI +><P +> you can't run as a different uid in different threads. This means + we would have to switch uid/gid on _every_ SMB packet. It would be + horrendously slow.</P +></LI +><LI +><P +> the per process file descriptor limit would mean that we could only + support a limited number of clients.</P +></LI +><LI +><P +> we couldn't use the system locking calls as the locking context of + fcntl() is a process, not a thread.</P +></LI +></OL +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN86">Threading nmbd</H2 +><P +>This would be ideal, but gets sunk by portability requirements.</P +><P +>Andrew tried to write a test threads library for nmbd that used only +ansi-C constructs (using setjmp and longjmp). Unfortunately some OSes +defeat this by restricting longjmp to calling addresses that are +shallower than the current address on the stack (apparently AIX does +this). This makes a truly portable threads library impossible. So to +support all our current platforms we would have to code nmbd both with +and without threads, and as the real aim of threads is to make the +code clearer we would not have gained anything. (it is a myth that +threads make things faster. threading is like recursion, it can make +things clear but the same thing can always be done faster by some +other method)</P +><P +>Chris tried to spec out a general design that would abstract threading +vs separate processes (vs other methods?) and make them accessible +through some general API. This doesn't work because of the data +sharing requirements of the protocol (packets in the future depending +on packets now, etc.) At least, the code would work but would be very +clumsy, and besides the fork() type model would never work on Unix. (Is there an OS that it would work on, for nmbd?)</P +><P +>A fork() is cheap, but not nearly cheap enough to do on every UDP +packet that arrives. Having a pool of processes is possible but is +nasty to program cleanly due to the enormous amount of shared data (in +complex structures) between the processes. We can't rely on each +platform having a shared memory system.</P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN92">nbmd Design</H2 +><P +>Originally Andrew used recursion to simulate a multi-threaded +environment, which use the stack enormously and made for really +confusing debugging sessions. Luke Leighton rewrote it to use a +queuing system that keeps state information on each packet. The +first version used a single structure which was used by all the +pending states. As the initialisation of this structure was +done by adding arguments, as the functionality developed, it got +pretty messy. So, it was replaced with a higher-order function +and a pointer to a user-defined memory block. This suddenly +made things much simpler: large numbers of functions could be +made static, and modularised. This is the same principle as used +in NT's kernel, and achieves the same effect as threads, but in +a single process.</P +><P +>Then Jeremy rewrote nmbd. The packet data in nmbd isn't what's on the +wire. It's a nice format that is very amenable to processing but still +keeps the idea of a distinct packet. See "struct packet_struct" in +nameserv.h. It has all the detail but none of the on-the-wire +mess. This makes it ideal for using in disk or memory-based databases +for browsing and WINS support. </P +></DIV +></DIV +><DIV +CLASS="CHAPTER" +><HR><H1 +><A +NAME="DEBUG">The samba DEBUG system</H1 +><DIV +CLASS="SECT1" +><H2 +CLASS="SECT1" +><A +NAME="AEN103">New Output Syntax</H2 +><P +> The syntax of a debugging log file is represented as:</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> >debugfile< :== { >debugmsg< } + + >debugmsg< :== >debughdr< '\n' >debugtext< + + >debughdr< :== '[' TIME ',' LEVEL ']' FILE ':' [FUNCTION] '(' LINE ')' + + >debugtext< :== { >debugline< } + + >debugline< :== TEXT '\n'</PRE +></TD +></TR +></TABLE +></P +><P +>TEXT is a string of characters excluding the newline character.</P +><P +>LEVEL is the DEBUG level of the message (an integer in the range + 0..10).</P +><P +>TIME is a timestamp.</P +><P +>FILE is the name of the file from which the debug message was +generated.</P +><P +>FUNCTION is the function from which the debug message was generated.</P +><P +>LINE is the line number of the debug statement that generated the +message.</P +><P +>Basically, what that all means is:</P +><P +></P +><OL +TYPE="1" +><LI +><P +>A debugging log file is made up of debug messages.</P +></LI +><LI +><P +>Each debug message is made up of a header and text. The header is +separated from the text by a newline.</P +></LI +><LI +><P +>The header begins with the timestamp and debug level of the +message enclosed in brackets. The filename, function, and line +number at which the message was generated follow. The filename is +terminated by a colon, and the function name is terminated by the +parenthesis which contain the line number. Depending upon the +compiler, the function name may be missing (it is generated by the +__FUNCTION__ macro, which is not universally implemented, dangit).</P +></LI +><LI +><P +>The message text is made up of zero or more lines, each terminated +by a newline.</P +></LI +></OL +><P +>Here's some example output:</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> [1998/08/03 12:55:25, 1] nmbd.c:(659) + Netbios nameserver version 1.9.19-prealpha started. + Copyright Andrew Tridgell 1994-1997 + [1998/08/03 12:55:25, 3] loadparm.c:(763) + Initializing global parameters</PRE +></TD +></TR +></TABLE +></P +><P +>Note that in the above example the function names are not listed on +the header line. That's because the example above was generated on an +SGI Indy, and the SGI compiler doesn't support the __FUNCTION__ macro.</P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN128">The DEBUG() Macro</H2 +><P +>Use of the DEBUG() macro is unchanged. DEBUG() takes two parameters. +The first is the message level, the second is the body of a function +call to the Debug1() function.</P +><P +>That's confusing.</P +><P +>Here's an example which may help a bit. If you would write</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +>printf( "This is a %s message.\n", "debug" );</PRE +></TD +></TR +></TABLE +></P +><P +>to send the output to stdout, then you would write</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +>DEBUG( 0, ( "This is a %s message.\n", "debug" ) );</PRE +></TD +></TR +></TABLE +></P +><P +>to send the output to the debug file. All of the normal printf() +formatting escapes work.</P +><P +>Note that in the above example the DEBUG message level is set to 0. +Messages at level 0 always print. Basically, if the message level is +less than or equal to the global value DEBUGLEVEL, then the DEBUG +statement is processed.</P +><P +>The output of the above example would be something like:</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> [1998/07/30 16:00:51, 0] file.c:function(128) + This is a debug message.</PRE +></TD +></TR +></TABLE +></P +><P +>Each call to DEBUG() creates a new header *unless* the output produced +by the previous call to DEBUG() did not end with a '\n'. Output to the +debug file is passed through a formatting buffer which is flushed +every time a newline is encountered. If the buffer is not empty when +DEBUG() is called, the new input is simply appended.</P +><P +>...but that's really just a Kludge. It was put in place because +DEBUG() has been used to write partial lines. Here's a simple (dumb) +example of the kind of thing I'm talking about:</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> DEBUG( 0, ("The test returned " ) ); + if( test() ) + DEBUG(0, ("True") ); + else + DEBUG(0, ("False") ); + DEBUG(0, (".\n") );</PRE +></TD +></TR +></TABLE +></P +><P +>Without the format buffer, the output (assuming test() returned true) +would look like this:</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> [1998/07/30 16:00:51, 0] file.c:function(256) + The test returned + [1998/07/30 16:00:51, 0] file.c:function(258) + True + [1998/07/30 16:00:51, 0] file.c:function(261) + .</PRE +></TD +></TR +></TABLE +></P +><P +>Which isn't much use. The format buffer kludge fixes this problem.</P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN151">The DEBUGADD() Macro</H2 +><P +>In addition to the kludgey solution to the broken line problem +described above, there is a clean solution. The DEBUGADD() macro never +generates a header. It will append new text to the current debug +message even if the format buffer is empty. The syntax of the +DEBUGADD() macro is the same as that of the DEBUG() macro.</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> DEBUG( 0, ("This is the first line.\n" ) ); + DEBUGADD( 0, ("This is the second line.\nThis is the third line.\n" ) );</PRE +></TD +></TR +></TABLE +></P +><P +>Produces</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> [1998/07/30 16:00:51, 0] file.c:function(512) + This is the first line. + This is the second line. + This is the third line.</PRE +></TD +></TR +></TABLE +></P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN159">The DEBUGLVL() Macro</H2 +><P +>One of the problems with the DEBUG() macro was that DEBUG() lines +tended to get a bit long. Consider this example from +nmbd_sendannounce.c:</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> DEBUG(3,("send_local_master_announcement: type %x for name %s on subnet %s for workgroup %s\n", + type, global_myname, subrec->subnet_name, work->work_group));</PRE +></TD +></TR +></TABLE +></P +><P +>One solution to this is to break it down using DEBUG() and DEBUGADD(), +as follows:</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> DEBUG( 3, ( "send_local_master_announcement: " ) ); + DEBUGADD( 3, ( "type %x for name %s ", type, global_myname ) ); + DEBUGADD( 3, ( "on subnet %s ", subrec->subnet_name ) ); + DEBUGADD( 3, ( "for workgroup %s\n", work->work_group ) );</PRE +></TD +></TR +></TABLE +></P +><P +>A similar, but arguably nicer approach is to use the DEBUGLVL() macro. +This macro returns True if the message level is less than or equal to +the global DEBUGLEVEL value, so:</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> if( DEBUGLVL( 3 ) ) + { + dbgtext( "send_local_master_announcement: " ); + dbgtext( "type %x for name %s ", type, global_myname ); + dbgtext( "on subnet %s ", subrec->subnet_name ); + dbgtext( "for workgroup %s\n", work->work_group ); + }</PRE +></TD +></TR +></TABLE +></P +><P +>(The dbgtext() function is explained below.)</P +><P +>There are a few advantages to this scheme:</P +><P +></P +><OL +TYPE="1" +><LI +><P +>The test is performed only once.</P +></LI +><LI +><P +>You can allocate variables off of the stack that will only be used +within the DEBUGLVL() block.</P +></LI +><LI +><P +>Processing that is only relevant to debug output can be contained +within the DEBUGLVL() block.</P +></LI +></OL +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN179">New Functions</H2 +><DIV +CLASS="SECT2" +><H3 +CLASS="SECT2" +><A +NAME="AEN181">dbgtext()</H3 +><P +>This function prints debug message text to the debug file (and +possibly to syslog) via the format buffer. The function uses a +variable argument list just like printf() or Debug1(). The +input is printed into a buffer using the vslprintf() function, +and then passed to format_debug_text(). + +If you use DEBUGLVL() you will probably print the body of the +message using dbgtext(). </P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN184">dbghdr()</H3 +><P +>This is the function that writes a debug message header. +Headers are not processed via the format buffer. Also note that +if the format buffer is not empty, a call to dbghdr() will not +produce any output. See the comments in dbghdr() for more info.</P +><P +>It is not likely that this function will be called directly. It +is used by DEBUG() and DEBUGADD().</P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN188">format_debug_text()</H3 +><P +>This is a static function in debug.c. It stores the output text +for the body of the message in a buffer until it encounters a +newline. When the newline character is found, the buffer is +written to the debug file via the Debug1() function, and the +buffer is reset. This allows us to add the indentation at the +beginning of each line of the message body, and also ensures +that the output is written a line at a time (which cleans up +syslog output).</P +></DIV +></DIV +></DIV +><DIV +CLASS="CHAPTER" +><HR><H1 +><A +NAME="CODINGSUGGESTIONS">Coding Suggestions</H1 +><P +>So you want to add code to Samba ...</P +><P +>One of the daunting tasks facing a programmer attempting to write code for +Samba is understanding the various coding conventions used by those most +active in the project. These conventions were mostly unwritten and helped +improve either the portability, stability or consistency of the code. This +document will attempt to document a few of the more important coding +practices used at this time on the Samba project. The coding practices are +expected to change slightly over time, and even to grow as more is learned +about obscure portability considerations. Two existing documents +<TT +CLASS="FILENAME" +>samba/source/internals.doc</TT +> and +<TT +CLASS="FILENAME" +>samba/source/architecture.doc</TT +> provide +additional information.</P +><P +>The loosely related question of coding style is very personal and this +document does not attempt to address that subject, except to say that I +have observed that eight character tabs seem to be preferred in Samba +source. If you are interested in the topic of coding style, two oft-quoted +documents are:</P +><P +><A +HREF="http://lxr.linux.no/source/Documentation/CodingStyle" +TARGET="_top" +>http://lxr.linux.no/source/Documentation/CodingStyle</A +></P +><P +><A +HREF="http://www.fsf.org/prep/standards_toc.html" +TARGET="_top" +>http://www.fsf.org/prep/standards_toc.html</A +></P +><P +>But note that coding style in Samba varies due to the many different +programmers who have contributed.</P +><P +>Following are some considerations you should use when adding new code to +Samba. First and foremost remember that:</P +><P +>Portability is a primary consideration in adding function, as is network +compatability with de facto, existing, real world CIFS/SMB implementations. +There are lots of platforms that Samba builds on so use caution when adding +a call to a library function that is not invoked in existing Samba code. +Also note that there are many quite different SMB/CIFS clients that Samba +tries to support, not all of which follow the SNIA CIFS Technical Reference +(or the earlier Microsoft reference documents or the X/Open book on the SMB +Standard) perfectly.</P +><P +>Here are some other suggestions:</P +><P +></P +><OL +TYPE="1" +><LI +><P +> use d_printf instead of printf for display text + reason: enable auto-substitution of translated language text </P +></LI +><LI +><P +> use SAFE_FREE instead of free + reason: reduce traps due to null pointers</P +></LI +><LI +><P +> don't use bzero use memset, or ZERO_STRUCT and ZERO_STRUCTP macros + reason: not POSIX</P +></LI +><LI +><P +> don't use strcpy and strlen (use safe_* equivalents) + reason: to avoid traps due to buffer overruns</P +></LI +><LI +><P +> don't use getopt_long, use popt functions instead + reason: portability</P +></LI +><LI +><P +> explicitly add const qualifiers on parm passing in functions where parm + is input only (somewhat controversial but const can be #defined away)</P +></LI +><LI +><P +> when passing a va_list as an arg, or assigning one to another + please use the VA_COPY() macro + reason: on some platforms, va_list is a struct that must be + initialized in each function...can SEGV if you don't.</P +></LI +><LI +><P +> discourage use of threads + reason: portability (also see architecture.doc)</P +></LI +><LI +><P +> don't explicitly include new header files in C files - new h files + should be included by adding them once to includes.h + reason: consistency</P +></LI +><LI +><P +> don't explicitly extern functions (they are autogenerated by + "make proto" into proto.h) + reason: consistency</P +></LI +><LI +><P +> use endian safe macros when unpacking SMBs (see byteorder.h and + internals.doc) + reason: not everyone uses Intel</P +></LI +><LI +><P +> Note Unicode implications of charset handling (see internals.doc). See + pull_* and push_* and convert_string functions. + reason: Internationalization</P +></LI +><LI +><P +> Don't assume English only + reason: See above</P +></LI +><LI +><P +> Try to avoid using in/out parameters (functions that return data which + overwrites input parameters) + reason: Can cause stability problems</P +></LI +><LI +><P +> Ensure copyright notices are correct, don't append Tridge's name to code + that he didn't write. If you did not write the code, make sure that it + can coexist with the rest of the Samba GPLed code.</P +></LI +><LI +><P +> Consider usage of DATA_BLOBs for length specified byte-data. + reason: stability</P +></LI +><LI +><P +> Take advantage of tdbs for database like function + reason: consistency</P +></LI +><LI +><P +> Don't access the SAM_ACCOUNT structure directly, they should be accessed + via pdb_get...() and pdb_set...() functions. + reason: stability, consistency</P +></LI +><LI +><P +> Don't check a password directly against the passdb, always use the + check_password() interface. + reason: long term pluggability</P +></LI +><LI +><P +> Try to use asprintf rather than pstrings and fstrings where possible</P +></LI +><LI +><P +> Use normal C comments / * instead of C++ comments // like + this. Although the C++ comment format is part of the C99 + standard, some older vendor C compilers do not accept it.</P +></LI +><LI +><P +> Try to write documentation for API functions and structures + explaining the point of the code, the way it should be used, and + any special conditions or results. Mark these with a double-star + comment start / ** so that they can be picked up by Doxygen, as in + this file.</P +></LI +><LI +><P +> Keep the scope narrow. This means making functions/variables + static whenever possible. We don't want our namespace + polluted. Each module should have a minimal number of externally + visible functions or variables.</P +></LI +><LI +><P +> Use function pointers to keep knowledge about particular pieces of + code isolated in one place. We don't want a particular piece of + functionality to be spread out across lots of places - that makes + for fragile, hand to maintain code. Instead, design an interface + and use tables containing function pointers to implement specific + functionality. This is particularly important for command + interpreters. </P +></LI +><LI +><P +> Think carefully about what it will be like for someone else to add + to and maintain your code. If it would be hard for someone else to + maintain then do it another way. </P +></LI +></OL +><P +>The suggestions above are simply that, suggestions, but the information may +help in reducing the routine rework done on new code. The preceeding list +is expected to change routinely as new support routines and macros are +added.</P +></DIV +><DIV +CLASS="CHAPTER" +><HR><H1 +><A +NAME="INTERNALS">Samba Internals</H1 +><DIV +CLASS="SECT1" +><H2 +CLASS="SECT1" +><A +NAME="AEN284">Character Handling</H2 +><P +>This section describes character set handling in Samba, as implemented in +Samba 3.0 and above</P +><P +>In the past Samba had very ad-hoc character set handling. Scattered +throughout the code were numerous calls which converted particular +strings to/from DOS codepages. The problem is that there was no way of +telling if a particular char* is in dos codepage or unix +codepage. This led to a nightmare of code that tried to cope with +particular cases without handlingt the general case.</P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN288">The new functions</H2 +><P +>The new system works like this:</P +><P +></P +><OL +TYPE="1" +><LI +><P +> all char* strings inside Samba are "unix" strings. These are + multi-byte strings that are in the charset defined by the "unix + charset" option in smb.conf. </P +></LI +><LI +><P +> there is no single fixed character set for unix strings, but any + character set that is used does need the following properties: + </P +><P +></P +><OL +TYPE="a" +><LI +><P +> must not contain NULLs except for termination + </P +></LI +><LI +><P +> must be 7-bit compatible with C strings, so that a constant + string or character in C will be byte-for-byte identical to the + equivalent string in the chosen character set. + </P +></LI +><LI +><P +> when you uppercase or lowercase a string it does not become + longer than the original string + </P +></LI +><LI +><P +> must be able to correctly hold all characters that your client + will throw at it + </P +></LI +></OL +><P +> For example, UTF-8 is fine, and most multi-byte asian character sets + are fine, but UCS2 could not be used for unix strings as they + contain nulls. + </P +></LI +><LI +><P +> when you need to put a string into a buffer that will be sent on the + wire, or you need a string in a character set format that is + compatible with the clients character set then you need to use a + pull_ or push_ function. The pull_ functions pull a string from a + wire buffer into a (multi-byte) unix string. The push_ functions + push a string out to a wire buffer. </P +></LI +><LI +><P +> the two main pull_ and push_ functions you need to understand are + pull_string and push_string. These functions take a base pointer + that should point at the start of the SMB packet that the string is + in. The functions will check the flags field in this packet to + automatically determine if the packet is marked as a unicode packet, + and they will choose whether to use unicode for this string based on + that flag. You may also force this decision using the STR_UNICODE or + STR_ASCII flags. For use in smbd/ and libsmb/ there are wrapper + functions clistr_ and srvstr_ that call the pull_/push_ functions + with the appropriate first argument. + </P +><P +> You may also call the pull_ascii/pull_ucs2 or push_ascii/push_ucs2 + functions if you know that a particular string is ascii or + unicode. There are also a number of other convenience functions in + charcnv.c that call the pull_/push_ functions with particularly + common arguments, such as pull_ascii_pstring() + </P +></LI +><LI +><P +> The biggest thing to remember is that internal (unix) strings in Samba + may now contain multi-byte characters. This means you cannot assume + that characters are always 1 byte long. Often this means that you will + have to convert strings to ucs2 and back again in order to do some + (seemingly) simple task. For examples of how to do this see functions + like strchr_m(). I know this is very slow, and we will eventually + speed it up but right now we want this stuff correct not fast.</P +></LI +><LI +><P +> all lp_ functions now return unix strings. The magic "DOS" flag on + parameters is gone.</P +></LI +><LI +><P +> all vfs functions take unix strings. Don't convert when passing to them</P +></LI +></OL +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN317">Macros in byteorder.h</H2 +><P +>This section describes the macros defined in byteorder.h. These macros +are used extensively in the Samba code.</P +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN320">CVAL(buf,pos)</H3 +><P +>returns the byte at offset pos within buffer buf as an unsigned character.</P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN323">PVAL(buf,pos)</H3 +><P +>returns the value of CVAL(buf,pos) cast to type unsigned integer.</P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN326">SCVAL(buf,pos,val)</H3 +><P +>sets the byte at offset pos within buffer buf to value val.</P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN329">SVAL(buf,pos)</H3 +><P +> returns the value of the unsigned short (16 bit) little-endian integer at + offset pos within buffer buf. An integer of this type is sometimes + refered to as "USHORT".</P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN332">IVAL(buf,pos)</H3 +><P +>returns the value of the unsigned 32 bit little-endian integer at offset +pos within buffer buf.</P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN335">SVALS(buf,pos)</H3 +><P +>returns the value of the signed short (16 bit) little-endian integer at +offset pos within buffer buf.</P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN338">IVALS(buf,pos)</H3 +><P +>returns the value of the signed 32 bit little-endian integer at offset pos +within buffer buf.</P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN341">SSVAL(buf,pos,val)</H3 +><P +>sets the unsigned short (16 bit) little-endian integer at offset pos within +buffer buf to value val.</P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN344">SIVAL(buf,pos,val)</H3 +><P +>sets the unsigned 32 bit little-endian integer at offset pos within buffer +buf to the value val.</P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN347">SSVALS(buf,pos,val)</H3 +><P +>sets the short (16 bit) signed little-endian integer at offset pos within +buffer buf to the value val.</P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN350">SIVALS(buf,pos,val)</H3 +><P +>sets the signed 32 bit little-endian integer at offset pos withing buffer +buf to the value val.</P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN353">RSVAL(buf,pos)</H3 +><P +>returns the value of the unsigned short (16 bit) big-endian integer at +offset pos within buffer buf.</P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN356">RIVAL(buf,pos)</H3 +><P +>returns the value of the unsigned 32 bit big-endian integer at offset +pos within buffer buf.</P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN359">RSSVAL(buf,pos,val)</H3 +><P +>sets the value of the unsigned short (16 bit) big-endian integer at +offset pos within buffer buf to value val. +refered to as "USHORT".</P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN362">RSIVAL(buf,pos,val)</H3 +><P +>sets the value of the unsigned 32 bit big-endian integer at offset +pos within buffer buf to value val.</P +></DIV +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN365">LAN Manager Samba API</H2 +><P +>This section describes the functions need to make a LAN Manager RPC call. +This information had been obtained by examining the Samba code and the LAN +Manager 2.0 API documentation. It should not be considered entirely +reliable.</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +>call_api(int prcnt, int drcnt, int mprcnt, int mdrcnt, + char *param, char *data, char **rparam, char **rdata);</PRE +></TD +></TR +></TABLE +></P +><P +>This function is defined in client.c. It uses an SMB transaction to call a +remote api.</P +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN371">Parameters</H3 +><P +>The parameters are as follows:</P +><P +></P +><OL +TYPE="1" +><LI +><P +> prcnt: the number of bytes of parameters begin sent.</P +></LI +><LI +><P +> drcnt: the number of bytes of data begin sent.</P +></LI +><LI +><P +> mprcnt: the maximum number of bytes of parameters which should be returned</P +></LI +><LI +><P +> mdrcnt: the maximum number of bytes of data which should be returned</P +></LI +><LI +><P +> param: a pointer to the parameters to be sent.</P +></LI +><LI +><P +> data: a pointer to the data to be sent.</P +></LI +><LI +><P +> rparam: a pointer to a pointer which will be set to point to the returned + paramters. The caller of call_api() must deallocate this memory.</P +></LI +><LI +><P +> rdata: a pointer to a pointer which will be set to point to the returned + data. The caller of call_api() must deallocate this memory.</P +></LI +></OL +><P +>These are the parameters which you ought to send, in the order of their +appearance in the parameter block:</P +><P +></P +><OL +TYPE="1" +><LI +><P +>An unsigned 16 bit integer API number. You should set this value with +SSVAL(). I do not know where these numbers are described.</P +></LI +><LI +><P +>An ASCIIZ string describing the parameters to the API function as defined +in the LAN Manager documentation. The first parameter, which is the server +name, is ommited. This string is based uppon the API function as described +in the manual, not the data which is actually passed.</P +></LI +><LI +><P +>An ASCIIZ string describing the data structure which ought to be returned.</P +></LI +><LI +><P +>Any parameters which appear in the function call, as defined in the LAN +Manager API documentation, after the "Server" and up to and including the +"uLevel" parameters.</P +></LI +><LI +><P +>An unsigned 16 bit integer which gives the size in bytes of the buffer we +will use to receive the returned array of data structures. Presumably this +should be the same as mdrcnt. This value should be set with SSVAL().</P +></LI +><LI +><P +>An ASCIIZ string describing substructures which should be returned. If no +substructures apply, this string is of zero length.</P +></LI +></OL +><P +>The code in client.c always calls call_api() with no data. It is unclear +when a non-zero length data buffer would be sent.</P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN406">Return value</H3 +><P +>The returned parameters (pointed to by rparam), in their order of appearance +are:</P +><P +></P +><OL +TYPE="1" +><LI +><P +>An unsigned 16 bit integer which contains the API function's return code. +This value should be read with SVAL().</P +></LI +><LI +><P +>An adjustment which tells the amount by which pointers in the returned +data should be adjusted. This value should be read with SVAL(). Basically, +the address of the start of the returned data buffer should have the returned +pointer value added to it and then have this value subtracted from it in +order to obtain the currect offset into the returned data buffer.</P +></LI +><LI +><P +>A count of the number of elements in the array of structures returned. +It is also possible that this may sometimes be the number of bytes returned.</P +></LI +></OL +><P +>When call_api() returns, rparam points to the returned parameters. The +first if these is the result code. It will be zero if the API call +suceeded. This value by be read with "SVAL(rparam,0)".</P +><P +>The second parameter may be read as "SVAL(rparam,2)". It is a 16 bit offset +which indicates what the base address of the returned data buffer was when +it was built on the server. It should be used to correct pointer before +use.</P +><P +>The returned data buffer contains the array of returned data structures. +Note that all pointers must be adjusted before use. The function +fix_char_ptr() in client.c can be used for this purpose.</P +><P +>The third parameter (which may be read as "SVAL(rparam,4)") has something to +do with indicating the amount of data returned or possibly the amount of +data which can be returned if enough buffer space is allowed.</P +></DIV +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN420">Code character table</H2 +><P +>Certain data structures are described by means of ASCIIz strings containing +code characters. These are the code characters:</P +><P +></P +><OL +TYPE="1" +><LI +><P +>W a type byte little-endian unsigned integer</P +></LI +><LI +><P +>N a count of substructures which follow</P +></LI +><LI +><P +>D a four byte little-endian unsigned integer</P +></LI +><LI +><P +>B a byte (with optional count expressed as trailing ASCII digits)</P +></LI +><LI +><P +>z a four byte offset to a NULL terminated string</P +></LI +><LI +><P +>l a four byte offset to non-string user data</P +></LI +><LI +><P +>b an offset to data (with count expressed as trailing ASCII digits)</P +></LI +><LI +><P +>r pointer to returned data buffer???</P +></LI +><LI +><P +>L length in bytes of returned data buffer???</P +></LI +><LI +><P +>h number of bytes of information available???</P +></LI +></OL +></DIV +></DIV +><DIV +CLASS="CHAPTER" +><HR><H1 +><A +NAME="PARSING">The smb.conf file</H1 +><DIV +CLASS="SECT1" +><H2 +CLASS="SECT1" +><A +NAME="AEN451">Lexical Analysis</H2 +><P +>Basically, the file is processed on a line by line basis. There are +four types of lines that are recognized by the lexical analyzer +(params.c):</P +><P +></P +><OL +TYPE="1" +><LI +><P +>Blank lines - Lines containing only whitespace.</P +></LI +><LI +><P +>Comment lines - Lines beginning with either a semi-colon or a +pound sign (';' or '#').</P +></LI +><LI +><P +>Section header lines - Lines beginning with an open square bracket ('[').</P +></LI +><LI +><P +>Parameter lines - Lines beginning with any other character. +(The default line type.)</P +></LI +></OL +><P +>The first two are handled exclusively by the lexical analyzer, which +ignores them. The latter two line types are scanned for</P +><P +></P +><OL +TYPE="1" +><LI +><P +> - Section names</P +></LI +><LI +><P +> - Parameter names</P +></LI +><LI +><P +> - Parameter values</P +></LI +></OL +><P +>These are the only tokens passed to the parameter loader +(loadparm.c). Parameter names and values are divided from one +another by an equal sign: '='.</P +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN472">Handling of Whitespace</H3 +><P +>Whitespace is defined as all characters recognized by the isspace() +function (see ctype(3C)) except for the newline character ('\n') +The newline is excluded because it identifies the end of the line.</P +><P +></P +><OL +TYPE="1" +><LI +><P +>The lexical analyzer scans past white space at the beginning of a line.</P +></LI +><LI +><P +>Section and parameter names may contain internal white space. All +whitespace within a name is compressed to a single space character. </P +></LI +><LI +><P +>Internal whitespace within a parameter value is kept verbatim with +the exception of carriage return characters ('\r'), all of which +are removed.</P +></LI +><LI +><P +>Leading and trailing whitespace is removed from names and values.</P +></LI +></OL +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN484">Handling of Line Continuation</H3 +><P +>Long section header and parameter lines may be extended across +multiple lines by use of the backslash character ('\\'). Line +continuation is ignored for blank and comment lines.</P +><P +>If the last (non-whitespace) character within a section header or on +a parameter line is a backslash, then the next line will be +(logically) concatonated with the current line by the lexical +analyzer. For example:</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> param name = parameter value string \ + with line continuation.</PRE +></TD +></TR +></TABLE +></P +><P +>Would be read as</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> param name = parameter value string with line continuation.</PRE +></TD +></TR +></TABLE +></P +><P +>Note that there are five spaces following the word 'string', +representing the one space between 'string' and '\\' in the top +line, plus the four preceeding the word 'with' in the second line. +(Yes, I'm counting the indentation.)</P +><P +>Line continuation characters are ignored on blank lines and at the end +of comments. They are *only* recognized within section and parameter +lines.</P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN495">Line Continuation Quirks</H3 +><P +>Note the following example:</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> param name = parameter value string \ + \ + with line continuation.</PRE +></TD +></TR +></TABLE +></P +><P +>The middle line is *not* parsed as a blank line because it is first +concatonated with the top line. The result is</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +>param name = parameter value string with line continuation.</PRE +></TD +></TR +></TABLE +></P +><P +>The same is true for comment lines.</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> param name = parameter value string \ + ; comment \ + with a comment.</PRE +></TD +></TR +></TABLE +></P +><P +>This becomes:</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +>param name = parameter value string ; comment with a comment.</PRE +></TD +></TR +></TABLE +></P +><P +>On a section header line, the closing bracket (']') is considered a +terminating character, and the rest of the line is ignored. The lines</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> [ section name ] garbage \ + param name = value</PRE +></TD +></TR +></TABLE +></P +><P +>are read as</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> [section name] + param name = value</PRE +></TD +></TR +></TABLE +></P +></DIV +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN515">Syntax</H2 +><P +>The syntax of the smb.conf file is as follows:</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> <file> :== { <section> } EOF + <section> :== <section header> { <parameter line> } + <section header> :== '[' NAME ']' + <parameter line> :== NAME '=' VALUE NL</PRE +></TD +></TR +></TABLE +></P +><P +>Basically, this means that</P +><P +></P +><OL +TYPE="1" +><LI +><P +> a file is made up of zero or more sections, and is terminated by + an EOF (we knew that).</P +></LI +><LI +><P +> A section is made up of a section header followed by zero or more + parameter lines.</P +></LI +><LI +><P +> A section header is identified by an opening bracket and + terminated by the closing bracket. The enclosed NAME identifies + the section.</P +></LI +><LI +><P +> A parameter line is divided into a NAME and a VALUE. The *first* + equal sign on the line separates the NAME from the VALUE. The + VALUE is terminated by a newline character (NL = '\n').</P +></LI +></OL +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN530">About params.c</H3 +><P +>The parsing of the config file is a bit unusual if you are used to +lex, yacc, bison, etc. Both lexical analysis (scanning) and parsing +are performed by params.c. Values are loaded via callbacks to +loadparm.c.</P +></DIV +></DIV +></DIV +><DIV +CLASS="CHAPTER" +><HR><H1 +><A +NAME="UNIX-SMB">NetBIOS in a Unix World</H1 +><DIV +CLASS="SECT1" +><H2 +CLASS="SECT1" +><A +NAME="AEN540">Introduction</H2 +><P +>This is a short document that describes some of the issues that +confront a SMB implementation on unix, and how Samba copes with +them. They may help people who are looking at unix<->PC +interoperability.</P +><P +>It was written to help out a person who was writing a paper on unix to +PC connectivity.</P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN544">Usernames</H2 +><P +>The SMB protocol has only a loose username concept. Early SMB +protocols (such as CORE and COREPLUS) have no username concept at +all. Even in later protocols clients often attempt operations +(particularly printer operations) without first validating a username +on the server.</P +><P +>Unix security is based around username/password pairs. A unix box +should not allow clients to do any substantive operation without some +sort of validation. </P +><P +>The problem mostly manifests itself when the unix server is in "share +level" security mode. This is the default mode as the alternative +"user level" security mode usually forces a client to connect to the +server as the same user for each connected share, which is +inconvenient in many sites.</P +><P +>In "share level" security the client normally gives a username in the +"session setup" protocol, but does not supply an accompanying +password. The client then connects to resources using the "tree +connect" protocol, and supplies a password. The problem is that the +user on the PC types the username and the password in different +contexts, unaware that they need to go together to give access to the +server. The username is normally the one the user typed in when they +"logged onto" the PC (this assumes Windows for Workgroups). The +password is the one they chose when connecting to the disk or printer.</P +><P +>The user often chooses a totally different username for their login as +for the drive connection. Often they also want to access different +drives as different usernames. The unix server needs some way of +divining the correct username to combine with each password.</P +><P +>Samba tries to avoid this problem using several methods. These succeed +in the vast majority of cases. The methods include username maps, the +service%user syntax, the saving of session setup usernames for later +validation and the derivation of the username from the service name +(either directly or via the user= option).</P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN552">File Ownership</H2 +><P +>The commonly used SMB protocols have no way of saying "you can't do +that because you don't own the file". They have, in fact, no concept +of file ownership at all.</P +><P +>This brings up all sorts of interesting problems. For example, when +you copy a file to a unix drive, and the file is world writeable but +owned by another user the file will transfer correctly but will +receive the wrong date. This is because the utime() call under unix +only succeeds for the owner of the file, or root, even if the file is +world writeable. For security reasons Samba does all file operations +as the validated user, not root, so the utime() fails. This can stuff +up shared development diectories as programs like "make" will not get +file time comparisons right.</P +><P +>There are several possible solutions to this problem, including +username mapping, and forcing a specific username for particular +shares.</P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN557">Passwords</H2 +><P +>Many SMB clients uppercase passwords before sending them. I have no +idea why they do this. Interestingly WfWg uppercases the password only +if the server is running a protocol greater than COREPLUS, so +obviously it isn't just the data entry routines that are to blame.</P +><P +>Unix passwords are case sensitive. So if users use mixed case +passwords they are in trouble.</P +><P +>Samba can try to cope with this by either using the "password level" +option which causes Samba to try the offered password with up to the +specified number of case changes, or by using the "password server" +option which allows Samba to do its validation via another machine +(typically a WinNT server).</P +><P +>Samba supports the password encryption method used by SMB +clients. Note that the use of password encryption in Microsoft +networking leads to password hashes that are "plain text equivalent". +This means that it is *VERY* important to ensure that the Samba +smbpasswd file containing these password hashes is only readable +by the root user. See the documentation ENCRYPTION.txt for more +details.</P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN563">Locking</H2 +><P +>The locking calls available under a DOS/Windows environment are much +richer than those available in unix. This means a unix server (like +Samba) choosing to use the standard fcntl() based unix locking calls +to implement SMB locking has to improvise a bit.</P +><P +>One major problem is that dos locks can be in a 32 bit (unsigned) +range. Unix locking calls are 32 bits, but are signed, giving only a 31 +bit range. Unfortunately OLE2 clients use the top bit to select a +locking range used for OLE semaphores.</P +><P +>To work around this problem Samba compresses the 32 bit range into 31 +bits by appropriate bit shifting. This seems to work but is not +ideal. In a future version a separate SMB lockd may be added to cope +with the problem.</P +><P +>It also doesn't help that many unix lockd daemons are very buggy and +crash at the slightest provocation. They normally go mostly unused in +a unix environment because few unix programs use byte range +locking. The stress of huge numbers of lock requests from dos/windows +clients can kill the daemon on some systems.</P +><P +>The second major problem is the "opportunistic locking" requested by +some clients. If a client requests opportunistic locking then it is +asking the server to notify it if anyone else tries to do something on +the same file, at which time the client will say if it is willing to +give up its lock. Unix has no simple way of implementing +opportunistic locking, and currently Samba has no support for it.</P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN570">Deny Modes</H2 +><P +>When a SMB client opens a file it asks for a particular "deny mode" to +be placed on the file. These modes (DENY_NONE, DENY_READ, DENY_WRITE, +DENY_ALL, DENY_FCB and DENY_DOS) specify what actions should be +allowed by anyone else who tries to use the file at the same time. If +DENY_READ is placed on the file, for example, then any attempt to open +the file for reading should fail.</P +><P +>Unix has no equivalent notion. To implement this Samba uses either lock +files based on the files inode and placed in a separate lock +directory or a shared memory implementation. The lock file method +is clumsy and consumes processing and file resources, +the shared memory implementation is vastly prefered and is turned on +by default for those systems that support it.</P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN574">Trapdoor UIDs</H2 +><P +>A SMB session can run with several uids on the one socket. This +happens when a user connects to two shares with different +usernames. To cope with this the unix server needs to switch uids +within the one process. On some unixes (such as SCO) this is not +possible. This means that on those unixes the client is restricted to +a single uid.</P +><P +>Note that you can also get the "trapdoor uid" message for other +reasons. Please see the FAQ for details.</P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN578">Port numbers</H2 +><P +>There is a convention that clients on sockets use high "unprivilaged" +port numbers (>1000) and connect to servers on low "privilaged" port +numbers. This is enforced in Unix as non-root users can't open a +socket for listening on port numbers less than 1000.</P +><P +>Most PC based SMB clients (such as WfWg and WinNT) don't follow this +convention completely. The main culprit is the netbios nameserving on +udp port 137. Name query requests come from a source port of 137. This +is a problem when you combine it with the common firewalling technique +of not allowing incoming packets on low port numbers. This means that +these clients can't query a netbios nameserver on the other side of a +low port based firewall.</P +><P +>The problem is more severe with netbios node status queries. I've +found that WfWg, Win95 and WinNT3.5 all respond to netbios node status +queries on port 137 no matter what the source port was in the +request. This works between machines that are both using port 137, but +it means it's not possible for a unix user to do a node status request +to any of these OSes unless they are running as root. The answer comes +back, but it goes to port 137 which the unix user can't listen +on. Interestingly WinNT3.1 got this right - it sends node status +responses back to the source port in the request.</P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN583">Protocol Complexity</H2 +><P +>There are many "protocol levels" in the SMB protocol. It seems that +each time new functionality was added to a Microsoft operating system, +they added the equivalent functions in a new protocol level of the SMB +protocol to "externalise" the new capabilities.</P +><P +>This means the protocol is very "rich", offering many ways of doing +each file operation. This means SMB servers need to be complex and +large. It also means it is very difficult to make them bug free. It is +not just Samba that suffers from this problem, other servers such as +WinNT don't support every variation of every call and it has almost +certainly been a headache for MS developers to support the myriad of +SMB calls that are available.</P +><P +>There are about 65 "top level" operations in the SMB protocol (things +like SMBread and SMBwrite). Some of these include hundreds of +sub-functions (SMBtrans has at least 120 sub-functions, like +DosPrintQAdd and NetSessionEnum). All of them take several options +that can change the way they work. Many take dozens of possible +"information levels" that change the structures that need to be +returned. Samba supports all but 2 of the "top level" functions. It +supports only 8 (so far) of the SMBtrans sub-functions. Even NT +doesn't support them all.</P +><P +>Samba currently supports up to the "NT LM 0.12" protocol, which is the +one preferred by Win95 and WinNT3.5. Luckily this protocol level has a +"capabilities" field which specifies which super-duper new-fangled +options the server suports. This helps to make the implementation of +this protocol level much easier.</P +><P +>There is also a problem with the SMB specications. SMB is a X/Open +spec, but the X/Open book is far from ideal, and fails to cover many +important issues, leaving much to the imagination. Microsoft recently +renamed the SMB protocol CIFS (Common Internet File System) and have +published new specifications. These are far superior to the old +X/Open documents but there are still undocumented calls and features. +This specification is actively being worked on by a CIFS developers +mailing list hosted by Microsft.</P +></DIV +></DIV +><DIV +CLASS="CHAPTER" +><HR><H1 +><A +NAME="TRACING">Tracing samba system calls</H1 +><P +>This file describes how to do a system call trace on Samba to work out +what its doing wrong. This is not for the faint of heart, but if you +are reading this then you are probably desperate.</P +><P +>Actually its not as bad as the the above makes it sound, just don't +expect the output to be very pretty :-)</P +><P +>Ok, down to business. One of the big advantages of unix systems is +that they nearly all come with a system trace utility that allows you +to monitor all system calls that a program is making. This is +extremely using for debugging and also helps when trying to work out +why something is slower than you expect. You can use system tracing +without any special compilation options. </P +><P +>The system trace utility is called different things on different +systems. On Linux systems its called strace. Under SunOS 4 its called +trace. Under SVR4 style systems (including solaris) its called +truss. Under many BSD systems its called ktrace. </P +><P +>The first thing you should do is read the man page for your native +system call tracer. In the discussion below I'll assume its called +strace as strace is the only portable system tracer (its available for +free for many unix types) and its also got some of the nicest +features.</P +><P +>Next, try using strace on some simple commands. For example, <B +CLASS="COMMAND" +>strace +ls</B +> or <B +CLASS="COMMAND" +>strace echo hello</B +>.</P +><P +> +You'll notice that it produces a LOT of output. It is showing you the +arguments to every system call that the program makes and the +result. Very little happens in a program without a system call so you +get lots of output. You'll also find that it produces a lot of +"preamble" stuff showing the loading of shared libraries etc. Ignore +this (unless its going wrong!)</P +><P +>For example, the only line that really matters in the <B +CLASS="COMMAND" +>strace echo +hello</B +> output is:</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +>write(1, "hello\n", 6) = 6</PRE +></TD +></TR +></TABLE +></P +><P +>all the rest is just setting up to run the program.</P +><P +>Ok, now you're familiar with strace. To use it on Samba you need to +strace the running smbd daemon. The way I tend ot use it is to first +login from my Windows PC to the Samba server, then use smbstatus to +find which process ID that client is attached to, then as root I do +<B +CLASS="COMMAND" +>strace -p PID</B +> to attach to that process. I normally redirect the +stderr output from this command to a file for later perusal. For +example, if I'm using a csh style shell:</P +><P +><B +CLASS="COMMAND" +>strace -f -p 3872 >& strace.out</B +></P +><P +>or with a sh style shell:</P +><P +><B +CLASS="COMMAND" +>strace -f -p 3872 > strace.out 2>&1</B +></P +><P +>Note the "-f" option. This is only available on some systems, and +allows you to trace not just the current process, but any children it +forks. This is great for finding printing problems caused by the +"print command" being wrong.</P +><P +>Once you are attached you then can do whatever it is on the client +that is causing problems and you will capture all the system calls +that smbd makes. </P +><P +>So how do you interpret the results? Generally I search through the +output for strings that I know will appear when the problem +happens. For example, if I am having touble with permissions on a file +I would search for that files name in the strace output and look at +the surrounding lines. Another trick is to match up file descriptor +numbers and "follow" what happens to an open file until it is closed.</P +><P +>Beyond this you will have to use your initiative. To give you an idea +of what you are looking for here is a piece of strace output that +shows that <TT +CLASS="FILENAME" +>/dev/null</TT +> is not world writeable, which +causes printing to fail with Samba:</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +>[pid 28268] open("/dev/null", O_RDWR) = -1 EACCES (Permission denied) +[pid 28268] open("/dev/null", O_WRONLY) = -1 EACCES (Permission denied)</PRE +></TD +></TR +></TABLE +></P +><P +>The process is trying to first open <TT +CLASS="FILENAME" +>/dev/null</TT +> read-write +then read-only. Both fail. This means <TT +CLASS="FILENAME" +>/dev/null</TT +> has +incorrect permissions.</P +></DIV +><DIV +CLASS="CHAPTER" +><HR><H1 +><A +NAME="NTDOMAIN">NT Domain RPC's</H1 +><DIV +CLASS="SECT1" +><H2 +CLASS="SECT1" +><A +NAME="AEN651">Introduction</H2 +><P +>This document contains information to provide an NT workstation with login +services, without the need for an NT server. It is the sgml version of <A +HREF="http://mailhost.cb1.com/~lkcl/cifsntdomain.txt" +TARGET="_top" +>http://mailhost.cb1.com/~lkcl/cifsntdomain.txt</A +>, controlled by Luke.</P +><P +>It should be possible to select a domain instead of a workgroup (in the NT +workstation's TCP/IP settings) and after the obligatory reboot, type in a +username, password, select a domain and successfully log in. I would +appreciate any feedback on your experiences with this process, and any +comments, corrections and additions to this document.</P +><P +>The packets described here can be easily derived from (and are probably +better understood using) Netmon.exe. You will need to use the version +of Netmon that matches your system, in order to correctly decode the +NETLOGON, lsarpc and srvsvc Transact pipes. This document is derived from +NT Service Pack 1 and its corresponding version of Netmon. It is intended +that an annotated packet trace be produced, which will likely be more +instructive than this document.</P +><P +>Also needed, to fully implement NT Domain Login Services, is the +document describing the cryptographic part of the NT authentication. +This document is available from comp.protocols.smb; from the ntsecurity.net +digest and from the samba digest, amongst other sources.</P +><P +>A copy is available from:</P +><P +><A +HREF="http://ntbugtraq.rc.on.ca/SCRIPTS/WA.EXE?A2=ind9708;L=ntbugtraq;O=A;P=2935" +TARGET="_top" +>http://ntbugtraq.rc.on.ca/SCRIPTS/WA.EXE?A2=ind9708;L=ntbugtraq;O=A;P=2935</A +></P +><P +><A +HREF="http://mailhost.cb1.com/~lkcl/crypt.html" +TARGET="_top" +>http://mailhost.cb1.com/~lkcl/crypt.html</A +></P +><P +>A c-code implementation, provided by <A +HREF="mailto:linus@incolumitas.se" +TARGET="_top" +>Linus Nordberg</A +> +of this protocol is available from:</P +><P +><A +HREF="http://samba.org/cgi-bin/mfs/01/digest/1997/97aug/0391.html" +TARGET="_top" +>http://samba.org/cgi-bin/mfs/01/digest/1997/97aug/0391.html</A +></P +><P +><A +HREF="http://mailhost.cb1.com/~lkcl/crypt.txt" +TARGET="_top" +>http://mailhost.cb1.com/~lkcl/crypt.txt</A +></P +><P +>Also used to provide debugging information is the Check Build version of +NT workstation, and enabling full debugging in NETLOGON. This is +achieved by setting the following REG_SZ registry key to 0x1ffffff:</P +><P +><TT +CLASS="FILENAME" +>HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters</TT +></P +><P +><I +CLASS="EMPHASIS" +>Incorrect direct editing of the registry can cause your +machine to fail. Then again, so can incorrect implementation of this +protocol. See "Liability:" above.</I +></P +><P +>Bear in mind that each packet over-the-wire will have its origin in an +API call. Therefore, there are likely to be structures, enumerations +and defines that are usefully documented elsewhere.</P +><P +>This document is by no means complete or authoritative. Missing sections +include, but are not limited to:</P +><P +></P +><OL +TYPE="1" +><LI +><P +>Mappings of RIDs to usernames (and vice-versa).</P +></LI +><LI +><P +>What a User ID is and what a Group ID is.</P +></LI +><LI +><P +>The exact meaning/definition of various magic constants or enumerations.</P +></LI +><LI +><P +>The reply error code and use of that error code when a +workstation becomes a member of a domain (to be described later). +Failure to return this error code will make the workstation report +that it is already a member of the domain.</P +></LI +><LI +><P +>the cryptographic side of the NetrServerPasswordSet command, +which would allow the workstation to change its password. This password is +used to generate the long-term session key. [It is possible to reject this +command, and keep the default workstation password].</P +></LI +></OL +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN687">Sources</H3 +><P +></P +><TABLE +BORDER="0" +><TBODY +><TR +><TD +>cket Traces from Netmonitor (Service Pack 1 and above)</TD +></TR +><TR +><TD +>ul Ashton and Luke Leighton's other "NT Domain" doc.</TD +></TR +><TR +><TD +>FS documentation - cifs6.txt</TD +></TR +><TR +><TD +>FS documentation - cifsrap2.txt</TD +></TR +></TBODY +></TABLE +><P +></P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN694">Credits</H3 +><P +></P +><TABLE +BORDER="0" +><TBODY +><TR +><TD +>Paul Ashton: loads of work with Net Monitor; understanding the NT authentication system; reference implementation of the NT domain support on which this document is originally based.</TD +></TR +><TR +><TD +>Duncan Stansfield: low-level analysis of MSRPC Pipes.</TD +></TR +><TR +><TD +>Linus Nordberg: producing c-code from Paul's crypto spec.</TD +></TR +><TR +><TD +>Windows Sourcer development team</TD +></TR +></TBODY +></TABLE +><P +></P +></DIV +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN701">Notes and Structures</H2 +><DIV +CLASS="SECT2" +><H3 +CLASS="SECT2" +><A +NAME="AEN703">Notes</H3 +><P +></P +><OL +TYPE="1" +><LI +><P +>In the SMB Transact pipes, some "Structures", described here, appear to be +4-byte aligned with the SMB header, at their start. Exactly which +"Structures" need aligning is not precisely known or documented.</P +></LI +><LI +><P +>In the UDP NTLOGON Mailslots, some "Structures", described here, appear to be +2-byte aligned with the start of the mailslot, at their start.</P +></LI +><LI +><P +>Domain SID is of the format S-revision-version-auth1-auth2...authN. +e.g S-1-5-123-456-789-123-456. the 5 could be a sub-revision.</P +></LI +><LI +><P +>any undocumented buffer pointers must be non-zero if the string buffer it +refers to contains characters. exactly what value they should be is unknown. +0x0000 0002 seems to do the trick to indicate that the buffer exists. a +NULL buffer pointer indicates that the string buffer is of zero length. +If the buffer pointer is NULL, then it is suspected that the structure it +refers to is NOT put into (or taken out of) the SMB data stream. This is +empirically derived from, for example, the LSA SAM Logon response packet, +where if the buffer pointer is NULL, the user information is not inserted +into the data stream. Exactly what happens with an array of buffer pointers +is not known, although an educated guess can be made.</P +></LI +><LI +><P +>an array of structures (a container) appears to have a count and a pointer. +if the count is zero, the pointer is also zero. no further data is put +into or taken out of the SMB data stream. if the count is non-zero, then +the pointer is also non-zero. immediately following the pointer is the +count again, followed by an array of container sub-structures. the count +appears a third time after the last sub-structure.</P +></LI +></OL +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN716">Enumerations</H3 +><DIV +CLASS="SECT3" +><H4 +CLASS="SECT3" +><A +NAME="AEN718">MSRPC Header type</H4 +><P +>command number in the msrpc packet header</P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>MSRPC_Request:</DT +><DD +><P +>0x00</P +></DD +><DT +>MSRPC_Response:</DT +><DD +><P +>0x02</P +></DD +><DT +>MSRPC_Bind:</DT +><DD +><P +>0x0B</P +></DD +><DT +>MSRPC_BindAck:</DT +><DD +><P +>0x0C</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN738">MSRPC Packet info</H4 +><P +>The meaning of these flags is undocumented</P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>FirstFrag:</DT +><DD +><P +>0x01 </P +></DD +><DT +>LastFrag:</DT +><DD +><P +>0x02 </P +></DD +><DT +>NotaFrag:</DT +><DD +><P +>0x04 </P +></DD +><DT +>RecRespond:</DT +><DD +><P +>0x08 </P +></DD +><DT +>NoMultiplex:</DT +><DD +><P +>0x10 </P +></DD +><DT +>NotForIdemp:</DT +><DD +><P +>0x20 </P +></DD +><DT +>NotforBcast:</DT +><DD +><P +>0x40 </P +></DD +><DT +>NoUuid:</DT +><DD +><P +>0x80 </P +></DD +></DL +></DIV +></DIV +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN774">Structures</H3 +><DIV +CLASS="SECT3" +><H4 +CLASS="SECT3" +><A +NAME="AEN776">VOID *</H4 +><P +>sizeof VOID* is 32 bits.</P +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN779">char</H4 +><P +>sizeof char is 8 bits.</P +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN782">UTIME</H4 +><P +>UTIME is 32 bits, indicating time in seconds since 01jan1970. documented in cifs6.txt (section 3.5 page, page 30).</P +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN785">NTTIME</H4 +><P +>NTTIME is 64 bits. documented in cifs6.txt (section 3.5 page, page 30).</P +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN788">DOM_SID (domain SID structure)</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT32</DT +><DD +><P +>num of sub-authorities in domain SID</P +></DD +><DT +>UINT8</DT +><DD +><P +>SID revision number</P +></DD +><DT +>UINT8</DT +><DD +><P +>num of sub-authorities in domain SID</P +></DD +><DT +>UINT8[6]</DT +><DD +><P +>6 bytes for domain SID - Identifier Authority.</P +></DD +><DT +>UINT16[n_subauths]</DT +><DD +><P +>domain SID sub-authorities</P +></DD +></DL +></DIV +><P +><I +CLASS="EMPHASIS" +>Note: the domain SID is documented elsewhere.</I +></P +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN813">STR (string)</H4 +><P +>STR (string) is a char[] : a null-terminated string of ascii characters.</P +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN816">UNIHDR (unicode string header)</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT16</DT +><DD +><P +>length of unicode string</P +></DD +><DT +>UINT16</DT +><DD +><P +>max length of unicode string</P +></DD +><DT +>UINT32</DT +><DD +><P +>4 - undocumented.</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN831">UNIHDR2 (unicode string header plus buffer pointer)</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UNIHDR</DT +><DD +><P +>unicode string header</P +></DD +><DT +>VOID*</DT +><DD +><P +>undocumented buffer pointer</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN842">UNISTR (unicode string)</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT16[]</DT +><DD +><P +>null-terminated string of unicode characters.</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN849">NAME (length-indicated unicode string)</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT32</DT +><DD +><P +>length of unicode string</P +></DD +><DT +>UINT16[]</DT +><DD +><P +>null-terminated string of unicode characters.</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN860">UNISTR2 (aligned unicode string)</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT8[]</DT +><DD +><P +>padding to get unicode string 4-byte aligned with the start of the SMB header.</P +></DD +><DT +>UINT32</DT +><DD +><P +>max length of unicode string</P +></DD +><DT +>UINT32</DT +><DD +><P +>0 - undocumented</P +></DD +><DT +>UINT32</DT +><DD +><P +>length of unicode string</P +></DD +><DT +>UINT16[]</DT +><DD +><P +>string of uncode characters</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN883">OBJ_ATTR (object attributes)</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT32</DT +><DD +><P +>0x18 - length (in bytes) including the length field.</P +></DD +><DT +>VOID*</DT +><DD +><P +>0 - root directory (pointer)</P +></DD +><DT +>VOID*</DT +><DD +><P +>0 - object name (pointer)</P +></DD +><DT +>UINT32</DT +><DD +><P +>0 - attributes (undocumented)</P +></DD +><DT +>VOID*</DT +><DD +><P +>0 - security descriptior (pointer)</P +></DD +><DT +>UINT32</DT +><DD +><P +>0 - security quality of service</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN910">POL_HND (LSA policy handle)</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>char[20]</DT +><DD +><P +>policy handle</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN917">DOM_SID2 (domain SID structure, SIDS stored in unicode)</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT32</DT +><DD +><P +>5 - SID type</P +></DD +><DT +>UINT32</DT +><DD +><P +>0 - undocumented</P +></DD +><DT +>UNIHDR2</DT +><DD +><P +>domain SID unicode string header</P +></DD +><DT +>UNISTR</DT +><DD +><P +>domain SID unicode string</P +></DD +></DL +></DIV +><P +><I +CLASS="EMPHASIS" +>Note: there is a conflict between the unicode string header and the unicode string itself as to which to use to indicate string length. this will need to be resolved.</I +></P +><P +><I +CLASS="EMPHASIS" +>Note: the SID type indicates, for example, an alias; a well-known group etc. this is documented somewhere.</I +></P +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN940">DOM_RID (domain RID structure)</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT32</DT +><DD +><P +>5 - well-known SID. 1 - user SID (see ShowACLs)</P +></DD +><DT +>UINT32</DT +><DD +><P +>5 - undocumented</P +></DD +><DT +>UINT32</DT +><DD +><P +>domain RID </P +></DD +><DT +>UINT32</DT +><DD +><P +>0 - domain index out of above reference domains</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN959">LOG_INFO (server, account, client structure)</H4 +><P +><I +CLASS="EMPHASIS" +>Note: logon server name starts with two '\' characters and is upper case.</I +></P +><P +><I +CLASS="EMPHASIS" +>Note: account name is the logon client name from the LSA Request Challenge, with a $ on the end of it, in upper case.</I +></P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>VOID*</DT +><DD +><P +>undocumented buffer pointer</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>logon server unicode string</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>account name unicode string</P +></DD +><DT +>UINT16</DT +><DD +><P +>sec_chan - security channel type</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>logon client machine unicode string</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN986">CLNT_SRV (server, client names structure)</H4 +><P +><I +CLASS="EMPHASIS" +>Note: logon server name starts with two '\' characters and is upper case.</I +></P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>VOID*</DT +><DD +><P +>undocumented buffer pointer</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>logon server unicode string</P +></DD +><DT +>VOID*</DT +><DD +><P +>undocumented buffer pointer</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>logon client machine unicode string</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1007">CREDS (credentials + time stamp)</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>char[8]</DT +><DD +><P +>credentials</P +></DD +><DT +>UTIME</DT +><DD +><P +>time stamp</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1018">CLNT_INFO2 (server, client structure, client credentials)</H4 +><P +><I +CLASS="EMPHASIS" +>Note: whenever this structure appears in a request, you must take a copy of the client-calculated credentials received, because they will beused in subsequent credential checks. the presumed intention is to + maintain an authenticated request/response trail.</I +></P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>CLNT_SRV</DT +><DD +><P +>client and server names</P +></DD +><DT +>UINT8[]</DT +><DD +><P +>???? padding, for 4-byte alignment with SMB header.</P +></DD +><DT +>VOID*</DT +><DD +><P +>pointer to client credentials.</P +></DD +><DT +>CREDS</DT +><DD +><P +>client-calculated credentials + client time</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1039">CLNT_INFO (server, account, client structure, client credentials)</H4 +><P +><I +CLASS="EMPHASIS" +>Note: whenever this structure appears in a request, you must take a copy of the client-calculated credentials received, because they will be used in subsequent credential checks. the presumed intention is to maintain an authenticated request/response trail.</I +></P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>LOG_INFO</DT +><DD +><P +>logon account info</P +></DD +><DT +>CREDS</DT +><DD +><P +>client-calculated credentials + client time</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1052">ID_INFO_1 (id info structure, auth level 1)</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>VOID*</DT +><DD +><P +>ptr_id_info_1</P +></DD +><DT +>UNIHDR</DT +><DD +><P +>domain name unicode header</P +></DD +><DT +>UINT32</DT +><DD +><P +>param control</P +></DD +><DT +>UINT64</DT +><DD +><P +>logon ID</P +></DD +><DT +>UNIHDR</DT +><DD +><P +>user name unicode header</P +></DD +><DT +>UNIHDR</DT +><DD +><P +>workgroup name unicode header</P +></DD +><DT +>char[16]</DT +><DD +><P +>arc4 LM OWF Password</P +></DD +><DT +>char[16]</DT +><DD +><P +>arc4 NT OWF Password</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>domain name unicode string</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>user name unicode string</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>workstation name unicode string</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1099">SAM_INFO (sam logon/logoff id info structure)</H4 +><P +><I +CLASS="EMPHASIS" +>Note: presumably, the return credentials is supposedly for the server to verify that the credential chain hasn't been compromised.</I +></P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>CLNT_INFO2</DT +><DD +><P +>client identification/authentication info</P +></DD +><DT +>VOID*</DT +><DD +><P +>pointer to return credentials.</P +></DD +><DT +>CRED</DT +><DD +><P +>return credentials - ignored.</P +></DD +><DT +>UINT16</DT +><DD +><P +>logon level</P +></DD +><DT +>UINT16</DT +><DD +><P +>switch value</P +></DD +></DL +></DIV +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> switch (switch_value) + case 1: + { + ID_INFO_1 id_info_1; + }</PRE +></TD +></TR +></TABLE +></P +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1126">GID (group id info)</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT32</DT +><DD +><P +>group id</P +></DD +><DT +>UINT32</DT +><DD +><P +>user attributes (only used by NT 3.1 and 3.51)</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1137">DOM_REF (domain reference info)</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>VOID*</DT +><DD +><P +>undocumented buffer pointer.</P +></DD +><DT +>UINT32</DT +><DD +><P +>num referenced domains?</P +></DD +><DT +>VOID*</DT +><DD +><P +>undocumented domain name buffer pointer.</P +></DD +><DT +>UINT32</DT +><DD +><P +>32 - max number of entries</P +></DD +><DT +>UINT32</DT +><DD +><P +>4 - num referenced domains?</P +></DD +><DT +>UNIHDR2</DT +><DD +><P +>domain name unicode string header</P +></DD +><DT +>UNIHDR2[num_ref_doms-1]</DT +><DD +><P +>referenced domain unicode string headers</P +></DD +><DT +>UNISTR</DT +><DD +><P +>domain name unicode string</P +></DD +><DT +>DOM_SID[num_ref_doms]</DT +><DD +><P +>referenced domain SIDs</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1176">DOM_INFO (domain info, levels 3 and 5 are the same))</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT8[]</DT +><DD +><P +>??? padding to get 4-byte alignment with start of SMB header</P +></DD +><DT +>UINT16</DT +><DD +><P +>domain name string length * 2</P +></DD +><DT +>UINT16</DT +><DD +><P +>domain name string length * 2</P +></DD +><DT +>VOID*</DT +><DD +><P +>undocumented domain name string buffer pointer</P +></DD +><DT +>VOID*</DT +><DD +><P +>undocumented domain SID string buffer pointer</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>domain name (unicode string)</P +></DD +><DT +>DOM_SID</DT +><DD +><P +>domain SID</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1207">USER_INFO (user logon info)</H4 +><P +><I +CLASS="EMPHASIS" +>Note: it would be nice to know what the 16 byte user session key is for.</I +></P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>NTTIME</DT +><DD +><P +>logon time</P +></DD +><DT +>NTTIME</DT +><DD +><P +>logoff time</P +></DD +><DT +>NTTIME</DT +><DD +><P +>kickoff time</P +></DD +><DT +>NTTIME</DT +><DD +><P +>password last set time</P +></DD +><DT +>NTTIME</DT +><DD +><P +>password can change time</P +></DD +><DT +>NTTIME</DT +><DD +><P +>password must change time</P +></DD +><DT +>UNIHDR</DT +><DD +><P +>username unicode string header</P +></DD +><DT +>UNIHDR</DT +><DD +><P +>user's full name unicode string header</P +></DD +><DT +>UNIHDR</DT +><DD +><P +>logon script unicode string header</P +></DD +><DT +>UNIHDR</DT +><DD +><P +>profile path unicode string header</P +></DD +><DT +>UNIHDR</DT +><DD +><P +>home directory unicode string header</P +></DD +><DT +>UNIHDR</DT +><DD +><P +>home directory drive unicode string header</P +></DD +><DT +>UINT16</DT +><DD +><P +>logon count</P +></DD +><DT +>UINT16</DT +><DD +><P +>bad password count</P +></DD +><DT +>UINT32</DT +><DD +><P +>User ID</P +></DD +><DT +>UINT32</DT +><DD +><P +>Group ID</P +></DD +><DT +>UINT32</DT +><DD +><P +>num groups</P +></DD +><DT +>VOID*</DT +><DD +><P +>undocumented buffer pointer to groups.</P +></DD +><DT +>UINT32</DT +><DD +><P +>user flags</P +></DD +><DT +>char[16]</DT +><DD +><P +>user session key</P +></DD +><DT +>UNIHDR</DT +><DD +><P +>logon server unicode string header</P +></DD +><DT +>UNIHDR</DT +><DD +><P +>logon domain unicode string header</P +></DD +><DT +>VOID*</DT +><DD +><P +>undocumented logon domain id pointer</P +></DD +><DT +>char[40]</DT +><DD +><P +>40 undocumented padding bytes. future expansion?</P +></DD +><DT +>UINT32</DT +><DD +><P +>0 - num_other_sids?</P +></DD +><DT +>VOID*</DT +><DD +><P +>NULL - undocumented pointer to other domain SIDs.</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>username unicode string</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>user's full name unicode string</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>logon script unicode string</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>profile path unicode string</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>home directory unicode string</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>home directory drive unicode string</P +></DD +><DT +>UINT32</DT +><DD +><P +>num groups</P +></DD +><DT +>GID[num_groups]</DT +><DD +><P +>group info</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>logon server unicode string</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>logon domain unicode string</P +></DD +><DT +>DOM_SID</DT +><DD +><P +>domain SID</P +></DD +><DT +>DOM_SID[num_sids]</DT +><DD +><P +>other domain SIDs?</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1364">SH_INFO_1_PTR (pointers to level 1 share info strings)</H4 +><P +><I +CLASS="EMPHASIS" +>Note: see cifsrap2.txt section5, page 10.</I +></P +><P +></P +><TABLE +BORDER="0" +><TBODY +><TR +><TD +>0 for shi1_type indicates a Disk.</TD +></TR +><TR +><TD +>1 for shi1_type indicates a Print Queue.</TD +></TR +><TR +><TD +>2 for shi1_type indicates a Device.</TD +></TR +><TR +><TD +>3 for shi1_type indicates an IPC pipe.</TD +></TR +><TR +><TD +>0x8000 0000 (top bit set in shi1_type) indicates a hidden share.</TD +></TR +></TBODY +></TABLE +><P +></P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>VOID*</DT +><DD +><P +>shi1_netname - pointer to net name</P +></DD +><DT +>UINT32</DT +><DD +><P +>shi1_type - type of share. 0 - undocumented.</P +></DD +><DT +>VOID*</DT +><DD +><P +>shi1_remark - pointer to comment.</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1387">SH_INFO_1_STR (level 1 share info strings)</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UNISTR2</DT +><DD +><P +>shi1_netname - unicode string of net name</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>shi1_remark - unicode string of comment.</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1398">SHARE_INFO_1_CTR</H4 +><P +>share container with 0 entries:</P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT32</DT +><DD +><P +>0 - EntriesRead</P +></DD +><DT +>UINT32</DT +><DD +><P +>0 - Buffer</P +></DD +></DL +></DIV +><P +>share container with > 0 entries:</P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT32</DT +><DD +><P +>EntriesRead</P +></DD +><DT +>UINT32</DT +><DD +><P +>non-zero - Buffer</P +></DD +><DT +>UINT32</DT +><DD +><P +>EntriesRead</P +></DD +><DT +>SH_INFO_1_PTR[EntriesRead]</DT +><DD +><P +>share entry pointers</P +></DD +><DT +>SH_INFO_1_STR[EntriesRead]</DT +><DD +><P +>share entry strings</P +></DD +><DT +>UINT8[]</DT +><DD +><P +>padding to get unicode string 4-byte aligned with start of the SMB header.</P +></DD +><DT +>UINT32</DT +><DD +><P +>EntriesRead</P +></DD +><DT +>UINT32</DT +><DD +><P +>0 - padding</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1444">SERVER_INFO_101</H4 +><P +><I +CLASS="EMPHASIS" +>Note: see cifs6.txt section 6.4 - the fields described therein will be of assistance here. for example, the type listed below is the same as fServerType, which is described in 6.4.1. </I +></P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>SV_TYPE_WORKSTATION</DT +><DD +><P +>0x00000001 All workstations</P +></DD +><DT +>SV_TYPE_SERVER</DT +><DD +><P +>0x00000002 All servers</P +></DD +><DT +>SV_TYPE_SQLSERVER</DT +><DD +><P +>0x00000004 Any server running with SQL server</P +></DD +><DT +>SV_TYPE_DOMAIN_CTRL</DT +><DD +><P +>0x00000008 Primary domain controller</P +></DD +><DT +>SV_TYPE_DOMAIN_BAKCTRL</DT +><DD +><P +>0x00000010 Backup domain controller</P +></DD +><DT +>SV_TYPE_TIME_SOURCE</DT +><DD +><P +>0x00000020 Server running the timesource service</P +></DD +><DT +>SV_TYPE_AFP</DT +><DD +><P +>0x00000040 Apple File Protocol servers</P +></DD +><DT +>SV_TYPE_NOVELL</DT +><DD +><P +>0x00000080 Novell servers</P +></DD +><DT +>SV_TYPE_DOMAIN_MEMBER</DT +><DD +><P +>0x00000100 Domain Member</P +></DD +><DT +>SV_TYPE_PRINTQ_SERVER</DT +><DD +><P +>0x00000200 Server sharing print queue</P +></DD +><DT +>SV_TYPE_DIALIN_SERVER</DT +><DD +><P +>0x00000400 Server running dialin service.</P +></DD +><DT +>SV_TYPE_XENIX_SERVER</DT +><DD +><P +>0x00000800 Xenix server</P +></DD +><DT +>SV_TYPE_NT</DT +><DD +><P +>0x00001000 NT server</P +></DD +><DT +>SV_TYPE_WFW</DT +><DD +><P +>0x00002000 Server running Windows for </P +></DD +><DT +>SV_TYPE_SERVER_NT</DT +><DD +><P +>0x00008000 Windows NT non DC server</P +></DD +><DT +>SV_TYPE_POTENTIAL_BROWSER</DT +><DD +><P +>0x00010000 Server that can run the browser service</P +></DD +><DT +>SV_TYPE_BACKUP_BROWSER</DT +><DD +><P +>0x00020000 Backup browser server</P +></DD +><DT +>SV_TYPE_MASTER_BROWSER</DT +><DD +><P +>0x00040000 Master browser server</P +></DD +><DT +>SV_TYPE_DOMAIN_MASTER</DT +><DD +><P +>0x00080000 Domain Master Browser server</P +></DD +><DT +>SV_TYPE_LOCAL_LIST_ONLY</DT +><DD +><P +>0x40000000 Enumerate only entries marked "local"</P +></DD +><DT +>SV_TYPE_DOMAIN_ENUM</DT +><DD +><P +>0x80000000 Enumerate Domains. The pszServer and pszDomain parameters must be NULL.</P +></DD +></DL +></DIV +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT32</DT +><DD +><P +>500 - platform_id</P +></DD +><DT +>VOID*</DT +><DD +><P +>pointer to name</P +></DD +><DT +>UINT32</DT +><DD +><P +>5 - major version</P +></DD +><DT +>UINT32</DT +><DD +><P +>4 - minor version</P +></DD +><DT +>UINT32</DT +><DD +><P +>type (SV_TYPE_... bit field)</P +></DD +><DT +>VOID*</DT +><DD +><P +>pointer to comment</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>sv101_name - unicode string of server name</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>sv_101_comment - unicode string of server comment.</P +></DD +><DT +>UINT8[]</DT +><DD +><P +>padding to get unicode string 4-byte aligned with start of the SMB header.</P +></DD +></DL +></DIV +></DIV +></DIV +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN1570">MSRPC over Transact Named Pipe</H2 +><P +>For details on the SMB Transact Named Pipe, see cifs6.txt</P +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN1573">MSRPC Pipes</H3 +><P +>The MSRPC is conducted over an SMB Transact Pipe with a name of +<TT +CLASS="FILENAME" +>\PIPE\</TT +>. You must first obtain a 16 bit file handle, by +sending a SMBopenX with the pipe name <TT +CLASS="FILENAME" +>\PIPE\srvsvc</TT +> for +example. You can then perform an SMB Trans, +and must carry out an SMBclose on the file handle once you are finished.</P +><P +>Trans Requests must be sent with two setup UINT16s, no UINT16 params (none +known about), and UINT8 data parameters sufficient to contain the MSRPC +header, and MSRPC data. The first UINT16 setup parameter must be either +0x0026 to indicate an RPC, or 0x0001 to indicate Set Named Pipe Handle +state. The second UINT16 parameter must be the file handle for the pipe, +obtained above.</P +><P +>The Data section for an API Command of 0x0026 (RPC pipe) in the Trans +Request is the RPC Header, followed by the RPC Data. The Data section for +an API Command of 0x0001 (Set Named Pipe Handle state) is two bytes. The +only value seen for these two bytes is 0x00 0x43.</P +><P +>MSRPC Responses are sent as response data inside standard SMB Trans +responses, with the MSRPC Header, MSRPC Data and MSRPC tail.</P +><P +>It is suspected that the Trans Requests will need to be at least 2-byte +aligned (probably 4-byte). This is standard practice for SMBs. It is also +independent of the observed 4-byte alignments with the start of the MSRPC +header, including the 4-byte alignment between the MSRPC header and the +MSRPC data.</P +><P +>First, an SMBtconX connection is made to the IPC$ share. The connection +must be made using encrypted passwords, not clear-text. Then, an SMBopenX +is made on the pipe. Then, a Set Named Pipe Handle State must be sent, +after which the pipe is ready to accept API commands. Lastly, and SMBclose +is sent.</P +><P +>To be resolved:</P +><P +>lkcl/01nov97 there appear to be two additional bytes after the null-terminated \PIPE\ name for the RPC pipe. Values seen so far are +listed below:</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> initial SMBopenX request: RPC API command 0x26 params: + "\\PIPE\\lsarpc" 0x65 0x63; 0x72 0x70; 0x44 0x65; + "\\PIPE\\srvsvc" 0x73 0x76; 0x4E 0x00; 0x5C 0x43;</PRE +></TD +></TR +></TABLE +></P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN1587">Header</H3 +><P +>[section to be rewritten, following receipt of work by Duncan Stansfield]</P +><P +>Interesting note: if you set packed data representation to 0x0100 0000 +then all 4-byte and 2-byte word ordering is turned around!</P +><P +>The start of each of the NTLSA and NETLOGON named pipes begins with:</P +><P +><B +>offset: </B +>00</P +><P +><B +>Variable type: </B +>UINT8</P +><P +><B +>Variable data: </B +>5 - RPC major version</P +><P +><B +>offset: </B +>01</P +><P +><B +>Variable type: </B +>UINT8</P +><P +><B +>Variable data: </B +>0 - RPC minor version</P +><P +><B +>offset: </B +>02</P +><P +><B +>Variable type: </B +>UINT8</P +><P +><B +>Variable data: </B +>2 - RPC response packet</P +><P +><B +>offset: </B +>03</P +><P +><B +>Variable type: </B +>UINT8</P +><P +><B +>Variable data: </B +>3 - (FirstFrag bit-wise or with LastFrag)</P +><P +><B +>offset: </B +>04</P +><P +><B +>Variable type: </B +>UINT32</P +><P +><B +>Variable data: </B +>0x1000 0000 - packed data representation</P +><P +><B +>offset: </B +>08</P +><P +><B +>Variable type: </B +>UINT16</P +><P +><B +>Variable data: </B +>fragment length - data size (bytes) inc header and tail.</P +><P +><B +>offset: </B +>0A</P +><P +><B +>Variable type: </B +>UINT16</P +><P +><B +>Variable data: </B +>0 - authentication length </P +><P +><B +>offset: </B +>0C</P +><P +><B +>Variable type: </B +>UINT32</P +><P +><B +>Variable data: </B +>call identifier. matches 12th UINT32 of incoming RPC data.</P +><P +><B +>offset: </B +>10</P +><P +><B +>Variable type: </B +>UINT32</P +><P +><B +>Variable data: </B +>allocation hint - data size (bytes) minus header and tail.</P +><P +><B +>offset: </B +>14</P +><P +><B +>Variable type: </B +>UINT16</P +><P +><B +>Variable data: </B +>0 - presentation context identifier</P +><P +><B +>offset: </B +>16</P +><P +><B +>Variable type: </B +>UINT8</P +><P +><B +>Variable data: </B +>0 - cancel count</P +><P +><B +>offset: </B +>17</P +><P +><B +>Variable type: </B +>UINT8</P +><P +><B +>Variable data: </B +>in replies: 0 - reserved; in requests: opnum - see #defines.</P +><P +><B +>offset: </B +>18</P +><P +><B +>Variable type: </B +>......</P +><P +><B +>Variable data: </B +>start of data (goes on for allocation_hint bytes)</P +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1648">RPC_Packet for request, response, bind and bind acknowledgement</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT8 versionmaj</DT +><DD +><P +>reply same as request (0x05)</P +></DD +><DT +>UINT8 versionmin</DT +><DD +><P +>reply same as request (0x00)</P +></DD +><DT +>UINT8 type</DT +><DD +><P +>one of the MSRPC_Type enums</P +></DD +><DT +>UINT8 flags</DT +><DD +><P +>reply same as request (0x00 for Bind, 0x03 for Request)</P +></DD +><DT +>UINT32 representation</DT +><DD +><P +>reply same as request (0x00000010)</P +></DD +><DT +>UINT16 fraglength</DT +><DD +><P +>the length of the data section of the SMB trans packet</P +></DD +><DT +>UINT16 authlength</DT +><DD +><P +></P +></DD +><DT +>UINT32 callid</DT +><DD +><P +>call identifier. (e.g. 0x00149594)</P +></DD +><DT +>* stub USE TvPacket</DT +><DD +><P +>the remainder of the packet depending on the "type"</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1687">Interface identification</H4 +><P +>the interfaces are numbered. as yet I haven't seen more than one interface used on the same pipe name srvsvc</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +>abstract (0x4B324FC8, 0x01D31670, 0x475A7812, 0x88E16EBF, 0x00000003) +transfer (0x8A885D04, 0x11C91CEB, 0x0008E89F, 0x6048102B, 0x00000002)</PRE +></TD +></TR +></TABLE +></P +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1692">RPC_Iface RW</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT8 byte[16]</DT +><DD +><P +>16 bytes of number</P +></DD +><DT +>UINT32 version</DT +><DD +><P +>the interface number</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1703">RPC_ReqBind RW</H4 +><P +>the remainder of the packet after the header if "type" was Bind in the response header, "type" should be BindAck</P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT16 maxtsize</DT +><DD +><P +>maximum transmission fragment size (0x1630)</P +></DD +><DT +>UINT16 maxrsize</DT +><DD +><P +>max receive fragment size (0x1630)</P +></DD +><DT +>UINT32 assocgid</DT +><DD +><P +>associated group id (0x0)</P +></DD +><DT +>UINT32 numelements</DT +><DD +><P +>the number of elements (0x1)</P +></DD +><DT +>UINT16 contextid</DT +><DD +><P +>presentation context identifier (0x0)</P +></DD +><DT +>UINT8 numsyntaxes</DT +><DD +><P +>the number of syntaxes (has always been 1?)(0x1)</P +></DD +><DT +>UINT8[]</DT +><DD +><P +>4-byte alignment padding, against SMB header</P +></DD +><DT +>* abstractint USE RPC_Iface</DT +><DD +><P +>num and vers. of interface client is using</P +></DD +><DT +>* transferint USE RPC_Iface</DT +><DD +><P +>num and vers. of interface to use for replies</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1743">RPC_Address RW</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT16 length</DT +><DD +><P +>length of the string including null terminator</P +></DD +><DT +>* port USE string</DT +><DD +><P +>the string above in single byte, null terminated form</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1754">RPC_ResBind RW</H4 +><P +>the response to place after the header in the reply packet</P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT16 maxtsize</DT +><DD +><P +>same as request</P +></DD +><DT +>UINT16 maxrsize</DT +><DD +><P +>same as request</P +></DD +><DT +>UINT32 assocgid</DT +><DD +><P +>zero</P +></DD +><DT +>* secondaddr USE RPC_Address</DT +><DD +><P +>the address string, as described earlier</P +></DD +><DT +>UINT8[]</DT +><DD +><P +>4-byte alignment padding, against SMB header</P +></DD +><DT +>UINT8 numresults</DT +><DD +><P +>the number of results (0x01)</P +></DD +><DT +>UINT8[]</DT +><DD +><P +>4-byte alignment padding, against SMB header</P +></DD +><DT +>UINT16 result</DT +><DD +><P +>result (0x00 = accept)</P +></DD +><DT +>UINT16 reason</DT +><DD +><P +>reason (0x00 = no reason specified)</P +></DD +><DT +>* transfersyntax USE RPC_Iface</DT +><DD +><P +>the transfer syntax from the request</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1798">RPC_ReqNorm RW</H4 +><P +>the remainder of the packet after the header for every other other request</P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT32 allochint</DT +><DD +><P +>the size of the stub data in bytes</P +></DD +><DT +>UINT16 prescontext</DT +><DD +><P +>presentation context identifier (0x0)</P +></DD +><DT +>UINT16 opnum</DT +><DD +><P +>operation number (0x15)</P +></DD +><DT +>* stub USE TvPacket</DT +><DD +><P +>a packet dependent on the pipe name (probably the interface) and the op number)</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1818">RPC_ResNorm RW</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT32 allochint</DT +><DD +><P +># size of the stub data in bytes</P +></DD +><DT +>UINT16 prescontext</DT +><DD +><P +># presentation context identifier (same as request)</P +></DD +><DT +>UINT8 cancelcount</DT +><DD +><P +># cancel count? (0x0)</P +></DD +><DT +>UINT8 reserved</DT +><DD +><P +># 0 - one byte padding</P +></DD +><DT +>* stub USE TvPacket</DT +><DD +><P +># the remainder of the reply</P +></DD +></DL +></DIV +></DIV +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN1841">Tail</H3 +><P +>The end of each of the NTLSA and NETLOGON named pipes ends with:</P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>......</DT +><DD +><P +>end of data</P +></DD +><DT +>UINT32</DT +><DD +><P +>return code</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN1853">RPC Bind / Bind Ack</H3 +><P +>RPC Binds are the process of associating an RPC pipe (e.g \PIPE\lsarpc) +with a "transfer syntax" (see RPC_Iface structure). The purpose for doing +this is unknown.</P +><P +><I +CLASS="EMPHASIS" +>Note: The RPC_ResBind SMB Transact request is sent with two uint16 setup parameters. The first is 0x0026; the second is the file handle + returned by the SMBopenX Transact response.</I +></P +><P +><I +CLASS="EMPHASIS" +>Note: The RPC_ResBind members maxtsize, maxrsize and assocgid are the same in the response as the same members in the RPC_ReqBind. The + RPC_ResBind member transfersyntax is the same in the response as + the</I +></P +><P +><I +CLASS="EMPHASIS" +>Note: The RPC_ResBind response member secondaddr contains the name of what is presumed to be the service behind the RPC pipe. The + mapping identified so far is:</I +></P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>initial SMBopenX request:</DT +><DD +><P +>RPC_ResBind response:</P +></DD +><DT +>"\\PIPE\\srvsvc"</DT +><DD +><P +>"\\PIPE\\ntsvcs"</P +></DD +><DT +>"\\PIPE\\samr"</DT +><DD +><P +>"\\PIPE\\lsass"</P +></DD +><DT +>"\\PIPE\\lsarpc"</DT +><DD +><P +>"\\PIPE\\lsass"</P +></DD +><DT +>"\\PIPE\\wkssvc"</DT +><DD +><P +>"\\PIPE\\wksvcs"</P +></DD +><DT +>"\\PIPE\\NETLOGON"</DT +><DD +><P +>"\\PIPE\\NETLOGON"</P +></DD +></DL +></DIV +><P +><I +CLASS="EMPHASIS" +>Note: The RPC_Packet fraglength member in both the Bind Request and Bind Acknowledgment must contain the length of the entire RPC data, including the RPC_Packet header.</I +></P +><P +>Request:</P +><P +></P +><TABLE +BORDER="0" +><TBODY +><TR +><TD +>RPC_Packet</TD +></TR +><TR +><TD +>RPC_ReqBind</TD +></TR +></TBODY +></TABLE +><P +></P +><P +>Response:</P +><P +></P +><TABLE +BORDER="0" +><TBODY +><TR +><TD +>RPC_Packet</TD +></TR +><TR +><TD +>RPC_ResBind</TD +></TR +></TBODY +></TABLE +><P +></P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN1897">NTLSA Transact Named Pipe</H3 +><P +>The sequence of actions taken on this pipe are:</P +><P +></P +><TABLE +BORDER="0" +><TBODY +><TR +><TD +>Establish a connection to the IPC$ share (SMBtconX). use encrypted passwords.</TD +></TR +><TR +><TD +>Open an RPC Pipe with the name "\\PIPE\\lsarpc". Store the file handle.</TD +></TR +><TR +><TD +>Using the file handle, send a Set Named Pipe Handle state to 0x4300.</TD +></TR +><TR +><TD +>Send an LSA Open Policy request. Store the Policy Handle.</TD +></TR +><TR +><TD +>Using the Policy Handle, send LSA Query Info Policy requests, etc.</TD +></TR +><TR +><TD +>Using the Policy Handle, send an LSA Close.</TD +></TR +><TR +><TD +>Close the IPC$ share.</TD +></TR +></TBODY +></TABLE +><P +></P +><P +>Defines for this pipe, identifying the query are:</P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>LSA Open Policy:</DT +><DD +><P +>0x2c</P +></DD +><DT +>LSA Query Info Policy:</DT +><DD +><P +>0x07</P +></DD +><DT +>LSA Enumerate Trusted Domains:</DT +><DD +><P +>0x0d</P +></DD +><DT +>LSA Open Secret:</DT +><DD +><P +>0xff</P +></DD +><DT +>LSA Lookup SIDs:</DT +><DD +><P +>0xfe</P +></DD +><DT +>LSA Lookup Names:</DT +><DD +><P +>0xfd</P +></DD +><DT +>LSA Close:</DT +><DD +><P +>0x00</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN1938">LSA Open Policy</H3 +><P +><I +CLASS="EMPHASIS" +>Note: The policy handle can be anything you like.</I +></P +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1942">Request</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>VOID*</DT +><DD +><P +>buffer pointer</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>server name - unicode string starting with two '\'s</P +></DD +><DT +>OBJ_ATTR</DT +><DD +><P +>object attributes</P +></DD +><DT +>UINT32</DT +><DD +><P +>1 - desired access</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1961">Response</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>POL_HND</DT +><DD +><P +>LSA policy handle</P +></DD +><DT +>return</DT +><DD +><P +>0 - indicates success</P +></DD +></DL +></DIV +></DIV +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN1972">LSA Query Info Policy</H3 +><P +><I +CLASS="EMPHASIS" +>Note: The info class in response must be the same as that in the request.</I +></P +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1976">Request</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>POL_HND</DT +><DD +><P +>LSA policy handle</P +></DD +><DT +>UINT16</DT +><DD +><P +>info class (also a policy handle?)</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN1987">Response</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>VOID*</DT +><DD +><P +>undocumented buffer pointer</P +></DD +><DT +>UINT16</DT +><DD +><P +>info class (same as info class in request).</P +></DD +></DL +></DIV +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +>switch (info class) +case 3: +case 5: +{ +DOM_INFO domain info, levels 3 and 5 (are the same). +} + +return 0 - indicates success</PRE +></TD +></TR +></TABLE +></P +></DIV +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN2000">LSA Enumerate Trusted Domains</H3 +><DIV +CLASS="SECT3" +><H4 +CLASS="SECT3" +><A +NAME="AEN2002">Request</H4 +><P +>no extra data</P +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2005">Response</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT32</DT +><DD +><P +>0 - enumeration context</P +></DD +><DT +>UINT32</DT +><DD +><P +>0 - entries read</P +></DD +><DT +>UINT32</DT +><DD +><P +>0 - trust information</P +></DD +><DT +>return</DT +><DD +><P +>0x8000 001a - "no trusted domains" success code</P +></DD +></DL +></DIV +></DIV +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN2024">LSA Open Secret</H3 +><DIV +CLASS="SECT3" +><H4 +CLASS="SECT3" +><A +NAME="AEN2026">Request</H4 +><P +>no extra data</P +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2029">Response</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT32</DT +><DD +><P +>0 - undocumented</P +></DD +><DT +>UINT32</DT +><DD +><P +>0 - undocumented</P +></DD +><DT +>UINT32</DT +><DD +><P +>0 - undocumented</P +></DD +><DT +>UINT32</DT +><DD +><P +>0 - undocumented</P +></DD +><DT +>UINT32</DT +><DD +><P +>0 - undocumented</P +></DD +></DL +></DIV +><P +>return 0x0C00 0034 - "no such secret" success code</P +></DIV +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN2053">LSA Close</H3 +><DIV +CLASS="SECT3" +><H4 +CLASS="SECT3" +><A +NAME="AEN2055">Request</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>POL_HND</DT +><DD +><P +>policy handle to be closed</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2062">Response</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>POL_HND</DT +><DD +><P +>0s - closed policy handle (all zeros)</P +></DD +></DL +></DIV +><P +>return 0 - indicates success</P +></DIV +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN2070">LSA Lookup SIDS</H3 +><P +><I +CLASS="EMPHASIS" +>Note: num_entries in response must be same as num_entries in request.</I +></P +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2074">Request</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>POL_HND</DT +><DD +><P +>LSA policy handle</P +></DD +><DT +>UINT32</DT +><DD +><P +>num_entries</P +></DD +><DT +>VOID*</DT +><DD +><P +>undocumented domain SID buffer pointer</P +></DD +><DT +>VOID*</DT +><DD +><P +>undocumented domain name buffer pointer</P +></DD +><DT +>VOID*[num_entries] undocumented domain SID pointers to be looked up.</DT +><DD +><P +>DOM_SID[num_entries] domain SIDs to be looked up.</P +></DD +><DT +>char[16]</DT +><DD +><P +>completely undocumented 16 bytes.</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2101">Response</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>DOM_REF</DT +><DD +><P +>domain reference response</P +></DD +><DT +>UINT32</DT +><DD +><P +>num_entries (listed above)</P +></DD +><DT +>VOID*</DT +><DD +><P +>undocumented buffer pointer</P +></DD +><DT +>UINT32</DT +><DD +><P +>num_entries (listed above)</P +></DD +><DT +>DOM_SID2[num_entries]</DT +><DD +><P +>domain SIDs (from Request, listed above).</P +></DD +><DT +>UINT32</DT +><DD +><P +>num_entries (listed above)</P +></DD +></DL +></DIV +><P +>return 0 - indicates success</P +></DIV +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN2129">LSA Lookup Names</H3 +><P +><I +CLASS="EMPHASIS" +>Note: num_entries in response must be same as num_entries in request.</I +></P +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2133">Request</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>POL_HND</DT +><DD +><P +>LSA policy handle</P +></DD +><DT +>UINT32</DT +><DD +><P +>num_entries</P +></DD +><DT +>UINT32</DT +><DD +><P +>num_entries</P +></DD +><DT +>VOID*</DT +><DD +><P +>undocumented domain SID buffer pointer</P +></DD +><DT +>VOID*</DT +><DD +><P +>undocumented domain name buffer pointer</P +></DD +><DT +>NAME[num_entries]</DT +><DD +><P +>names to be looked up.</P +></DD +><DT +>char[]</DT +><DD +><P +>undocumented bytes - falsely translated SID structure?</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2164">Response</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>DOM_REF</DT +><DD +><P +>domain reference response</P +></DD +><DT +>UINT32</DT +><DD +><P +>num_entries (listed above)</P +></DD +><DT +>VOID*</DT +><DD +><P +>undocumented buffer pointer</P +></DD +><DT +>UINT32</DT +><DD +><P +>num_entries (listed above)</P +></DD +><DT +>DOM_RID[num_entries]</DT +><DD +><P +>domain SIDs (from Request, listed above).</P +></DD +><DT +>UINT32</DT +><DD +><P +>num_entries (listed above)</P +></DD +></DL +></DIV +><P +>return 0 - indicates success</P +></DIV +></DIV +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN2192">NETLOGON rpc Transact Named Pipe</H2 +><P +>The sequence of actions taken on this pipe are:</P +><P +></P +><TABLE +BORDER="0" +><TBODY +><TR +><TD +>tablish a connection to the IPC$ share (SMBtconX). use encrypted passwords.</TD +></TR +><TR +><TD +>en an RPC Pipe with the name "\\PIPE\\NETLOGON". Store the file handle.</TD +></TR +><TR +><TD +>ing the file handle, send a Set Named Pipe Handle state to 0x4300.</TD +></TR +><TR +><TD +>eate Client Challenge. Send LSA Request Challenge. Store Server Challenge.</TD +></TR +><TR +><TD +>lculate Session Key. Send an LSA Auth 2 Challenge. Store Auth2 Challenge.</TD +></TR +><TR +><TD +>lc/Verify Client Creds. Send LSA Srv PW Set. Calc/Verify Server Creds.</TD +></TR +><TR +><TD +>lc/Verify Client Creds. Send LSA SAM Logon . Calc/Verify Server Creds.</TD +></TR +><TR +><TD +>lc/Verify Client Creds. Send LSA SAM Logoff. Calc/Verify Server Creds.</TD +></TR +><TR +><TD +>ose the IPC$ share.</TD +></TR +></TBODY +></TABLE +><P +></P +><P +>Defines for this pipe, identifying the query are</P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>LSA Request Challenge:</DT +><DD +><P +>0x04</P +></DD +><DT +>LSA Server Password Set:</DT +><DD +><P +>0x06</P +></DD +><DT +>LSA SAM Logon:</DT +><DD +><P +>0x02</P +></DD +><DT +>LSA SAM Logoff:</DT +><DD +><P +>0x03</P +></DD +><DT +>LSA Auth 2:</DT +><DD +><P +>0x0f</P +></DD +><DT +>LSA Logon Control:</DT +><DD +><P +>0x0e</P +></DD +></DL +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN2231">LSA Request Challenge</H3 +><P +><I +CLASS="EMPHASIS" +>Note: logon server name starts with two '\' characters and is upper case.</I +></P +><P +><I +CLASS="EMPHASIS" +>Note: logon client is the machine, not the user.</I +></P +><P +><I +CLASS="EMPHASIS" +>Note: the initial LanManager password hash, against which the challenge is issued, is the machine name itself (lower case). there will becalls issued (LSA Server Password Set) which will change this, later. refusing these calls allows you to always deal with the same password (i.e the LM# of the machine name in lower case).</I +></P +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2239">Request</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>VOID*</DT +><DD +><P +>undocumented buffer pointer</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>logon server unicode string</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>logon client unicode string</P +></DD +><DT +>char[8]</DT +><DD +><P +>client challenge</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2258">Response</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>char[8]</DT +><DD +><P +>server challenge</P +></DD +></DL +></DIV +><P +>return 0 - indicates success</P +></DIV +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN2266">LSA Authenticate 2</H3 +><P +><I +CLASS="EMPHASIS" +>Note: in between request and response, calculate the client credentials, and check them against the client-calculated credentials (this process uses the previously received client credentials).</I +></P +><P +><I +CLASS="EMPHASIS" +>Note: neg_flags in the response is the same as that in the request.</I +></P +><P +><I +CLASS="EMPHASIS" +>Note: you must take a copy of the client-calculated credentials received here, because they will be used in subsequent authentication packets.</I +></P +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2274">Request</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>LOG_INFO</DT +><DD +><P +>client identification info</P +></DD +><DT +>char[8]</DT +><DD +><P +>client-calculated credentials</P +></DD +><DT +>UINT8[]</DT +><DD +><P +>padding to 4-byte align with start of SMB header.</P +></DD +><DT +>UINT32</DT +><DD +><P +>neg_flags - negotiated flags (usual value is 0x0000 01ff)</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2293">Response</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>char[8]</DT +><DD +><P +>server credentials.</P +></DD +><DT +>UINT32</DT +><DD +><P +>neg_flags - same as neg_flags in request.</P +></DD +></DL +></DIV +><P +>return 0 - indicates success. failure value unknown.</P +></DIV +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN2305">LSA Server Password Set</H3 +><P +><I +CLASS="EMPHASIS" +>Note: the new password is suspected to be a DES encryption using the old password to generate the key.</I +></P +><P +><I +CLASS="EMPHASIS" +>Note: in between request and response, calculate the client credentials, and check them against the client-calculated credentials (this process uses the previously received client credentials).</I +></P +><P +><I +CLASS="EMPHASIS" +>Note: the server credentials are constructed from the client-calculated credentials and the client time + 1 second.</I +></P +><P +><I +CLASS="EMPHASIS" +>Note: you must take a copy of the client-calculated credentials received here, because they will be used in subsequent authentication packets.</I +></P +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2315">Request</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>CLNT_INFO</DT +><DD +><P +>client identification/authentication info</P +></DD +><DT +>char[]</DT +><DD +><P +>new password - undocumented.</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2326">Response</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>CREDS</DT +><DD +><P +>server credentials. server time stamp appears to be ignored.</P +></DD +></DL +></DIV +><P +>return 0 - indicates success; 0xC000 006a indicates failure</P +></DIV +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN2334">LSA SAM Logon</H3 +><P +><I +CLASS="EMPHASIS" +>Note: valid_user is True iff the username and password hash are valid for + the requested domain.</I +></P +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2338">Request</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>SAM_INFO</DT +><DD +><P +>sam_id structure</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2345">Response</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>VOID*</DT +><DD +><P +>undocumented buffer pointer</P +></DD +><DT +>CREDS</DT +><DD +><P +>server credentials. server time stamp appears to be ignored.</P +></DD +></DL +></DIV +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +>if (valid_user) +{ + UINT16 3 - switch value indicating USER_INFO structure. + VOID* non-zero - pointer to USER_INFO structure + USER_INFO user logon information + + UINT32 1 - Authoritative response; 0 - Non-Auth? + + return 0 - indicates success +} +else +{ + UINT16 0 - switch value. value to indicate no user presumed. + VOID* 0x0000 0000 - indicates no USER_INFO structure. + + UINT32 1 - Authoritative response; 0 - Non-Auth? + + return 0xC000 0064 - NT_STATUS_NO_SUCH_USER. +}</PRE +></TD +></TR +></TABLE +></P +></DIV +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN2358">LSA SAM Logoff</H3 +><P +><I +CLASS="EMPHASIS" +>Note: presumably, the SAM_INFO structure is validated, and a (currently + undocumented) error code returned if the Logoff is invalid.</I +></P +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2362">Request</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>SAM_INFO</DT +><DD +><P +>sam_id structure</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2369">Response</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>VOID*</DT +><DD +><P +>undocumented buffer pointer</P +></DD +><DT +>CREDS</DT +><DD +><P +>server credentials. server time stamp appears to be ignored.</P +></DD +></DL +></DIV +><P +>return 0 - indicates success. undocumented failure indication.</P +></DIV +></DIV +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN2381">\\MAILSLOT\NET\NTLOGON</H2 +><P +><I +CLASS="EMPHASIS" +>Note: mailslots will contain a response mailslot, to which the response + should be sent. the target NetBIOS name is REQUEST_NAME<20>, where + REQUEST_NAME is the name of the machine that sent the request.</I +></P +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN2385">Query for PDC</H3 +><P +><I +CLASS="EMPHASIS" +>Note: NTversion, LMNTtoken, LM20token in response are the same as those given in the request.</I +></P +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2389">Request</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT16</DT +><DD +><P +>0x0007 - Query for PDC</P +></DD +><DT +>STR</DT +><DD +><P +>machine name</P +></DD +><DT +>STR</DT +><DD +><P +>response mailslot</P +></DD +><DT +>UINT8[]</DT +><DD +><P +>padding to 2-byte align with start of mailslot.</P +></DD +><DT +>UNISTR</DT +><DD +><P +>machine name</P +></DD +><DT +>UINT32</DT +><DD +><P +>NTversion</P +></DD +><DT +>UINT16</DT +><DD +><P +>LMNTtoken</P +></DD +><DT +>UINT16</DT +><DD +><P +>LM20token</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2424">Response</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT16</DT +><DD +><P +>0x000A - Respose to Query for PDC</P +></DD +><DT +>STR</DT +><DD +><P +>machine name (in uppercase)</P +></DD +><DT +>UINT8[]</DT +><DD +><P +>padding to 2-byte align with start of mailslot.</P +></DD +><DT +>UNISTR</DT +><DD +><P +>machine name</P +></DD +><DT +>UNISTR</DT +><DD +><P +>domain name</P +></DD +><DT +>UINT32</DT +><DD +><P +>NTversion (same as received in request)</P +></DD +><DT +>UINT16</DT +><DD +><P +>LMNTtoken (same as received in request)</P +></DD +><DT +>UINT16</DT +><DD +><P +>LM20token (same as received in request)</P +></DD +></DL +></DIV +></DIV +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN2459">SAM Logon</H3 +><P +><I +CLASS="EMPHASIS" +>Note: machine name in response is preceded by two '\' characters.</I +></P +><P +><I +CLASS="EMPHASIS" +>Note: NTversion, LMNTtoken, LM20token in response are the same as those given in the request.</I +></P +><P +><I +CLASS="EMPHASIS" +>Note: user name in the response is presumably the same as that in the request.</I +></P +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2467">Request</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT16</DT +><DD +><P +>0x0012 - SAM Logon</P +></DD +><DT +>UINT16</DT +><DD +><P +>request count</P +></DD +><DT +>UNISTR</DT +><DD +><P +>machine name</P +></DD +><DT +>UNISTR</DT +><DD +><P +>user name</P +></DD +><DT +>STR</DT +><DD +><P +>response mailslot</P +></DD +><DT +>UINT32</DT +><DD +><P +>alloweable account</P +></DD +><DT +>UINT32</DT +><DD +><P +>domain SID size</P +></DD +><DT +>char[sid_size]</DT +><DD +><P +>domain SID, of sid_size bytes.</P +></DD +><DT +>UINT8[]</DT +><DD +><P +>???? padding to 4? 2? -byte align with start of mailslot.</P +></DD +><DT +>UINT32</DT +><DD +><P +>NTversion</P +></DD +><DT +>UINT16</DT +><DD +><P +>LMNTtoken</P +></DD +><DT +>UINT16</DT +><DD +><P +>LM20token</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2518">Response</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT16</DT +><DD +><P +>0x0013 - Response to SAM Logon</P +></DD +><DT +>UNISTR</DT +><DD +><P +>machine name</P +></DD +><DT +>UNISTR</DT +><DD +><P +>user name - workstation trust account</P +></DD +><DT +>UNISTR</DT +><DD +><P +>domain name </P +></DD +><DT +>UINT32</DT +><DD +><P +>NTversion</P +></DD +><DT +>UINT16</DT +><DD +><P +>LMNTtoken</P +></DD +><DT +>UINT16</DT +><DD +><P +>LM20token</P +></DD +></DL +></DIV +></DIV +></DIV +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN2549">SRVSVC Transact Named Pipe</H2 +><P +>Defines for this pipe, identifying the query are:</P +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>Net Share Enum</DT +><DD +><P +>0x0f</P +></DD +><DT +>Net Server Get Info</DT +><DD +><P +>0x15</P +></DD +></DL +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN2561">Net Share Enum</H3 +><P +><I +CLASS="EMPHASIS" +>Note: share level and switch value in the response are presumably the same as those in the request.</I +></P +><P +><I +CLASS="EMPHASIS" +>Note: cifsrap2.txt (section 5) may be of limited assistance here.</I +></P +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2567">Request</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>VOID*</DT +><DD +><P +>pointer (to server name?)</P +></DD +><DT +>UNISTR2</DT +><DD +><P +>server name</P +></DD +><DT +>UINT8[]</DT +><DD +><P +>padding to get unicode string 4-byte aligned with the start of the SMB header.</P +></DD +><DT +>UINT32</DT +><DD +><P +>share level</P +></DD +><DT +>UINT32</DT +><DD +><P +>switch value</P +></DD +><DT +>VOID*</DT +><DD +><P +>pointer to SHARE_INFO_1_CTR</P +></DD +><DT +>SHARE_INFO_1_CTR</DT +><DD +><P +>share info with 0 entries</P +></DD +><DT +>UINT32</DT +><DD +><P +>preferred maximum length (0xffff ffff)</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2602">Response</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT32</DT +><DD +><P +>share level</P +></DD +><DT +>UINT32</DT +><DD +><P +>switch value</P +></DD +><DT +>VOID*</DT +><DD +><P +>pointer to SHARE_INFO_1_CTR</P +></DD +><DT +>SHARE_INFO_1_CTR</DT +><DD +><P +>share info (only added if share info ptr is non-zero)</P +></DD +></DL +></DIV +><P +>return 0 - indicates success</P +></DIV +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN2622">Net Server Get Info</H3 +><P +><I +CLASS="EMPHASIS" +>Note: level is the same value as in the request.</I +></P +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2626">Request</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UNISTR2</DT +><DD +><P +>server name</P +></DD +><DT +>UINT32</DT +><DD +><P +>switch level</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2637">Response</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>UINT32</DT +><DD +><P +>switch level</P +></DD +><DT +>VOID*</DT +><DD +><P +>pointer to SERVER_INFO_101</P +></DD +><DT +>SERVER_INFO_101</DT +><DD +><P +>server info (only added if server info ptr is non-zero)</P +></DD +></DL +></DIV +><P +>return 0 - indicates success</P +></DIV +></DIV +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN2653">Cryptographic side of NT Domain Authentication</H2 +><DIV +CLASS="SECT2" +><H3 +CLASS="SECT2" +><A +NAME="AEN2655">Definitions</H3 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>Add(A1,A2)</DT +><DD +><P +>Intel byte ordered addition of corresponding 4 byte words in arrays A1 and A2</P +></DD +><DT +>E(K,D)</DT +><DD +><P +>DES ECB encryption of 8 byte data D using 7 byte key K</P +></DD +><DT +>lmowf()</DT +><DD +><P +>Lan man hash</P +></DD +><DT +>ntowf()</DT +><DD +><P +>NT hash</P +></DD +><DT +>PW</DT +><DD +><P +>md4(machine_password) == md4(lsadump $machine.acc) == +pwdump(machine$) (initially) == md4(lmowf(unicode(machine)))</P +></DD +><DT +>ARC4(K,Lk,D,Ld)</DT +><DD +><P +>ARC4 encryption of data D of length Ld with key K of length Lk</P +></DD +><DT +>v[m..n(,l)]</DT +><DD +><P +>subset of v from bytes m to n, optionally padded with zeroes to length l</P +></DD +><DT +>Cred(K,D)</DT +><DD +><P +>E(K[7..7,7],E(K[0..6],D)) computes a credential</P +></DD +><DT +>Time()</DT +><DD +><P +>4 byte current time</P +></DD +><DT +>Cc,Cs</DT +><DD +><P +>8 byte client and server challenges Rc,Rs: 8 byte client and server credentials</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN2698">Protocol</H3 +><P +>C->S ReqChal,Cc S->C Cs</P +><P +>C & S compute session key Ks = E(PW[9..15],E(PW[0..6],Add(Cc,Cs)))</P +><P +>C: Rc = Cred(Ks,Cc) C->S Authenticate,Rc S: Rs = Cred(Ks,Cs), +assert(Rc == Cred(Ks,Cc)) S->C Rs C: assert(Rs == Cred(Ks,Cs))</P +><P +>On joining the domain the client will optionally attempt to change its +password and the domain controller may refuse to update it depending +on registry settings. This will also occur weekly afterwards.</P +><P +>C: Tc = Time(), Rc' = Cred(Ks,Rc+Tc) C->S ServerPasswordSet,Rc',Tc, +arc4(Ks[0..7,16],lmowf(randompassword()) C: Rc = Cred(Ks,Rc+Tc+1) S: +assert(Rc' == Cred(Ks,Rc+Tc)), Ts = Time() S: Rs' = Cred(Ks,Rs+Tc+1) +S->C Rs',Ts C: assert(Rs' == Cred(Ks,Rs+Tc+1)) S: Rs = Rs'</P +><P +>User: U with password P wishes to login to the domain (incidental data +such as workstation and domain omitted)</P +><P +>C: Tc = Time(), Rc' = Cred(Ks,Rc+Tc) C->S NetLogonSamLogon,Rc',Tc,U, +arc4(Ks[0..7,16],16,ntowf(P),16), arc4(Ks[0..7,16],16,lmowf(P),16) S: +assert(Rc' == Cred(Ks,Rc+Tc)) assert(passwords match those in SAM) S: +Ts = Time()</P +><P +>S->C Cred(Ks,Cred(Ks,Rc+Tc+1)),userinfo(logon script,UID,SIDs,etc) C: +assert(Rs == Cred(Ks,Cred(Rc+Tc+1)) C: Rc = Cred(Ks,Rc+Tc+1)</P +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN2708">Comments</H3 +><P +>On first joining the domain the session key could be computed by +anyone listening in on the network as the machine password has a well +known value. Until the machine is rebooted it will use this session +key to encrypt NT and LM one way functions of passwords which are +password equivalents. Any user who logs in before the machine has been +rebooted a second time will have their password equivalent exposed. Of +course the new machine password is exposed at this time anyway.</P +><P +>None of the returned user info such as logon script, profile path and +SIDs *appear* to be protected by anything other than the TCP checksum.</P +><P +>The server time stamps appear to be ignored.</P +><P +>The client sends a ReturnAuthenticator in the SamLogon request which I +can't find a use for. However its time is used as the timestamp +returned by the server.</P +><P +>The password OWFs should NOT be sent over the network reversibly +encrypted. They should be sent using ARC4(Ks,md4(owf)) with the server +computing the same function using the owf values in the SAM.</P +></DIV +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN2715">SIDs and RIDs</H2 +><P +>SIDs and RIDs are well documented elsewhere.</P +><P +>A SID is an NT Security ID (see DOM_SID structure). They are of the form:</P +><P +></P +><TABLE +BORDER="0" +><TBODY +><TR +><TD +>revision-NN-SubAuth1-SubAuth2-SubAuth3... </TD +></TR +><TR +><TD +>revision-0xNNNNNNNNNNNN-SubAuth1-SubAuth2-SubAuth3...</TD +></TR +></TBODY +></TABLE +><P +></P +><P +>currently, the SID revision is 1. +The Sub-Authorities are known as Relative IDs (RIDs).</P +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN2723">Well-known SIDs</H3 +><DIV +CLASS="SECT3" +><H4 +CLASS="SECT3" +><A +NAME="AEN2725">Universal well-known SIDs</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>Null SID</DT +><DD +><P +>S-1-0-0</P +></DD +><DT +>World</DT +><DD +><P +>S-1-1-0</P +></DD +><DT +>Local</DT +><DD +><P +>S-1-2-0</P +></DD +><DT +>Creator Owner ID</DT +><DD +><P +>S-1-3-0</P +></DD +><DT +>Creator Group ID</DT +><DD +><P +>S-1-3-1</P +></DD +><DT +>Creator Owner Server ID</DT +><DD +><P +>S-1-3-2</P +></DD +><DT +>Creator Group Server ID</DT +><DD +><P +>S-1-3-3</P +></DD +><DT +>(Non-unique IDs)</DT +><DD +><P +>S-1-4</P +></DD +></DL +></DIV +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2760">NT well-known SIDs</H4 +><P +></P +><DIV +CLASS="VARIABLELIST" +><DL +><DT +>NT Authority</DT +><DD +><P +>S-1-5</P +></DD +><DT +>Dialup</DT +><DD +><P +>S-1-5-1</P +></DD +><DT +>Network</DT +><DD +><P +>S-1-5-2</P +></DD +><DT +>Batch</DT +><DD +><P +>S-1-5-3</P +></DD +><DT +>Interactive</DT +><DD +><P +>S-1-5-4</P +></DD +><DT +>Service</DT +><DD +><P +>S-1-5-6</P +></DD +><DT +>AnonymousLogon(aka null logon session)</DT +><DD +><P +>S-1-5-7</P +></DD +><DT +>Proxy</DT +><DD +><P +>S-1-5-8</P +></DD +><DT +>ServerLogon(aka domain controller account)</DT +><DD +><P +>S-1-5-8</P +></DD +><DT +>(Logon IDs)</DT +><DD +><P +>S-1-5-5-X-Y</P +></DD +><DT +>(NT non-unique IDs)</DT +><DD +><P +>S-1-5-0x15-...</P +></DD +><DT +>(Built-in domain)</DT +><DD +><P +>s-1-5-0x20</P +></DD +></DL +></DIV +></DIV +></DIV +><DIV +CLASS="SECT2" +><HR><H3 +CLASS="SECT2" +><A +NAME="AEN2811">Well-known RIDS</H3 +><P +>A RID is a sub-authority value, as part of either a SID, or in the case +of Group RIDs, part of the DOM_GID structure, in the USER_INFO_1 +structure, in the LSA SAM Logon response.</P +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2814">Well-known RID users</H4 +><P +><B +>Groupname: </B +>DOMAIN_USER_RID_ADMIN</P +><P +><B +>????: </B +>0x0000</P +><P +><B +>RID: </B +>01F4</P +><P +><B +>Groupname: </B +>DOMAIN_USER_RID_GUEST</P +><P +><B +>????: </B +>0x0000</P +><P +><B +>RID: </B +>01F5</P +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2828">Well-known RID groups</H4 +><P +><B +>Groupname: </B +> DOMAIN_GROUP_RID_ADMINS</P +><P +><B +>????: </B +>0x0000</P +><P +><B +>RID: </B +>0200</P +><P +><B +>Groupname: </B +> DOMAIN_GROUP_RID_USERS</P +><P +><B +>????: </B +>0x0000</P +><P +><B +>RID: </B +>0201</P +><P +><B +>Groupname: </B +> DOMAIN_GROUP_RID_GUESTS</P +><P +><B +>????: </B +>0x0000</P +><P +><B +>RID: </B +>0202</P +></DIV +><DIV +CLASS="SECT3" +><HR><H4 +CLASS="SECT3" +><A +NAME="AEN2846">Well-known RID aliases</H4 +><P +><B +>Groupname: </B +> DOMAIN_ALIAS_RID_ADMINS</P +><P +><B +>????: </B +>0x0000</P +><P +><B +>RID: </B +>0220</P +><P +><B +>Groupname: </B +> DOMAIN_ALIAS_RID_USERS</P +><P +><B +>????: </B +>0x0000</P +><P +><B +>RID: </B +>0221</P +><P +><B +>Groupname: </B +> DOMAIN_ALIAS_RID_GUESTS</P +><P +><B +>????: </B +>0x0000</P +><P +><B +>RID: </B +>0222</P +><P +><B +>Groupname: </B +> DOMAIN_ALIAS_RID_POWER_USERS</P +><P +><B +>????: </B +>0x0000</P +><P +><B +>RID: </B +>0223</P +><P +><B +>Groupname: </B +> DOMAIN_ALIAS_RID_ACCOUNT_OPS</P +><P +><B +>????: </B +>0x0000</P +><P +><B +>RID: </B +>0224</P +><P +><B +>Groupname: </B +> DOMAIN_ALIAS_RID_SYSTEM_OPS</P +><P +><B +>????: </B +>0x0000</P +><P +><B +>RID: </B +>0225</P +><P +><B +>Groupname: </B +> DOMAIN_ALIAS_RID_PRINT_OPS</P +><P +><B +>????: </B +>0x0000</P +><P +><B +>RID: </B +>0226</P +><P +><B +>Groupname: </B +> DOMAIN_ALIAS_RID_BACKUP_OPS</P +><P +><B +>????: </B +>0x0000</P +><P +><B +>RID: </B +>0227</P +><P +><B +>Groupname: </B +> DOMAIN_ALIAS_RID_REPLICATOR</P +><P +><B +>????: </B +>0x0000</P +><P +><B +>RID: </B +>0228</P +></DIV +></DIV +></DIV +></DIV +><DIV +CLASS="CHAPTER" +><HR><H1 +><A +NAME="PRINTING">Samba Printing Internals</H1 +><DIV +CLASS="SECT1" +><H2 +CLASS="SECT1" +><A +NAME="AEN2895">Abstract</H2 +><P +>The purpose of this document is to provide some insight into +Samba's printing functionality and also to describe the semantics +of certain features of Windows client printing.</P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN2898">Printing Interface to Various Back ends</H2 +><P +>Samba uses a table of function pointers to seven functions. The +function prototypes are defined in the <TT +CLASS="VARNAME" +>printif</TT +> structure declared +in <TT +CLASS="FILENAME" +>printing.h</TT +>.</P +><P +></P +><UL +><LI +><P +>retrieve the contents of a print queue</P +></LI +><LI +><P +>pause the print queue</P +></LI +><LI +><P +>resume a paused print queue</P +></LI +><LI +><P +>delete a job from the queue</P +></LI +><LI +><P +>pause a job in the print queue</P +></LI +><LI +><P +>result a paused print job in the queue</P +></LI +><LI +><P +>submit a job to the print queue</P +></LI +></UL +><P +>Currently there are only two printing back end implementations +defined.</P +><P +></P +><UL +><LI +><P +>a generic set of functions for working with standard UNIX + printing subsystems</P +></LI +><LI +><P +>a set of CUPS specific functions (this is only enabled if + the CUPS libraries were located at compile time).</P +></LI +></UL +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN2924">Print Queue TDB's</H2 +><P +>Samba provides periodic caching of the output from the "lpq command" +for performance reasons. This cache time is configurable in seconds. +Obviously the longer the cache time the less often smbd will be +required to exec a copy of lpq. However, the accuracy of the print +queue contents displayed to clients will be diminished as well.</P +><P +>The list of currently opened print queue TDB's can be found +be examining the list of tdb_print_db structures ( see print_db_head +in printing.c ). A queue TDB is opened using the wrapper function +printing.c:get_print_db_byname(). The function ensures that smbd +does not open more than MAX_PRINT_DBS_OPEN in an effort to prevent +a large print server from exhausting all available file descriptors. +If the number of open queue TDB's exceeds the MAX_PRINT_DBS_OPEN +limit, smbd falls back to a most recently used algorithm for maintaining +a list of open TDB's.</P +><P +>There are two ways in which a a print job can be entered into +a print queue's TDB. The first is to submit the job from a Windows +client which will insert the job information directly into the TDB. +The second method is to have the print job picked up by executing the +"lpq command".</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +>/* included from printing.h */ +struct printjob { + pid_t pid; /* which process launched the job */ + int sysjob; /* the system (lp) job number */ + int fd; /* file descriptor of open file if open */ + time_t starttime; /* when the job started spooling */ + int status; /* the status of this job */ + size_t size; /* the size of the job so far */ + int page_count; /* then number of pages so far */ + BOOL spooled; /* has it been sent to the spooler yet? */ + BOOL smbjob; /* set if the job is a SMB job */ + fstring filename; /* the filename used to spool the file */ + fstring jobname; /* the job name given to us by the client */ + fstring user; /* the user who started the job */ + fstring queuename; /* service number of printer for this job */ + NT_DEVICEMODE *nt_devmode; +};</PRE +></TD +></TR +></TABLE +></P +><P +>The current manifestation of the printjob structure contains a field +for the UNIX job id returned from the "lpq command" and a Windows job +ID (32-bit bounded by PRINT_MAX_JOBID). When a print job is returned +by the "lpq command" that does not match an existing job in the queue's +TDB, a 32-bit job ID above the <*vance doesn't know what word is missing here*> is generating by adding UNIX_JOB_START to +the id reported by lpq.</P +><P +>In order to match a 32-bit Windows jobid onto a 16-bit lanman print job +id, smbd uses an in memory TDB to match the former to a number appropriate +for old lanman clients.</P +><P +>When updating a print queue, smbd will perform the following +steps ( refer to <TT +CLASS="FILENAME" +>print.c:print_queue_update()</TT +> ):</P +><P +></P +><OL +TYPE="1" +><LI +><P +>Check to see if another smbd is currently in + the process of updating the queue contents by checking the pid + stored in <TT +CLASS="CONSTANT" +>LOCK/<TT +CLASS="REPLACEABLE" +><I +>printer_name</I +></TT +></TT +>. + If so, then do not update the TDB.</P +></LI +><LI +><P +>Lock the mutex entry in the TDB and store our own pid. + Check that this succeeded, else fail.</P +></LI +><LI +><P +>Store the updated time stamp for the new cache + listing</P +></LI +><LI +><P +>Retrieve the queue listing via "lpq command"</P +></LI +><LI +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="90%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> foreach job in the queue + { + if the job is a UNIX job, create a new entry; + if the job has a Windows based jobid, then + { + Lookup the record by the jobid; + if the lookup failed, then + treat it as a UNIX job; + else + update the job status only + } + }</PRE +></TD +></TR +></TABLE +></P +></LI +><LI +><P +>Delete any jobs in the TDB that are not + in the in the lpq listing</P +></LI +><LI +><P +>Store the print queue status in the TDB</P +></LI +><LI +><P +>update the cache time stamp again</P +></LI +></OL +><P +>Note that it is the contents of this TDB that is returned to Windows +clients and not the actual listing from the "lpq command".</P +><P +>The NT_DEVICEMODE stored as part of the printjob structure is used to +store a pointer to a non-default DeviceMode associated with the print +job. The pointer will be non-null when the client included a Device +Mode in the OpenPrinterEx() call and subsequently submitted a job for +printing on that same handle. If the client did not include a Device +Mode in the OpenPrinterEx() request, the nt_devmode field is NULL +and the job has the printer's device mode associated with it by default.</P +><P +>Only non-default Device Mode are stored with print jobs in the print +queue TDB. Otherwise, the Device Mode is obtained from the printer +object when the client issues a GetJob(level == 2) request.</P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN2958">ChangeID & Client Caching of Printer Information</H2 +><P +>[To be filled in later]</P +></DIV +><DIV +CLASS="SECT1" +><HR><H2 +CLASS="SECT1" +><A +NAME="AEN2961">Windows NT/2K Printer Change Notify</H2 +><P +>When working with Windows NT+ clients, it is possible for a +print server to use RPC to send asynchronous change notification +events to clients for certain printer and print job attributes. +This can be useful when the client needs to know that a new +job has been added to the queue for a given printer or that the +driver for a printer has been changed. Note that this is done +entirely orthogonal to cache updates based on a new ChangeID for +a printer object.</P +><P +>The basic set of RPC's used to implement change notification are</P +><P +></P +><UL +><LI +><P +>RemoteFindFirstPrinterChangeNotifyEx ( RFFPCN )</P +></LI +><LI +><P +>RemoteFindNextPrinterChangeNotifyEx ( RFNPCN )</P +></LI +><LI +><P +>FindClosePrinterChangeNotify( FCPCN )</P +></LI +><LI +><P +>ReplyOpenPrinter</P +></LI +><LI +><P +>ReplyClosePrinter</P +></LI +><LI +><P +>RouteRefreshPrinterChangeNotify ( RRPCN )</P +></LI +></UL +><P +>One additional RPC is available to a server, but is never used by the +Windows spooler service:</P +><P +></P +><UL +><LI +><P +>RouteReplyPrinter()</P +></LI +></UL +><P +>The opnum for all of these RPC's are defined in include/rpc_spoolss.h</P +><P +>Windows NT print servers use a bizarre method of sending print +notification event to clients. The process of registering a new change +notification handle is as follows. The 'C' is for client and the +'S' is for server. All error conditions have been eliminated.</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +>C: Obtain handle to printer or to the printer + server via the standard OpenPrinterEx() call. +S: Respond with a valid handle to object + +C: Send a RFFPCN request with the previously obtained + handle with either (a) set of flags for change events + to monitor, or (b) a PRINTER_NOTIFY_OPTIONS structure + containing the event information to monitor. The windows + spooler has only been observed to use (b). +S: The <* another missing word*> opens a new TCP session to the client (thus requiring + all print clients to be CIFS servers as well) and sends + a ReplyOpenPrinter() request to the client. +C: The client responds with a printer handle that can be used to + send event notification messages. +S: The server replies success to the RFFPCN request. + +C: The windows spooler follows the RFFPCN with a RFNPCN + request to fetch the current values of all monitored + attributes. +S: The server replies with an array SPOOL_NOTIFY_INFO_DATA + structures (contained in a SPOOL_NOTIFY_INFO structure). + +C: If the change notification handle is ever released by the + client via a FCPCN request, the server sends a ReplyClosePrinter() + request back to the client first. However a request of this + nature from the client is often an indication that the previous + notification event was not marshalled correctly by the server + or a piece of data was wrong. +S: The server closes the internal change notification handle + (POLICY_HND) and does not send any further change notification + events to the client for that printer or job.</PRE +></TD +></TR +></TABLE +></P +><P +>The current list of notification events supported by Samba can be +found by examining the internal tables in srv_spoolss_nt.c</P +><P +></P +><UL +><LI +><P +>printer_notify_table[]</P +></LI +><LI +><P +>job_notify_table[]</P +></LI +></UL +><P +>When an event occurs that could be monitored, smbd sends a message +to itself about the change. The list of events to be transmitted +are queued by the smbd process sending the message to prevent an +overload of TDB usage and the internal message is sent during smbd's +idle loop (refer to printing/notify.c and the functions +send_spoolss_notify2_msg() and print_notify_send_messages() ).</P +><P +>The decision of whether or not the change is to be sent to connected +clients is made by the routine which actually sends the notification. +( refer to srv_spoolss_nt.c:recieve_notify2_message() ).</P +><P +>Because it possible to receive a listing of multiple changes for +multiple printers, the notification events must be split into +categories by the printer name. This makes it possible to group +multiple change events to be sent in a single RPC according to the +printer handle obtained via a ReplyOpenPrinter().</P +><P +>The actual change notification is performed using the RRPCN request +RPC. This packet contains</P +><P +></P +><UL +><LI +><P +>the printer handle registered with the +client's spooler on which the change occurred</P +></LI +><LI +><P +>The change_low value which was sent as part +of the last RFNPCN request from the client</P +></LI +><LI +><P +>The SPOOL_NOTIFY_INFO container with the event +information</P +></LI +></UL +><P +>A <TT +CLASS="VARNAME" +>SPOOL_NOTIFY_INFO</TT +> contains:</P +><P +></P +><UL +><LI +><P +>the version and flags field are predefined +and should not be changed</P +></LI +><LI +><P +>The count field is the number of entries +in the SPOOL_NOTIFY_INFO_DATA array</P +></LI +></UL +><P +>The <TT +CLASS="VARNAME" +>SPOOL_NOTIFY_INFO_DATA</TT +> entries contain:</P +><P +></P +><UL +><LI +><P +>The type defines whether or not this event +is for a printer or a print job</P +></LI +><LI +><P +>The field is the flag identifying the event</P +></LI +><LI +><P +>the notify_data union contains the new valuie of the +attribute</P +></LI +><LI +><P +>The enc_type defines the size of the structure for marshalling +and unmarshalling</P +></LI +><LI +><P +>(a) the id must be 0 for a printer event on a printer handle. +(b) the id must be the job id for an event on a printer job +(c) the id must be the matching number of the printer index used +in the response packet to the RFNPCN when using a print server +handle for notification. Samba currently uses the snum of +the printer for this which can break if the list of services +has been modified since the notification handle was registered.</P +></LI +><LI +><P +>The size is either (a) the string length in UNICODE for strings, +(b) the size in bytes of the security descriptor, or (c) 0 for +data values.</P +></LI +></UL +></DIV +></DIV +><DIV +CLASS="CHAPTER" +><HR><H1 +><A +NAME="WINS">Samba WINS Internals</H1 +><DIV +CLASS="SECT1" +><H2 +CLASS="SECT1" +><A +NAME="AEN3032">WINS Failover</H2 +><P +>The current Samba codebase possesses the capability to use groups of WINS +servers that share a common namespace for NetBIOS name registration and +resolution. The formal parameter syntax is</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +> WINS_SERVER_PARAM = SERVER [ SEPARATOR SERVER_LIST ] + WINS_SERVER_PARAM = "wins server" + SERVER = ADDR[:TAG] + ADDR = ip_addr | fqdn + TAG = string + SEPARATOR = comma | \s+ + SERVER_LIST = SERVER [ SEPARATOR SERVER_LIST ]</PRE +></TD +></TR +></TABLE +></P +><P +>A simple example of a valid wins server setting is</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +>[global] + wins server = 192.168.1.2 192.168.1.3</PRE +></TD +></TR +></TABLE +></P +><P +>In the event that no TAG is defined in for a SERVER in the list, smbd assigns a default +TAG of "*". A TAG is used to group servers of a shared NetBIOS namespace together. Upon +startup, nmbd will attempt to register the netbios name value with one server in each +tagged group.</P +><P +>An example using tags to group WINS servers together is show here. Note that the use of +interface names in the tags is only by convention and is not a technical requirement.</P +><P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><PRE +CLASS="PROGRAMLISTING" +>[global] + wins server = 192.168.1.2:eth0 192.168.1.3:eth0 192.168.2.2:eth1</PRE +></TD +></TR +></TABLE +></P +><P +>Using this configuration, nmbd would attempt to register the server's NetBIOS name +with one WINS server in each group. Because the "eth0" group has two servers, the +second server would only be used when a registration (or resolution) request to +the first server in that group timed out.</P +><P +>NetBIOS name resolution follows a similar pattern as name registration. When resolving +a NetBIOS name via WINS, smbd and other Samba programs will attempt to query a single WINS +server in a tagged group until either a positive response is obtained at least once or +until a server from every tagged group has responded negatively to the name query request. +If a timeout occurs when querying a specific WINS server, that server is marked as down to +prevent further timeouts and the next server in the WINS group is contacted. Once marked as +dead, Samba will not attempt to contact that server for name registration/resolution queries +for a period of 10 minutes.</P +></DIV +></DIV +></DIV +></BODY +></HTML +>
\ No newline at end of file diff --git a/docs/textdocs/CUPS-PrintingInfo.txt b/docs/textdocs/CUPS-PrintingInfo.txt new file mode 100644 index 0000000000..bbe14f33e8 --- /dev/null +++ b/docs/textdocs/CUPS-PrintingInfo.txt @@ -0,0 +1,589 @@ +Date: Sun, 22 Sep 2002 15:38:02 +0200 +From: "Kurt Pfeifle" <kpfeifle@danka.de> +Reply-To: kpfeifle@danka.de +Organization: Danka Deutschland GmbH +To: samba@lists.samba.org +Subject: CUPS filtering mechanism explained, was: [cups raw mode, was Re: [Samba] unlink data file in cups_job_submit] + +Paul Janzen wrote on Samba digest: + + > Message: 7 + > To: Gerald Carter <jerry@samba.org> + > Cc: samba@lists.samba.org + > From: Paul Janzen <pcj@samba.sez.to> + > Subject: cups raw mode, was Re: [Samba] unlink data file in cups_job_submit + > Date: 21 Sep 2002 12:09:23 -0700 + > + > + > Gerald Carter <jerry@samba.org> writes: + > + > > Looks right to me [:-)] Applying it now. Thanks. I've been meaning to + > > track this one down. + > + > + > Thanks! + > + > While we are on the subject... [:-)] + > + > If I am using native printer drivers on Windows clients, I would like + > the "raw" option to get propagated to CUPS. Otherwise cups does not + > pass the data on to the printer. + +Paul, + +I see you know about what you call the "raw data passthrough feature". +I guess you mean the lines in "/etc/cups/mime.types" and +"/etc/cups/mime.convs" which need to be uncommented to allow "raw" +printing ? + +Here is some clarification (likely not very useful for you, but +possibly for some other readers of the Samba list): + +### If you have "printing = cups" and "printcap = cups" enabled, +--- everything is handled by Samba accessing the CUPS API. (And any + "print command" directive in Samba will be ignored.) If the CUPS + API is not available (because Samba might not be compiled against +libcups), it automatically maps to the "System V" command set, with +"-oraw" enabled automatically. + + > (If I enable cups's application/ + > octet-stream raw-data passthrough feature, both cupsomatic and the + > Windows driver add PJL headers and footers, which is not what I want + > either.) + +### According to my experience, cupsomatic on the Samba/CUPS server +--- does *not* add any features if a file is really printed "raw". + However, if you have loaded the driver for the Windows client +from the CUPS server, using the "cupsaddsmb" utility, and if this +driver is one using a "Foomatic" PPD, the PJL header in question is +already added on the Windows client, at the time when the driver +initially generated the PostScript data -- and CUPS in true "-oraw" +manner doesn't remove this PJL header and passes the file "as is" +to its printer communication backend. + +NOTE, please, that the editing in the "mime.convs" and the +----- "mime.types" file does not *enforce* "raw" printing, it + only *allows* it. Any file arriving from Windows is +"auto-typed" by CUPS, which might consecutively lead to its +treatment by various filters automatically (depending on the +actual outcome of the auto-typing and the configuration of the +printqueue in question): + + --> Files generated by PCL drivers and destined to PCL + printers get auto-typed "application/octet-stream" + and are indeed printed "raw". Also, unknown file + types are getting tagged as "application/octet-stream". + + --> Files generated by a PostScript driver (and destined + for any target printer type) are auto-typed. Depending + on the driver, the discovered MIME type may be + + * application/postscript or + * application/vnd.cups-postscript + +"application/postscript" goes first thru the "pstops" filter + (where also the page counting and accounting takes place + currently), and the outcome will be of MIME type + "application/vnd.cups-postscript". The pstopsfilter reads and + uses information from the PPD and inserts user-provided options + into the PostScript file. As a consequence, the filtered file + will possibly have the PJL header you don't want. + +"application/postscript" will be all files with a ".ps", ".ai", + ".eps" suffix or which have as their first character string one + of "%!" or "<04>%". + +"application/vnd.cups-postscript" will be those files which do both, + first... + ...carry a string "LANGUAGE=POSTSCRIPT" (or similar variations + with different capitalization) amongst the first 512 bytes, + *plus*... + ...contain the "PJL super escape code" amongst the first 128 + bytes ("<1B>%-12345X"). Very likely, most PostScript files + generated on Windows using a CUPS- or other PPD, will have + to be auto-typed as "vnd.cups-postscript". + Probably a file produced with a "Generic PostScript driver" + will be just "application/postscript" (have not checked). + +Once the file is in "application/vnd.cups-postscript" format, +either "pstoraster" or "cupsomatic" will take over (depending +on the printer configuration, as determined by the PPD in use). + +NOTE: a printer queue with *no* PPD associated to it is a "raw" +----- printer and all files will go directly there as received + by the spooler; the exeption are file types +"application/octet-stream" which need the mentioned "passthrough +feature" enabled. "Raw" queues don't do any filtering at all, they +hand the file directly to the CUPS backend. This backend is +responsible for the sending of the data to the device (as visible +in the "device URI" notation as lpd://, socket://, smb://, ipp://, +http://, parallel:/, serial:/, usb:/ etc.) + +NOTE, please, also the following fact: "cupsomatic"/Foomatic are +----- *not* native CUPS drivers and they don't ship with CUPS. + They are a Third Party add-on, developed at Linuxprinting.org. +As such, they are a brilliant hack to make all models (driven by +Ghostscript drivers/filters in traditional spoolers) also work via +CUPS, with the same (good or bad!) quality as in these other +spoolers. "cupsomatic" is only a vehicle to execute a ghostscript +commandline at that stage in the CUPS filtering chain, where +"normally" the native CUPS "pstoraster" filter would kick in. +cupsomatic by-passes pstoraster, "kidnaps" the printfile from CUPS +away and re-directs it to go through Ghostscipt. CUPS accepts this, +because the associated CUPS-O-Matic-/Foomatic-PPD carries a line +reading + + *cupsFilter: "application/vnd.cups-postscript 0 cupsomatic" + +This line persuades CUPS to hand the file to cupsomatic, once it +has successfully converted it to the MIME type +"application/vnd.cups-postscript". This conversion will not +happen for Jobs arriving from Windows which are autotyped +"application/octet-stream", with the according changes in +"/etc/cups/mime.types" in place. + +See small drawings at the end... + +I am not a programmer, so please correct me if I am wrong. + + > With traditional lpr, you can just add "-oraw" to the "print command" + > line in smb.conf. With cups, you don't have that alternative. + +You *do* have it, I think. + +But you need to disable the settings "printing = cups" and "printcap = += cups" and use "printing = bsd" and "printcap = /etc/printcap" +instead. [Additionally, you will probably have to enable and configure +the CUPS mini-LPD daemon ("cups-lpd") run from inetd... but I have not +checked, so take this item with a grain of salt and a proper dose of +caution, please.] + + > The result is that to support both unix printing and native-driver + > Windows printing from CUPS, you have to have two logical printers per + > physical printer: one ("cooked") for Unix clients and one ("raw") for + > Samba to use. + +Yes, that is one current workaround, if you don't want the auto-typing +of CUPS influencing Samba/Windows client PostScript jobs. + +CUPS is widely configurable and flexible, even regarding its filtering +mechanism. Another workaround in some situations would be to have +lines in "/etc/cups/mime.types" saying + + application/postscript application/vnd.cups-raw 0 - + application/vnd.cups-postscript application/vnd.cups-raw 0 - + +This would prevent all Postscript files to be filtered (or rather, they +will go thru the virtual "nullfilter" denoted with "-". (This could only +be useful for PS printers, or if you want to print PS code on non-PS +printers ;-) + +A single line of + + */* application/vnd.cups-raw 0 - + +would effectively send *all* files towards the backend immediately +(good luck!) + +Last, you could have the following (without the need for a Samba +patch): + + application/vnd.cups-postscript application/vnd.cups-raw 0 my_PJL_stripping_filter + +You'd need to write a "my_PJL_stripping_filter" (could be a shellscript) +which parses the PostScript and removes the undesired PJL. This would +need to conform to CUPS filter design (mainly, receive and pass the +parameters printername, job-id, username, jobtitle, copies, printoptions +and possibly the filename). It would just go as world executably into +"/usr/lib/cups/filters/" and work from there, called by cups if it +encounters a MIME type "application/vnd.cups-postscript" + + > The attached patch allows you to specify an option string for cups + > printers in smb.conf. + +I think your patch is in any case very useful (if it works as +advertised ;-). It is the most generic, simple and flexible +approach to complement CUPS. + + > So, if you want to use native Windows drivers, + > all you need is + > + > cups printer options = raw + > + > in smb.conf. You can add any other options that cups and the printer + > understand. + +Now this last sentence makes me very curious. Do you mean you can add +*multiple* options to this directive? Which syntax would be required +for this ? (Some CUPS options are specified by an "-o option=value" +pair on the commandline, some are single values, like the "-o raw" +one...) + +I am thinking on one specific usage now: + +----------------------------------------------------------------------- +-> passing any available IPP job attribute to the printer / the spooler +----------------------------------------------------------------------- + +For example, CUPS can handle "-o job-hold-until=indefinite". This +keeps the job in the queue "on hold". It will only be printed upon +manual release by the printer operator. This is a requirement in +many "central reproduction departments", where a few operators +manage the jobs of hundreds of users on some big machine, where no +user is allowed to have direct access. (The operators often need to +load the proper paper type before running the 10.000 page job +requested by marketing for the mailing, etc.). + +A lot more useful applications come to mind, if I could pass +"any other options that cups and the printer understand" via +the smb.conf directive!! + +Thanks a lot! + +Cheers, +Kurt + +P.S.: List, please give me some feedback, if you think this type of + explanation could be useful in the Samba HOWTO Collection. In + that case, I'll try to write it up in a nicer form. + + +######################################################################### +# +# CUPS in and of itself has this (general) filter chain (CAPITAL +# letters are FILE-FORMATS or MIME types, other are filters (this is +# true for pre-1.1.15 of pre-4.3 versions of CUPS and ESP PrintPro): +# +# <SOMETHNG>-FILEFORMAT +# | +# | +# V +# <something>tops +# | +# | +# V +# APPLICATION/POSTSCRIPT +# | +# | +# V +# pstops +# | +# | +# V +# APPLICATION/VND.CUPS-POSTSCRIPT +# | +# | +# V +# pstoraster # as shipped with CUPS, independent from any Ghostscipt +# | # installation on the system +# | (= "postscipt interpreter") +# | +# V +# APPLICATION/VND.CUPS-RASTER +# | +# | +# V +# rasterto<something> (f.e. Gimp-Print filters may be plugged in here) +# | (= "raster driver") +# | +# V +# SOMETHING-DEVICE-SPECIFIC +# | +# | +# V +# backend +# +# +# ESP PrintPro has some enhanced "rasterto<something>" filters as compared to +# CUPS, and also a somewhat improved "pstoraster" filter. +# +# NOTE: Gimp-Print and some other 3rd-Party-Filters (like TurboPrint) to +# CUPS and ESP PrintPro plug-in where rasterto<something> is noted. +# +# +######################################################################### +# +# This is how "cupsomatic" comes into play: +# ========================================= +# +# <SOMETHNG>-FILEFORMAT +# | +# | +# V +# <something>tops +# | +# | +# V +# APPLICATION/POSTSCRIPT +# | +# | +# V +# pstops +# | +# | +# V +# APPLICATION/VND.CUPS-POSTSCRIPT ----------------+ +# | | +# | V +# V cupsomatic +# pstoraster (constructs complicated +# | (= "postscipt interpreter") Ghostscript commandline +# | to let the file be +# V processed by a +# APPLICATION/VND.CUPS-RASTER "-sDEVICE=<s.th.>" +# | call...) +# | | +# V | +# rasterto<something> V +# | (= "raster driver") +-------------------------+ +# | | Ghostscript at work.... | +# V | | +# SOMETHING-DEVICE-SPECIFIC *-------------------------+ +# | | +# | | +# V | +# backend <------------------------------------+ +# | +# | +# V +# THE PRINTER +# +# +# +# Note, that cupsomatic "kidnaps" the printfile after the +# "APPLICATION/VND.CUPS-POSTSCRPT" stage and deviates it through +# the CUPS-external, systemwide Ghostscript installation, bypassing the +# "pstoraster" filter (therefor also bypassing the CUPS-raster-drivers +# "rasterto<something>", and hands the rasterized file directly to the CUPS +# backend... +# +# cupsomatic is not made by the CUPS developers. It is an independent +# contribution to printing development, made by people from +# Linuxprinting.org. (see also http://www.cups.org/cups-help.html) +# +# NOTE: Gimp-Print and some other 3rd-Party-Filters (like TurboPrint) to +# CUPS and ESP PrintPro plug-in where rasterto<something> is noted. +# +# +######################################################################### +# +# And this is how it works for ESP PrintPro from 4.3: +# =================================================== +# +# <SOMETHNG>-FILEFORMAT +# | +# | +# V +# <something>tops +# | +# | +# V +# APPLICATION/POSTSCRIPT +# | +# | +# V +# pstops +# | +# | +# V +# APPLICATION/VND.CUPS-POSTSCRIPT +# | +# | +# V +# gsrip +# | (= "postscipt interpreter") +# | +# V +# APPLICATION/VND.CUPS-RASTER +# | +# | +# V +# rasterto<something> (f.e. Gimp-Print filters may be plugged in here) +# | (= "raster driver") +# | +# V +# SOMETHING-DEVICE-SPECIFIC +# | +# | +# V +# backend +# +# NOTE: Gimp-Print and some other 3rd-Party-Filters (like TurboPrint) to +# CUPS and ESP PrintPro plug-in where rasterto<something> is noted. +# +# +######################################################################### +# +# This is how "cupsomatic" would come into play with ESP PrintPro: +# ================================================================ +# +# +# <SOMETHNG>-FILEFORMAT +# | +# | +# V +# <something>tops +# | +# | +# V +# APPLICATION/POSTSCRIPT +# | +# | +# V +# pstops +# | +# | +# V +# APPLICATION/VND.CUPS-POSTSCRIPT ----------------+ +# | | +# | V +# V cupsomatic +# gsrip (constructs complicated +# | (= "postscipt interpreter") Ghostscript commandline +# | to let the file be +# V processed by a +# APPLICATION/VND.CUPS-RASTER "-sDEVICE=<s.th.>" +# | call...) +# | | +# V | +# rasterto<something> V +# | (= "raster driver") +-------------------------+ +# | | Ghostscript at work.... | +# V | | +# SOMETHING-DEVICE-SPECIFIC *-------------------------+ +# | | +# | | +# V | +# backend <------------------------------------+ +# | +# | +# V +# THE PRINTER +# +# NOTE: Gimp-Print and some other 3rd-Party-Filters (like TurboPrint) to +# CUPS and ESP PrintPro plug-in where rasterto<something> is noted. +# +######################################################################### +# +# And this is how it works for CUPS from 1.1.15: +# ============================================== +# +# <SOMETHNG>-FILEFORMAT +# | +# | +# V +# <something>tops +# | +# | +# V +# APPLICATION/POSTSCRIPT +# | +# | +# V +# pstops +# | +# | +# V +# APPLICATION/VND.CUPS-POSTSCRIPT-----+ +# | +# +------------------v------------------------------+ +# | Ghostscript | +# | at work... | +# | (with | +# | "-sDEVICE=cups") | +# | | +# | (= "postscipt interpreter") | +# | | +# +------------------v------------------------------+ +# | +# | +# APPLICATION/VND.CUPS-RASTER <-------+ +# | +# | +# V +# rasterto<something> +# | (= "raster driver") +# | +# V +# SOMETHING-DEVICE-SPECIFIC +# | +# | +# V +# backend +# +# +# NOTE: since version 1.1.15 CUPS "outsourced" the pstoraster process to +# Ghostscript. GNU Ghostscript needs to be patched to handle the +# CUPS requirement; ESP Ghostscript has this builtin. In any case, +# "gs -h" needs to show up a "cups" device. pstoraster is now a +# calling an appropriate "gs -sDEVICE=cups..." commandline to do +# the job. It will output "application/vnd.cup-raster", which will +# be finally processed by a CUPS raster driver "rasterto<something>" +# Note the difference to "cupsomatic", which will *not* output +# CUPS-raster, but a final version of the printfile, ready to be +# sent to the printer. cupsomatic also doesn't use the "cups" +# devicemode in Ghostscript, but one of the classical devicemodes.... +# +# NOTE: Gimp-Print and some other 3rd-Party-Filters (like TurboPrint) to +# CUPS and ESP PrintPro plug-in where rasterto<something> is noted. +# +######################################################################### +# +# And this is how it works for CUPS from 1.1.15, with cupsomatic included: +# ======================================================================== +# +# <SOMETHNG>-FILEFORMAT +# | +# | +# V +# <something>tops +# | +# | +# V +# APPLICATION/POSTSCRIPT +# | +# | +# V +# pstops +# | +# | +# V +# APPLICATION/VND.CUPS-POSTSCRIPT-----+ +# | +# +------------------v------------------------------+ +# | Ghostscript . Ghostscript at work.... | +# | at work... . (with "-sDEVICE= | +# | (with . <s.th.>" | +# | "-sDEVICE=cups") . | +# | . | +# | (CUPS standard) . (cupsomatic) | +# | . | +# | (= "postscript interpreter") | +# | . | +# +------------------v--------------v---------------+ +# | | +# | | +# APPLICATION/VND.CUPS-RASTER <-------+ | +# | | +# | | +# V | +# rasterto<something> | +# | (= "raster driver") | +# | | +# V | +# SOMETHING-DEVICE-SPECIFIC <------------------------+ +# | +# | +# V +# backend +# +# +# NOTE: Gimp-Print and some other 3rd-Party-Filters (like TurboPrint) to +# CUPS and ESP PrintPro plug-in where rasterto<something> is noted. +# +########################################################################## + +I hope this helps more people understand how CUPS works and how they +can possibly tweak it to their needs. + + diff --git a/examples/VFS/README.OtherModules b/examples/VFS/README.OtherModules new file mode 100644 index 0000000000..02dced6158 --- /dev/null +++ b/examples/VFS/README.OtherModules @@ -0,0 +1,39 @@ +This file contains a listing of various other VFS modules that +have been posted but don't currently reside in the Samba CVS +tree for one reason ot another (e.g. it is easy for the maintainer +to have his or her own CVS tree). + +No statemets about the stability or functionality any module +should be implied due to its presence here. + + +------------------------------------------------------------ +Date: Sat, 28 Sep 2002 23:41:31 -0500 +From: Eric Lorimer <elorimer@css.tayloru.edu> +To: samba-technical@lists.samba.org +Subject: DatabaseFS VFS module + +Hello, + +I have created a VFS module which implements a fairly complete read-only +filesystem. It presents information from a database as a filesystem in +a modular and generic way to allow different databases to be used +(originally designed for organizing MP3s under directories such as +"Artists," "Song Keywords," etc... I have since applied it to a student +roster database very easily). The directory structure is stored in the +database itself and the module makes no assumptions about the database +structure beyond the table it requires to run. You can find it at: + +http://www.css.tayloru.edu/~elorimer/databasefs/index.php + + +Any feedback would be appreciated: comments, suggestions, patches, +etc... If nothing else, hopefully it might prove useful for someone +else who wishes to create a virtual filesystem. + +Thanks for the great product and keep up the good work. + + +- Eric Lorimer + +------------------------------------------------------------ diff --git a/source3/libads/ads_ldap.c b/source3/libads/ads_ldap.c new file mode 100644 index 0000000000..05b016539e --- /dev/null +++ b/source3/libads/ads_ldap.c @@ -0,0 +1,145 @@ +/* + Unix SMB/CIFS implementation. + + Winbind ADS backend functions + + Copyright (C) Andrew Tridgell 2001 + Copyright (C) Andrew Bartlett 2002 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" +#ifdef HAVE_LDAP + +/* convert a single name to a sid in a domain */ +NTSTATUS ads_name_to_sid(ADS_STRUCT *ads, + const char *name, + DOM_SID *sid, + enum SID_NAME_USE *type) +{ + const char *attrs[] = {"objectSid", "sAMAccountType", NULL}; + int count; + ADS_STATUS rc; + void *res = NULL; + char *exp; + uint32 t; + NTSTATUS status = NT_STATUS_UNSUCCESSFUL; + + if (asprintf(&exp, "(|(sAMAccountName=%s)(userPrincipalName=%s@%s))", + name, name, ads->config.realm) == -1) { + DEBUG(1,("ads_name_to_sid: asprintf failed!\n")); + status = NT_STATUS_NO_MEMORY; + goto done; + } + + rc = ads_search_retry(ads, &res, exp, attrs); + free(exp); + if (!ADS_ERR_OK(rc)) { + DEBUG(1,("name_to_sid ads_search: %s\n", ads_errstr(rc))); + goto done; + } + + count = ads_count_replies(ads, res); + if (count != 1) { + DEBUG(1,("name_to_sid: %s not found\n", name)); + goto done; + } + + if (!ads_pull_sid(ads, res, "objectSid", sid)) { + DEBUG(1,("No sid for %s !?\n", name)); + goto done; + } + + if (!ads_pull_uint32(ads, res, "sAMAccountType", &t)) { + DEBUG(1,("No sAMAccountType for %s !?\n", name)); + goto done; + } + + *type = ads_atype_map(t); + + status = NT_STATUS_OK; + + DEBUG(3,("ads name_to_sid mapped %s\n", name)); + +done: + if (res) ads_msgfree(ads, res); + + return status; +} + +/* convert a sid to a user or group name */ +NTSTATUS ads_sid_to_name(ADS_STRUCT *ads, + TALLOC_CTX *mem_ctx, + const DOM_SID *sid, + char **name, + enum SID_NAME_USE *type) +{ + const char *attrs[] = {"userPrincipalName", + "sAMAccountName", + "sAMAccountType", NULL}; + ADS_STATUS rc; + void *msg = NULL; + char *exp = NULL; + char *sidstr = NULL; + uint32 atype; + NTSTATUS status = NT_STATUS_UNSUCCESSFUL; + + if (!(sidstr = sid_binstring(sid))) { + DEBUG(1,("ads_sid_to_name: sid_binstring failed!\n")); + status = NT_STATUS_NO_MEMORY; + goto done; + } + + if (asprintf(&exp, "(objectSid=%s)", sidstr) == -1) { + DEBUG(1,("ads_sid_to_name: asprintf failed!\n")); + status = NT_STATUS_NO_MEMORY; + goto done; + } + + rc = ads_search_retry(ads, &msg, exp, attrs); + if (!ADS_ERR_OK(rc)) { + status = ads_ntstatus(rc); + DEBUG(1,("ads_sid_to_name ads_search: %s\n", ads_errstr(rc))); + goto done; + } + + if (!ads_pull_uint32(ads, msg, "sAMAccountType", &atype)) { + goto done; + } + + *name = ads_pull_username(ads, mem_ctx, msg); + if (!*name) { + DEBUG(1,("ads_sid_to_name: ads_pull_username retuned NULL!\n")); + status = NT_STATUS_NO_MEMORY; + goto done; + } + + *type = ads_atype_map(atype); + + status = NT_STATUS_OK; + + DEBUG(3,("ads sid_to_name mapped %s\n", *name)); + +done: + if (msg) ads_msgfree(ads, msg); + + SAFE_FREE(exp); + SAFE_FREE(sidstr); + + return status; +} + +#endif diff --git a/source3/libads/ldap_utils.c b/source3/libads/ldap_utils.c new file mode 100644 index 0000000000..907f7c8aff --- /dev/null +++ b/source3/libads/ldap_utils.c @@ -0,0 +1,96 @@ +/* + Unix SMB/CIFS implementation. + + Some Helpful wrappers on LDAP + + Copyright (C) Andrew Tridgell 2001 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +#ifdef HAVE_LDAP +/* + a wrapper around ldap_search_s that retries depending on the error code + this is supposed to catch dropped connections and auto-reconnect +*/ +ADS_STATUS ads_do_search_retry(ADS_STRUCT *ads, const char *bind_path, int scope, + const char *exp, + const char **attrs, void **res) +{ + ADS_STATUS status; + int count = 3; + char *bp; + + if (!ads->ld && + time(NULL) - ads->last_attempt < ADS_RECONNECT_TIME) { + return ADS_ERROR(LDAP_SERVER_DOWN); + } + + bp = strdup(bind_path); + + if (!bp) + return ADS_ERROR_NT(NT_STATUS_NO_MEMORY); + + while (count--) { + status = ads_do_search_all(ads, bp, scope, exp, attrs, res); + if (ADS_ERR_OK(status)) { + DEBUG(5,("Search for %s gave %d replies\n", + exp, ads_count_replies(ads, *res))); + free(bp); + return status; + } + + if (*res) ads_msgfree(ads, *res); + *res = NULL; + DEBUG(3,("Reopening ads connection to realm '%s' after error %s\n", + ads->config.realm, ads_errstr(status))); + if (ads->ld) { + ldap_unbind(ads->ld); + } + ads->ld = NULL; + status = ads_connect(ads); + if (!ADS_ERR_OK(status)) { + DEBUG(1,("ads_search_retry: failed to reconnect (%s)\n", + ads_errstr(status))); + ads_destroy(&ads); + free(bp); + return status; + } + } + free(bp); + + DEBUG(1,("ads reopen failed after error %s\n", ads_errstr(status))); + return status; +} + + +ADS_STATUS ads_search_retry(ADS_STRUCT *ads, void **res, + const char *exp, + const char **attrs) +{ + return ads_do_search_retry(ads, ads->config.bind_path, LDAP_SCOPE_SUBTREE, + exp, attrs, res); +} + +ADS_STATUS ads_search_retry_dn(ADS_STRUCT *ads, void **res, + const char *dn, + const char **attrs) +{ + return ads_do_search_retry(ads, dn, LDAP_SCOPE_BASE, + "(objectclass=*)", attrs, res); +} +#endif diff --git a/source3/script/creategroup b/source3/script/creategroup new file mode 100755 index 0000000000..01fb065944 --- /dev/null +++ b/source3/script/creategroup @@ -0,0 +1,27 @@ +#!/bin/sh + +# Example script for 'add group command'. Handle weird NT group +# names. First attempt to create the group directly, if that fails +# then create a random group and print the numeric group id. +# +# Note that this is only an example and assumes /dev/urandom. +# +# Volker + +GROUPNAME="$1" +ITERS=0 + +while ! /usr/sbin/groupadd "$GROUPNAME" > /dev/null 2>&1 +do + # we had difficulties creating that group. Maybe the name was + # too weird, or it already existed. Create a random name. + GROUPNAME=nt-$(dd if=/dev/urandom bs=16 count=1 2>/dev/null | md5sum | cut -b 1-5) + ITERS=$(expr "$ITERS" + 1) + if [ "$ITERS" -gt 10 ] + then + # Too many attempts + exit 1 + fi +done + +getent group | grep ^"$GROUPNAME": | cut -d : -f 3 |